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 }

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

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

原文地址:https://www.cnblogs.com/fengjiulin110120/p/6710630.html