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 }

再點擊運行,結果發現兩個游戲對象可以發生穿透,控制台也打印出結果;

以上一點點學習經驗,還要繼續努力,加油!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM