OnCollisionEnter和OnTriggerEnter

Posted jyddpen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OnCollisionEnter和OnTriggerEnter相关的知识,希望对你有一定的参考价值。

之前对这两个的用法不是特别清楚,重新学习了下,再做个测试看看效果如何;

1.新建一个场景test

2.添加一个cube,点击Inspector面板会发现系统已经默认添加了Box collisder组件。为了增加速度,需添加一个RigidBody,同时去除重力。

3.再添加一个Capsule。

材质用于cube和capsule,以便观察;

5.新建一个角色的控制脚本PlayerController.CS,完成后挂载到Cube上

 1 /***
 2  * 
 3  * 作用:控制脚本的移动和旋转
 4  * 
 5  * 
 6  * 
 7  */
 8 using System.Collections;
 9 using System.Collections.Generic;
10 using UnityEngine;
11 
12 public class PlayerController : MonoBehaviour {
13     //移动速度
14     public float FloMovePower=1.0f;
15     //旋转速度
16     public float FloRotatePower=1.0f;
17     void Update () {
18         //获取横向偏移值(按键盘A和D时,得到-1到1之间的浮点型值)
19         float floHorizontal=Input.GetAxis("Horizontal");
20         //获取纵向偏移值(按键盘W和S时,得到-1到1之间的浮点型值)
21         float floVertical=Input.GetAxis("Vertical");
22         //给角色增加位置的速度
23         this.GetComponent<Rigidbody> ().velocity = this.transform.forward * floVertical*FloMovePower;
24         //给角色增加旋转的速度
25         this.GetComponent<Rigidbody> ().angularVelocity = this.transform.up * floHorizontal * FloRotatePower;
26     }
27 }

6.再新建一个脚本CollisionTest.CS用于碰撞检测,完成后挂载到Capsule上。

 1 /***
 2  * 
 3  * 
 4  * 用于碰撞检测
 5  * 
 6  * 
 7  */
 8 using System.Collections;
 9 using System.Collections.Generic;
10 using UnityEngine;
11 
12 public class CollisionTest : MonoBehaviour {
13     void OnCollisionEnter(Collision col)
14     {
15         print("OnCollisionEnter");
16         print("Collision‘s name is "+col.gameObject.name);
17     }
18     void OnCollisionStay(Collision col)
19     {
20         print("OnCollisionStay");
21         print("Collision‘s name is "+col.gameObject.name);
22     }
23     void OnCollisionExit(Collision col)
24     {
25         print("OnCollisionExit");
26         print("Collision‘s name is "+col.gameObject.name);
27     }
28 
29 }

7.开始运行,移动cube到capsule,看下print结果

技术图片

技术图片

可以看出,立方体碰到胶囊体发生碰撞检测,但是两者没法穿透。

8.同理,为测试穿透效果,对胶囊体的碰撞器添加一个触发器(将属性面板的Is Tigger打钩)

再运行刚才的代码发现,OnCollsionEnter已经失效。再增加触发器的检测代码,修改后的CollisionTest.CS如下:

 1 /***
 2  * 
 3  * 
 4  * 用于碰撞检测
 5  * 
 6  * 
 7  */
 8 using System.Collections;
 9 using System.Collections.Generic;
10 using UnityEngine;
11 
12 public class CollisionTest : MonoBehaviour {
13     void OnCollisionEnter(Collision col)
14     {
15         print("OnCollisionEnter");
16         print("Collision‘s name is "+col.gameObject.name);
17     }
18     void OnCollisionStay(Collision col)
19     {
20         print("OnCollisionStay");
21         print("Collision‘s name is "+col.gameObject.name);
22     }
23     void OnCollisionExit(Collision col)
24     {
25         print("OnCollisionExit");
26         print("Collision‘s name is "+col.gameObject.name);
27     }
28     void OnTriggerEnter(Collider col)
29     {
30         print("OnTriggerEnter");
31         print("Collider‘s name is "+col.name);
32     }
33 }

再点击运行,结果发现两个游戏对象可以发生穿透,控制台也打印出结果;

技术图片

技术图片

以上一点点学习经验,还要继续努力,加油!

 

以上是关于OnCollisionEnter和OnTriggerEnter的主要内容,如果未能解决你的问题,请参考以下文章

OnCollisionEnter和OnTriggerEnter

OnCollisionEnter2D 发送信息失败

日常记录unity3d OnTriggerEnter 和 OnCollisionEnter (2D) 的区别

Unity3d中 OnTriggerEnter(Collider other) 和OnCollisionEnter(Collision other)对比

OncollisionEnter2D 不工作,但 OnTriggerEnter2D 工作正常

Unity3d碰撞体刚体OnTriggerEnter和OnCollisionEnter用法与区别