好了,游戲開始進入奇怪的階段了,接下來我們要在場景里放上地雷,終結這個帥氣的BugPlayer吧。
> 笨木頭花心貢獻,啥?花心?不,是用心。
> 轉載請注明,原文地址:[http://www.benmutou.com/archives/2157](http://www.benmutou.com/archives/2157)
> 文章來源:[笨木頭與游戲開發](http://www.benmutou.com/blog/)
### 1.Sphere物體
除了Cube(立方體)之外,我們還可以創建很多種形狀的物體。
這里我們需要做一個地雷,地雷是有一個殺傷范圍的,或者叫做觸發范圍,也就是說,特么的判斷你是否踩到我了。
通常范圍的判斷都是用圓形的,而在3D的世界里,就是一個立體的圓形。
所以,我們需要創建一個球體——Sphere。
和創建Cube的方式一毛一樣:【Hierarchy】-【3D Object】-【Sphere】
如圖:

但是有一個小細節,我們要在Terrain上面點擊右鍵來創建這個物體,這樣物體就創建到地形下面了。
還記得當時創建Cube時的情況嗎?它會跑到世界的某個角落,很難找,所以我們要把它創建到Terrian的角落。
### 2.移動球體到BugPlayer的附近
OK,把球體移動到合適的位置,離BugPlayer近一些。
大家看我的操作,移動物體是有個小技巧的,不需要通過箭頭來移動,而是通過物體的某個“面”來移動。
大家自己感受吧:

### 3.地雷和球體有什么關系?
也許大家覺得很奇怪,地雷為什么要用球體來實現?
這是因為,地雷的技能(自爆)是由外界來觸發的,特么的你踩我了,我這暴脾氣就出來了,這就是自爆。(小若:特么的好有道理)
而觸發某個事件需要觸發器,并且需要一個范圍,剛剛已經解釋了,用球體作為范圍來判斷是否觸發事件,是比較合適的。
當然,你喜歡正方體也行、不規則形狀也行,越復雜的形狀,會越消耗性能。
### 4.觸發器
剛剛我們提到了觸發器,這是[游戲開發](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%D3%CE%CF%B7%BF%AA%B7%A2&k0=%D3%CE%CF%B7%BF%AA%B7%A2&kdi0=0&luki=5&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)里一個很重要的東西。
而Cube、Sphere等物體都是自帶觸發器的,正確地說,是碰撞器。
我們先來看看Sphere的碰撞器,如圖:

碰撞器也是物體的一個[組件](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%D7%E9%BC%FE&k0=%D7%E9%BC%FE&kdi0=0&luki=3&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0),記住,一切都是組件。
Sphere物體的碰撞器就叫做【Sphere Collider】,Cube的碰撞器就叫做【Cube Collider】,只是形狀不一樣。
不知道大家發現了沒有,我偷偷在【Is Trigger】的屬性里打勾了。(小若:沒看見,被奇怪的東西擋住了)
這個屬性是關鍵,只有勾上這個屬性,【碰撞器】才能真正的稱之為【觸發器】。
有了Is Trigger屬性之后,碰撞器就能檢查到是否有物體進入了它的范圍,并且會觸發回調函數。
而我們只需要在回調函數里做我們想做的事情。
### 5.觸發器事件函數
現在這個地雷是假的,因為它沒有任何實際效果,要想有實際效果,就得給它一個AI,沒錯,我們得給它加個腳本。
新建一個腳本文件,[命名](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%C3%FC%C3%FB&k0=%C3%FC%C3%FB&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)為..SomethingGGD吧,一些怪怪的東西。
然后把腳本拖到Sphere物體上。
打開SomethingGGD腳本,加入以下三個函數:
~~~
public?class?SomethingGGD?:?MonoBehaviour?{? ??void?Start()? ??{? ? ? ? Debug.Log("Start");? ??}? ??void?OnTriggerEnter(Collider other)? ??{? ? ? ? Debug.Log("OnTriggerEnter");? ??}? ??void?OnTriggerStay(Collider other)? ??{? ? ? ? Debug.Log("OnTriggerStay");? ??}? ??void?OnTriggerExit(Collider other)? ??{? ? ? ? Debug.Log("OnTriggerExit");? ??}}
~~~
Start:這個[函數](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=0&luki=2&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)在這里是多余的,只是為了驗證這個腳本是否生效了。
OnTriggerEnter:當有物體進入我的[觸發器](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%B4%A5%B7%A2%C6%F7&k0=%B4%A5%B7%A2%C6%F7&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)范圍時調用;
OnTriggerStay:當物體在我的觸發器范圍內停留時,一直調用;
OnTriggerExit:當物體離開我的[觸發器](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%B4%A5%B7%A2%C6%F7&k0=%B4%A5%B7%A2%C6%F7&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)范圍時調用。
三個函數都很好理解,不多說了。
重點是下面要做的事情。
### 6.讓主角去觸發 觸發器
我們試試主角現在進入地雷范圍時,會不會觸發這些函數。
但,在這之前,我們的Sphere有點小,幾乎看不到它了,把Sphere的Scale屬性設大一些,就設為(10,10,10)吧:

OK,運行游戲,看看主角是否能觸發這些函數,在運行游戲時,左下角會出現一些日志。
而我們在代碼里調用Debug.Log()[函數](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=0&luki=2&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)就可以在這個地方打印日志。
現在運行游戲,可以看到日志“Start”,證明這個SomethingGGD腳本是已經在運作的,如圖:

但是當我們嘗試讓主角去撞地雷的時候,卻沒有任何新的日志輸出,這就代表觸發器沒生效,這是為什么呢?
因為我們的主角并不是一個“剛體”,也就是說,主角不是一個物理對象。
只有物理對象才有碰撞的說法,只有碰撞了才能讓觸發器生效。
### 7.給主角添加剛體組件
我們先來給主角添加一個剛體組件:

添加了剛體組件之后,主角就具備一些物體特性了,但實際上我們不需要主角模擬物體特性,我們只是要它能產生碰撞而已。
所以我在創建了剛體組件后,把【Use Gravity】屬性的勾給去掉了,這個屬性代表主角是否受重力影響。
如果主角受重力影響,那么,主角會一直往下掉的。
OK,再次運行[游戲](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%D3%CE%CF%B7&k0=%D3%CE%CF%B7&kdi0=0&luki=4&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0),讓主角去撞地雷,這次就能出現日志了:

### 8.碰撞器
我們一直在說的[觸發器](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%B4%A5%B7%A2%C6%F7&k0=%B4%A5%B7%A2%C6%F7&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0),其實是碰撞器,碰撞是需要兩個碰撞器相互產生的。
如果大家有留意的話,應該能發現BugPlayer身上也是有一個碰撞器(Collider)的:

如果把這個碰撞器從主角身上移除,那么,地雷的碰撞器也就無法發現主角了。
我們來理一理:
1. 要產生碰撞,需要雙方都有一個碰撞器,因為這是判斷物體是否碰撞的依據,可以理解為,這是一個碰撞范圍。
2. 碰撞器只是判斷是否碰撞的依據,但是要真正觸發碰撞事件,則必須至少有一個物體是具備剛體[組件](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%D7%E9%BC%FE&k0=%D7%E9%BC%FE&kdi0=0&luki=3&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)的。
3. 總結:至少存在一個剛體時,才能觸發碰撞事件,而判斷物體是否碰撞的依據是碰撞器(碰撞器的碰撞范圍是可以調整的,比如球體形、立方體形、不規則形狀)
好了,關于碰撞,還是需要慢慢理解的,我也只是處于初步了解的狀態,不多說。
### 9.待續
這一篇寫得有點多,下次我們來實現什么功能好呢?
要不,我們來炸死主角吧。
本篇源碼:[Unity_benmutou_008.7z](http://www.benmutou.com/wp-content/uploads/2015/11/wpid-90d41d8ecb5577b5fa88cb400af14f1c_Unity_benmutou_008.7z)[](#)