• collider碰撞器


    Collider组件的主要功能是来进行碰撞检测;

    Rigibody: 刚体;

    Collider: 碰撞器;

    对于同一个物体,要么通过刚体来操纵,那么通过变换(transform)操纵,不能同时使用刚体和变换来操纵!

    碰撞发生的条件:

           ①.发生碰撞的两个或者多个物体都必须带有Collider(碰撞器);

           ②.发生碰撞的两个或者多个物体至少有一个带有Rigiboby(刚体);

           ③.发生碰撞的两个或者多个物体必须有相对运动(相对位移);

    碰撞的回调方法:

     1 // 碰撞的一瞬间,调用该方法
     2 void OnCllisionEnter(Collision other){    //代入的参数为被碰撞信息;
     3     // 方法体,碰撞做的事情
     4 }
     5 //  一直碰撞,调用该方法
     6 void OnCllisionStay(Collision other){    //代入的参数为被碰撞信息;
     7    // 方法体,一直碰撞做的事情
     8 }
     9 //  碰撞解释,调用该方法
    10 void OnCllisionExit(Collision other){    //代入的参数为被碰撞信息;
    11    // 方法体,碰撞结束做的事情
    12 }
     
    例: 使物体可以通过键盘控制,在碰撞的一瞬间被碰撞体变为红色,持续碰撞为绿色,碰撞结束为黄色;
          ①.使用Inpu()方法;
          ②.使用碰撞回调;
          ③.全部碰撞完以后按空格(spece)被碰撞物变为黑色;(使用委托调用)
     

    脚本1:

     1 public float speed;    // 外联一个速度值
     2 public delegate void CubeDelegate;    //定义一个委托
     3 public event CubeDelegate cubeEvent;   // 定义一个事件;    在Update中调用事件
     4 // 通过WSAD来控制游戏对象的移动,一般写在Update()里面;
     5 void Update(){  
     6     // 获得水平方向:
     7     float hor=Input.GetAxis("Horizontal");
     8     // 获得垂直方向
     9     float ver=Input.GetAxis("Vertical")
    10     
    11    // transform.forward 是本地坐标的Z轴正方向;
    12    transform.position+=transform.forward*speed*Time.deltaTime*ver;
    13    // transform.right  是本地坐标的X轴的正方向
    14    transform.position+=transform.right*speed*Time.deltaTime*hor;
    15    if(Input.GetKeyDown(Keycode.space)){      // 判断按键是否使用了space来调用该事件
    16         // 调用事件
    17          cubeEvent();
    18       }
    19 }
    20 void OnCollisionEnter(Collision other){    // 碰撞开始一瞬间,调用该事件;
    21     
    22     // 判断该物体的tag
    23   if(other.gameObject != "PlanTag"){
    24           
    25       // 判断成立,那么调用改变颜色的方法:
    26      other.gameObject.GetComponent<Renderer>().material.color=Color.red;    //碰撞的一瞬间被碰撞的物体变红
    27           
    28       // 获取脚本组件;
    29       ColorChangeScript scr=other.gameObject.GetComponent<Renderer>().material.color=Color.black;
    30       
    31       // 注册脚本2方法:
    32       cuberEvent+=scr.ColorChange;
    33       }
    34 }
    35  void OnCollisionStay(Collision other){    // 一直碰撞,调用该事件;
    36     
    37     // 判断该物体的tag
    38   if(other.gameObject != "PlanTag"){
    39           
    40     // 判断成立,那么调用改变颜色的方法:
    41      other.gameObject.GetComponent<Renderer>().material.color=Color.green;    //碰撞的一瞬间被碰撞的物体变绿
    42           
    43       }
    44 }
    45 void OnCollisionExit(Collision other){    // 结束碰撞,调用该事件;
    46     
    47     // 判断该物体的tag
    48   if(other.gameObject != "PlanTag"){
    49           
    50     // 判断成立,那么调用改变颜色的方法:
    51      other.gameObject.GetComponent<Renderer>().material.color=Color.yellow;    //碰撞的一瞬间被碰撞的物体变黄
    52           
    53       }
    54
    Collision和collider区别:
          Collision: 碰撞信息;
          collider:  碰撞体;
     
    关于第三问,在这里可以用委托重新写一个脚本,在脚本1中调用事件:
     
    脚本2:  
    1 public class ColorChangeScript:MonoBehaviour{
    2 // 为了便于在脚本1中调用,所以这里使用public;
    3 public void ColorChange(){
    4 // 颜色变为黑色
    5 gameObject.GetComponent<Renderer>().material.color=Color.blcak;
    6       }
    7 }

     注意:回调方法不能通过索引来获取,所以在使用方法的时候要检查是否正确,

            当然也可以通过自己添加索引器来实现索引功能;

  • 相关阅读:
    jumperserver3.0的安装部署
    zookeeper3.4.6配置实现自动清理日志
    因为修改linux selinux修改错误产生的问题及解决办法
    修改linux系统编码
    linux如何连接移动硬盘
    调整linux系统时区
    关于公司夫妻档的事情
    hive将数据导致本地磁盘
    shell如何向python传递参数,shell如何接受python的返回值
    关于日志API接口中流量的使用。
  • 原文地址:https://www.cnblogs.com/fengjiulin110120/p/6710630.html
Copyright © 2020-2023  润新知