本問轉(zhuǎn)自:http://blog.csdn.net/aries_h/article/details/47703835
這一講,我會(huì)教大家如何寫碰撞檢測(cè)的代碼扎瓶,然后還會(huì)教大家如何使用我介紹給大家的第一個(gè)Unity的插件所踊。 那么,廢話不多說概荷,我先介紹插件如何下載和安裝污筷。
VS For Unity 下載鏈接
進(jìn)入這個(gè)頁面,按編譯器版本進(jìn)行下載,我用的是2010瓣蛀,所以要下載這個(gè)。
這里寫圖片描述
安裝就不用我教了雷厂,下面開始看我是如何導(dǎo)入U(xiǎn)nity VS的惋增。
這里寫圖片描述
這里寫圖片描述
點(diǎn)擊Import之后我們會(huì)發(fā)現(xiàn)并沒有發(fā)生什么,但是接下來我們按一下刷新的快捷鍵:Ctrl+F(F:Flush)就會(huì)看到上面多出來一個(gè)東西改鲫。 點(diǎn)擊Open以后就會(huì)自動(dòng)打開VS了诈皿。
這里寫圖片描述
OK,插件安裝完畢像棘,接下來教大家如何做碰撞檢測(cè)稽亏。
發(fā)生碰撞需要兩個(gè)條件,碰撞體要一個(gè)具有剛體缕题,一個(gè)具有碰撞器截歉。
上一講我們已經(jīng)為Cube添加了碰撞器,并且選擇了Is Trigger的觸發(fā)器烟零,那么我們現(xiàn)在開始編寫碰撞檢測(cè)的代碼瘪松。
在Scripts文件夾下新建一個(gè)名為PlayerCollision的C#腳本。
在寫代碼之前锨阿,我要介紹一下碰撞檢測(cè)有好多種: OnTriggerEnter( Collider other )當(dāng)進(jìn)入觸發(fā)器 OnTriggerExit( Collider other )當(dāng)退出觸發(fā)器 OnTriggerStay( Collider other )當(dāng)逗留觸發(fā)器 OnCollisionEnter( Collision collisionInfo ) 當(dāng)進(jìn)入碰撞器 OnCollisionExit( Collision collisionInfo ) 當(dāng)退出碰撞器 OnCollisionStay( Collision collisionInfo ) 當(dāng)逗留碰撞器
以上這六個(gè)方法都是MonoBehaviour里面的宵睦,因?yàn)槲覀兊哪_本都是繼承的MonoBehaviour這個(gè)類。所以我們的腳本里面可以覆蓋這六個(gè)方法墅诡。
因?yàn)槲覀児催x了Is Trigger壳嚎,所以,我們覆蓋OnTriggerEnter( Collider other )方法:
//當(dāng)進(jìn)入碰撞器的方法
public void OnTriggerEnter(Collider other)
{
//如果碰撞的GameObject不是Floor
if(!other.gameObject.name.Equals("Floor"))
{
print("報(bào)告主人:觸發(fā)器成功觸發(fā)末早!");
}
}
然后烟馅,將這段代碼托給Player,運(yùn)行游戲荐吉。
這里寫圖片描述
如圖所示焙糟,碰撞的確發(fā)生了,但是Player卻穿過了Cube样屠。 這并不是一個(gè)好現(xiàn)象4┐椤!痪欲! 那么悦穿,我們換另一個(gè)方法,將碰撞器的Is Trigger取消业踢。 然后再將代碼改為:
public void OnCollisionEnter(Collision other)
{
//如果碰撞的GameObject不是Floor
if (!other.gameObject.name.Equals("Floor"))
{
print("報(bào)告主人:觸發(fā)器成功觸發(fā)栗柒!");
}
}
這里寫圖片描述
那么,這時(shí)候可能有人會(huì)問我,剛開始我導(dǎo)入的插件又有什么用呢瞬沦?
現(xiàn)在我給大家介紹一下太伊,我最喜換這個(gè)插件其中的一個(gè)最喜歡的功能!
在VS里編輯代碼的時(shí)候逛钻,我們按下快捷鍵Ctrl+Shift+Q會(huì)彈出一個(gè)框框僚焦。
這里包括了我們繼承了MonoBehaviour里面的所有的類。
我們?cè)诶锩孑斎隣n為示范曙痘,他會(huì)自動(dòng)為我們索引出一切有關(guān)On的方法:
這里寫圖片描述
是不是很好用呢芳悲?
那么現(xiàn)在我們碰撞檢測(cè)可以實(shí)現(xiàn)了,我們應(yīng)該怎么實(shí)現(xiàn)落在Cube上的時(shí)候使Cube停止運(yùn)動(dòng)呢边坤?
隨便問一個(gè)不懂編程的人都會(huì)說名扛,讓他不能動(dòng)不就動(dòng)不了了。
對(duì)啊茧痒,我們將Cube運(yùn)動(dòng)的代碼取消不就不能運(yùn)動(dòng)了肮韧,那么我們?cè)?strong>如何在游戲運(yùn)行的時(shí)候取消Cube運(yùn)動(dòng)的代碼呢?
我們將LeftCube移動(dòng)到Floor前面文黎。只要在發(fā)生碰撞的時(shí)候我們這么寫:
public void OnCollisionEnter(Collision other)
{
//定義一個(gè)字符串
string CollisionName;
//如果碰撞的GameObject不是Floor
if (!other.gameObject.name.Equals("Floor"))
{
//將碰撞體的名字存在字符串中
CollisionName = other.gameObject.name;
//如果碰撞體的名字是LeftCube
if(CollisionName.Equals("LeftCube"))
{
//獲取LeftCube身上的LeftCubeMove腳本惹苗,并切取消此代碼的執(zhí)行。
other.gameObject.GetComponent<LeftCubeMove>().enabled = false;
}
}
}
這時(shí)我們?cè)龠\(yùn)行游戲耸峭,并使Player與LeftCube發(fā)生碰撞.:
這里寫圖片描述
可以看到桩蓉,在碰撞的一瞬間,Cube不移動(dòng)了劳闹,并且右邊LeftCubeMove的腳本被取消了院究。
這樣我們是否就可以做到落在Cube上就停止他的運(yùn)動(dòng)了呢?
并不然本涕!
我們總不能每發(fā)生碰撞都判斷一下碰撞體的名稱然后再進(jìn)行取消腳本吧业汰。
還記得在第二講我曾經(jīng)說過:(總不會(huì)寫兩個(gè)吧?向左一個(gè)單獨(dú)的代碼菩颖,向右一個(gè)單獨(dú)的代碼样漆?)
現(xiàn)在,我來解決這個(gè)問題晦闰。
馬上新建一個(gè)命為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"))
{
//執(zhí)行移動(dòng)方法
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();
}
}
//定義移動(dòng)方法
void MoveLeft()
{
//使Cube的移動(dòng)速度遞增
Speed += 0.1f;
//移動(dòng)
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);
}
}
這樣,我們所有可經(jīng)過的Cube就都可以公用一個(gè)腳本了呻右。
我們將所有Cube單獨(dú)控制移動(dòng)的代碼都取消掉跪妥,然后將CubeMove的腳本托給所有Cube,別忘了StaticCube也要給声滥。
然后我們修改一下PlayerCollision腳本的代碼:
//當(dāng)進(jìn)入碰撞器的方法
public void OnCollisionEnter(Collision other)
{
//如果碰撞的GameObject不是Floor
if (!other.gameObject.name.Equals("Floor"))
{
//取消碰撞體上的CubeMove方法
other.gameObject.GetComponent<CubeMove>().enabled = false;
}
}
這樣眉撵,我們就可以簡(jiǎn)化代碼,并且便于管理,而且任何人都能看懂你的代碼纽疟!
謝謝的大家的關(guān)注罐韩,那么這一講就到此結(jié)束,下一講我會(huì)講解如何使Player落在Cube上時(shí)出現(xiàn)下一個(gè)Cube污朽。