Unity3D新手教學,讓你十二小時,從入門到掌握!(三 )
這一講,我會教大家如何寫碰撞檢測的程式碼,然後還會教大家如何使用我介紹給大家的第一個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。
聯絡方式:
檢視Aries的個人資料
QQ:531193915
E-Mail:[email protected]