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 }
注意:回调方法不能通过索引来获取,所以在使用方法的时候要检查是否正确,
当然也可以通过自己添加索引器来实现索引功能;