版權聲明:本文為Aries原創文章,轉載請標明出處。如有不足之處歡迎提出意見或建議,聯系QQ531193915
這一講,我會教大家如何寫碰撞檢測的代碼,然后還會教大家如何使用我介紹給大家的第一個Unity的插件。
那么,廢話不多說,我先介紹插件如何下載和安裝。
進入這個頁面,按編譯器版本進行下載,我用的是2010,所以要下載這個。
安裝就不用我教了,下面開始看我是如何導入Unity VS的。
點擊Import之后我們會發現並沒有發生什么,但是接下來我們按一下刷新的快捷鍵:Ctrl+F(F:Flush)就會看到上面多出來一個東西。
點擊Open以后就會自動打開VS了。
OK,插件安裝完畢,接下來教大家如何做碰撞檢測。
發生碰撞需要兩個條件,碰撞體要一個具有剛體,一個具有碰撞器。
上一講我們已經為Cube添加了碰撞器,並且選擇了Is Trigger的觸發器,那么我們現在開始編寫碰撞檢測的代碼。
在Scripts文件夾下新建一個名為PlayerCollision的C#腳本。
在寫代碼之前,我要介紹一下碰撞檢測有好多種:
OnTriggerEnter( Collider other )當進入觸發器
OnTriggerExit( Collider other )當退出觸發器
OnTriggerStay( Collider other )當逗留觸發器
OnCollisionEnter( Collision collisionInfo ) 當進入碰撞器
OnCollisionExit( Collision collisionInfo ) 當退出碰撞器
OnCollisionStay( Collision collisionInfo ) 當逗留碰撞器
以上這六個方法都是MonoBehaviour里面的,因為我們的腳本都是繼承的MonoBehaviour這個類。所以我們的腳本里面可以覆蓋這六個方法。
因為我們勾選了Is Trigger,所以,我們覆蓋OnTriggerEnter( Collider other )方法:
//當進入碰撞器的方法 public void OnTriggerEnter(Collider other) { //如果碰撞的GameObject不是Floor if(!other.gameObject.name.Equals("Floor")) { print("報告主人:觸發器成功觸發!"); } }
然后,將這段代碼托給Player,運行游戲。
如圖所示,碰撞的確發生了,但是Player卻穿過了Cube。
這並不是一個好現象!!!
那么,我們換另一個方法,將碰撞器的Is Trigger取消。
然后再將代碼改為:
public void OnCollisionEnter(Collision other) { //如果碰撞的GameObject不是Floor if (!other.gameObject.name.Equals("Floor")) { print("報告主人:觸發器成功觸發!"); } }
那么,這時候可能有人會問我,剛開始我導入的插件又有什么用呢?
現在我給大家介紹一下,我最喜換這個插件其中的一個最喜歡的功能!
在VS里編輯代碼的時候,我們按下快捷鍵Ctrl+Shift+Q會彈出一個框框。
這里包括了我們繼承了MonoBehaviour里面的所有的類。
我們在里面輸入On為示范,他會自動為我們索引出一切有關On的方法:
是不是很好用呢?
那么現在我們碰撞檢測可以實現了,我們應該怎么實現落在Cube上的時候使Cube停止運動呢?
隨便問一個不懂編程的人都會說,讓他不能動不就動不了了。
對啊,我們將Cube運動的代碼取消不就不能運動了,那么我們該如何在游戲運行的時候取消Cube運動的代碼呢?
我們將LeftCube移動到Floor前面。只要在發生碰撞的時候我們這么寫:
public void OnCollisionEnter(Collision other) { //定義一個字符串 string CollisionName; //如果碰撞的GameObject不是Floor if (!other.gameObject.name.Equals("Floor")) { //將碰撞體的名字存在字符串中 CollisionName = other.gameObject.name; //如果碰撞體的名字是LeftCube if(CollisionName.Equals("LeftCube")) { //獲取LeftCube身上的LeftCubeMove腳本,並切取消此代碼的執行。 other.gameObject.GetComponent<LeftCubeMove>().enabled = false; } } }
這時我們再運行游戲,並使Player與LeftCube發生碰撞.:
可以看到,在碰撞的一瞬間,Cube不移動了,並且右邊LeftCubeMove的腳本被取消了。
這樣我們是否就可以做到落在Cube上就停止他的運動了呢?
並不然!
我們總不能每發生碰撞都判斷一下碰撞體的名稱然后再進行取消腳本吧。
還記得在第二講我曾經說過:(總不會寫兩個吧?向左一個單獨的代碼,向右一個單獨的代碼?)
現在,我來解決這個問題。
馬上新建一個命為CubeMove的C#腳本。代碼如下:
public class CubeMove : MonoBehaviour { //定義Cube的初始速度 public float Speed = 1f; void Start () { } void Update () { //如果腳本所在模型的名字為LeftCube(Clone)或LeftCube if (this.gameObject.name.Equals("LeftCube(Clone)") || this.gameObject.name.Equals("LeftCube")) { //執行移動方法 MoveLeft(); } if (this.gameObject.name.Equals("RightCube(Clone)") || this.gameObject.name.Equals("RightCube")) { MoveRight(); } if (this.gameObject.name.Equals("StaticCube(Clone)") || this.gameObject.name.Equals("StaticCube")) { MoveStop(); } } //定義移動方法 void MoveLeft() { //使Cube的移動速度遞增 Speed += 0.1f; //移動 this.transform.Translate(Vector3.left * Speed * Time.deltaTime); } void MoveRight() { Speed += 0.1f; this.transform.Translate(Vector3.right * Speed * Time.deltaTime); } void MoveStop() { this.transform.Translate(0,0,0); } }
這樣,我們所有可經過的Cube就都可以公用一個腳本了。
我們將所有Cube單獨控制移動的代碼都取消掉,然后將CubeMove的腳本托給所有Cube,別忘了StaticCube也要給。
然后我們修改一下PlayerCollision腳本的代碼:
//當進入碰撞器的方法 public void OnCollisionEnter(Collision other) { //如果碰撞的GameObject不是Floor if (!other.gameObject.name.Equals("Floor")) { //取消碰撞體上的CubeMove方法 other.gameObject.GetComponent<CubeMove>().enabled = false; } }
這樣,我們就可以簡化代碼,並且便於管理,而且任何人都能看懂你的代碼!
謝謝的大家的關注,那么這一講就到此結束,下一講我會講解如何使Player落在Cube上時出現下一個Cube。