有沒有發現越往后寫,旁白出現的次數越少?
是的,最近公司出了點小問題,思緒就變得沉重了一些,思緒一沉重,我的精神分裂就很難發作。
不嘮叨了,這次我們來試試在代碼里操作物體吧,很簡單很簡單的。
> 笨木頭花心貢獻,啥?花心?不,是用心。
> 轉載請注明,原文地址:[http://www.benmutou.com/archives/2176](http://www.benmutou.com/archives/2176)
> 文章來源:[笨木頭與游戲開發](http://www.benmutou.com/blog/)
### 1.找遍全世界,只為了發現你——FindGameObjectWithTag
還記得很早之前我們介紹的Tag嗎?我知道你們肯定不記得的。
先給我們的BugPlayer設置一個Tag吧,如下操作:

OK,Tag只是物體身上的一個屬性,我們可以利用這個屬性做自己想做的事情。(小若:嘿嘿嘿,真的嗎?)
別做怪怪的事情就好了...
Unity本身封裝了一些針對Tag的操作,是的,包括在全世界中搜索某個Tag的物體。
打開腳本文件SomethingGGD,在OnTriggerEnter函數里加上兩句代碼:
~~~
??void?OnTriggerEnter(Collider?other)
???{
???????Debug.Log(“OnTriggerEnter”);
???????GameObject?obj?=?GameObject.FindGameObjectWithTag(“BugPlayer”);
???????obj.SetActive(false);
???}
~~~
利用FindGameObjectWithTag函數,可以在整個場景里查找Tag等于某個值的物體。
這是一個靜態函數。
當然,Tag等于某個值的物體可以不止一個,因為Tag的值是可以隨意設置的,因此也有FindGameObjectsWithTag函數,可以查找所有滿足Tag值的物體,返回一個數組。
(小若:那,如果有很多個具有Tag=”BugPlayer”的物體呢?用FIndGameObjectWithTag會怎么樣?)
如果擁有某個Tag屬性的物體有多個,而你特么的又故意用FindGameObjectWithTag來查找單個物體,那就等著出Bug吧,我可不知道會發生什么。
留意第二句代碼:obj.SetActive(false),這句代碼會把物體變成非活動狀態,這樣就會就不會在場景中出現,也不會參與場景中的各種事件。就好像,它死了,但靈魂還在。
我們來看看效果:

BugPlayer撞到地雷的時候,立刻就消失了。
怎么樣?我這地雷質量不錯吧?明天給你家門口裝一個,免費的哈。
### 2.把你裝在心里,隨時都能…滅了你——將物體作為屬性保存
除了使用Find**(特么的這函數名字太長,我不想寫)來查找物體之外,還有一個更偷懶的方法。
首先,給SomethingGGD腳本加上一個屬性,順便修改OnTriggerEnter函數,如下所示:
~~~
public?class?SomethingGGD?:?MonoBehaviour?{
???public?GameObject?bugPlayer?=?null;
???void?OnTriggerEnter(Collider?other)
???{
???????Debug.Log(“OnTriggerEnter”);
???????bugPlayer.SetActive(false);
???}
}
~~~
很簡單,bugPlayer作為SomethingGGD的一個屬性,我隨時可以調用它。
等等,這個屬性在哪里賦值呢?這是個好問題。(小若:特么就沒人問你)
我們來看看Unity編輯器,每次修改完代碼,回到編輯器時,它都會編譯代碼,所以要稍等一會。
然后點擊Sphere,看看它的屬性:

有沒有發現什么?
是的,SomethingGGD里多了一個BugPlayer屬性,而且它右邊還有一個框框,看起來好像可以拖東西進去。
在Unity里就是這樣,看起像的東西,那么它一定就是了。
腳本里的Public屬性,是可以出現在編輯里的,而且可以直接拖動賦值。
我們把BugPlayer拖動到這個屬性里吧:

拖動物體的時候,在到達位置之前,一定不要松開鼠標,否則就會變成選中這個物體了。
OK,運行游戲,效果和之前是一毛一樣的。
### 3.特么的對不起,我一直在騙你——Collider參數
各位,其實我剛剛說的兩種方式,完全不適合在這里使用,為什么呢?
因為在兩個彭撞器發生碰撞的時候,它們是能相互知道對方是誰的。
既然如此,我們根本就不需要去這么辛苦地查詢。
忘記剛剛的那些操作,我們在OnTriggerEnter函數里寫上這么一句代碼:
~~~
??void?OnTriggerEnter(Collider?other)
???{
???????Debug.Log(“OnTriggerEnter”);
???????other.gameObject.SetActive(false);
???}
~~~
OnTriggerEnter函數本身就有一個Collider參數,這個參數就是和我這個碰撞器發生碰撞的碰撞器對象。
碰撞器是一個Collider,Collider只是物體身上的一個組件,所以,Collider的gameObject就是那個和我產生碰撞的物體。
于是,僅僅需要調用:other.gameObject.SetActivie(false) 就能讓這個和我產生碰撞的物體消失。
### 4.更多好玩的
現在, 地雷已經能操作BugPlayer了,那就很多東西可以玩了。
我們試試把OnTriggerEnter函數改成這樣:
~~~
??void?OnTriggerEnter(Collider?other)
???{
???????Debug.Log(“OnTriggerEnter”);
???????int?rand?=?(int)Random.Range(1,?100);
???????if(rand?<?50)
???????{
???????????other.gameObject.transform.position?=?new?Vector3(
???????????other.gameObject.transform.position.x,
???????????other.gameObject.transform.position.y,
???????????other.gameObject.transform.position.z?–?20
???????????);
???????}
???????else
???????{
???????????other.gameObject.transform.position?=?new?Vector3(
???????????other.gameObject.transform.position.x?+?20,
???????????other.gameObject.transform.position.y,
???????????other.gameObject.transform.position.z
???????????);
???????}
???}
~~~
這樣就有隨機效果了,隨機改變BugPlayer的x或z坐標。
為什么要有隨機效果?因為我們要創建多個地雷了。
還記得怎么復制物體嗎?Ctrl+D,我們多復制幾個地雷,擺滿場景:

我們復制出來的地雷和原來的是一毛一樣的,地雷的所有邏輯都存在。
這是很爽的事情,我們只需配好一個物體,就能制作一堆相同的物體了。
現在,運行游戲,讓BugPlayer踩地雷去吧。

我發現這主角還蠻難控制的….
### 5待續
好了,這個Demo的主要功能已經完成了。
下一篇,也是最后一篇,我們給BugPlayer加上UI
本篇源碼:?[Unity_benmutou_009](http://www.benmutou.com/wp-content/uploads/2015/11/Unity_benmutou_009.7z)
有沒有發現越往后寫,旁白出現的次數越少?
是的,最近公司出了點小問題,思緒就變得沉重了一些,思緒一沉重,我的精神分裂就很難發作。
不嘮叨了,這次我們來試試在代碼里操作物體吧,很簡單很簡單的。
> **笨木頭花心貢獻,啥?花心?不,是用心。**
> **轉載請注明,原文地址:[http://www.benmutou.com/archives/2176](http://www.benmutou.com/archives/2176)**
> **文章來源:[笨木頭與游戲開發](http://www.benmutou.com/blog/)**
### 1.找遍全世界,只為了發現你——FindGameObjectWithTag
還記得很早之前我們介紹的Tag嗎?我知道你們肯定不記得的。
先給我們的BugPlayer設置一個Tag吧,如下操作:

OK,Tag只是物體身上的一個屬性,我們可以利用這個屬性做自己想做的事情。(小若:嘿嘿嘿,真的嗎?)
別做怪怪的事情就好了...
Unity本身封裝了一些針對Tag的操作,是的,包括在全世界中搜索某個Tag的物體。
打開腳本文件SomethingGGD,在OnTriggerEnter函數里加上兩句代碼:
~~~
??void?OnTriggerEnter(Collider?other)
???{
???????Debug.Log(“OnTriggerEnter”);
???????GameObject?obj?=?GameObject.FindGameObjectWithTag(“BugPlayer”);
???????obj.SetActive(false);
???}
~~~
利用FindGameObjectWithTag函數,可以在整個場景里查找Tag等于某個值的物體。
這是一個靜態函數。
當然,Tag等于某個值的物體可以不止一個,因為Tag的值是可以隨意設置的,因此也有FindGameObject**s**WithTag函數,可以查找所有滿足Tag值的物體,返回一個數組。
(小若:那,如果有很多個具有Tag=”BugPlayer”的物體呢?用FIndGameObjectWithTag會怎么樣?)
如果擁有某個Tag屬性的物體有多個,而你特么的又故意用FindGameObjectWithTag來查找單個物體,那就等著出Bug吧,我可不知道會發生什么。
留意第二句代碼:obj.SetActive(false),這句代碼會把物體變成非活動狀態,這樣就會就不會在場景中出現,也不會參與場景中的各種事件。就好像,它死了,但靈魂還在。
我們來看看效果:

BugPlayer撞到地雷的時候,立刻就消失了。
怎么樣?我這地雷質量不錯吧?明天給你家門口裝一個,免費的哈。
### 2.把你裝在心里,隨時都能…滅了你——將物體作為屬性保存
除了使用Find**(特么的這函數名字太長,我不想寫)來查找物體之外,還有一個更偷懶的方法。
首先,給SomethingGGD腳本加上一個屬性,順便修改OnTriggerEnter函數,如下所示:
~~~
public?class?SomethingGGD?:?MonoBehaviour?{
???public?GameObject?bugPlayer?=?null;
???void?OnTriggerEnter(Collider?other)
???{
???????Debug.Log(“OnTriggerEnter”);
???????bugPlayer.SetActive(false);
???}
}
~~~
很簡單,bugPlayer作為SomethingGGD的一個屬性,我隨時可以調用它。
等等,這個屬性在哪里賦值呢?這是個好問題。(小若:特么就沒人問你)
我們來看看Unity編輯器,每次修改完代碼,回到編輯器時,它都會編譯代碼,所以要稍等一會。
然后點擊Sphere,看看它的屬性:

有沒有發現什么?
是的,SomethingGGD里多了一個BugPlayer屬性,而且它右邊還有一個框框,看起來好像可以拖東西進去。
在Unity里就是這樣,看起像的東西,那么它一定就是了。
腳本里的Public屬性,是可以出現在編輯里的,而且可以直接拖動賦值。
我們把BugPlayer拖動到這個屬性里吧:

拖動物體的時候,在到達位置之前,一定不要松開鼠標,否則就會變成選中這個物體了。
OK,運行游戲,效果和之前是一毛一樣的。
### 3.特么的對不起,我一直在騙你——Collider參數
各位,其實我剛剛說的兩種方式,完全不適合在這里使用,為什么呢?
因為在兩個彭撞器發生碰撞的時候,它們是能相互知道對方是誰的。
既然如此,我們根本就不需要去這么辛苦地查詢。
忘記剛剛的那些操作,我們在OnTriggerEnter函數里寫上這么一句代碼:
~~~
??void?OnTriggerEnter(Collider?other)
???{
???????Debug.Log(“OnTriggerEnter”);
???????other.gameObject.SetActive(false);
???}
~~~
OnTriggerEnter函數本身就有一個Collider參數,這個參數就是和我這個碰撞器發生碰撞的碰撞器對象。
碰撞器是一個Collider,Collider只是物體身上的一個組件,所以,Collider的gameObject就是那個和我產生碰撞的物體。
于是,僅僅需要調用:other.gameObject.SetActivie(false) 就能讓這個和我產生碰撞的物體消失。
### 4.更多好玩的
現在, 地雷已經能操作BugPlayer了,那就很多東西可以玩了。
我們試試把OnTriggerEnter函數改成這樣:
~~~
??void?OnTriggerEnter(Collider?other)
???{
???????Debug.Log(“OnTriggerEnter”);
???????int?rand?=?(int)Random.Range(1,?100);
???????if(rand?<?50)
???????{
???????????other.gameObject.transform.position?=?new?Vector3(
???????????other.gameObject.transform.position.x,
???????????other.gameObject.transform.position.y,
???????????other.gameObject.transform.position.z?–?20
???????????);
???????}
???????else
???????{
???????????other.gameObject.transform.position?=?new?Vector3(
???????????other.gameObject.transform.position.x?+?20,
???????????other.gameObject.transform.position.y,
???????????other.gameObject.transform.position.z
???????????);
???????}
???}
~~~
這樣就有隨機效果了,隨機改變BugPlayer的x或z坐標。
為什么要有隨機效果?因為我們要創建多個地雷了。
還記得怎么復制物體嗎?Ctrl+D,我們多復制幾個地雷,擺滿場景:

我們復制出來的地雷和原來的是一毛一樣的,地雷的所有邏輯都存在。
這是很爽的事情,我們只需配好一個物體,就能制作一堆相同的物體了。
現在,運行游戲,讓BugPlayer踩地雷去吧。

我發現這主角還蠻難控制的….
### 5待續
好了,這個Demo的主要功能已經完成了。
下一篇,也是最后一篇,我們給BugPlayer加上UI
本篇源碼:?[Unity_benmutou_009](http://www.benmutou.com/wp-content/uploads/2015/11/Unity_benmutou_009.7z)