開發環境:Win十、Unity5.3.四、C#、VS2015 spa
建立日期:2016-05-09 code
在大多數遊戲情景中,可行進的區域每每不是徹底不變的。好比被破壞的路、橋等將再也不容許經過。那麼,如何控制行進物體呢?有兩種解決辦法。 對象
第一種解決辦法是分層控制,而後動態更改可行進層,好比對於不一樣的橋,分別用不一樣的層來控制。可是這種處理有一個侷限性,好比一個遊戲場景中包含不少橋的情形,每一個橋都有本身的通行或禁止狀態,那麼若是分層控制,那麼就須要爲每個橋分一個層,這樣—來層數確定不夠用,由於在Unity中最多隻能分32層。其次,在行進物體不少的時候,頻繁改動進行物體的可行進層也不是—件輕鬆的事情。 blog
第二種解決辦法是利用Navmesh Obstade組件處理相似動態路障的問題。只要將該組件掛載到動態路障上,行進物體將會在尋路時自動躲避這些路障。 遊戲
該例子主要介紹第二種辦法的具體實現。即:利用Navmesh Obstade組件處理相似動態路障的問題。採用這種辦法時,不須要手動改變行進物體的可行進層,只須要在橋體上掛載Navmesh Obstade組件,而後經過腳本改變Navmesh Obstade組件的enable的值便可。在橋對象可通行時,enable的值爲false,橋面不可通行時enable的值爲true。 開發
一、建立場景 get
在ch1201_Navmesh_Sample工程中,新建一個名爲Demo4的場景,在場景中分別添加下面的對象: it
其中,Demo4Mask下的Cube都是靜態的,player是行進對象,greenCube是目的地。 io
二、烘培 table
具體步驟和前面的節相似,烘培後的結果以下:
三、爲bridge添加Nav Mesh Obstable組件
在層次視圖中選中bridge,爲其添加【Nav Mesh Obstable】組件:
添加後,可看到bridge會被一個綠色的網格包圍。
四、編寫腳本
添加一個名爲Demo4BridgeControl.cs的腳本,將其改成下面的內容:
using UnityEngine; using System.Collections; public class Demo4BridgeControl : MonoBehaviour { void Start() { StartCoroutine(Init()); } IEnumerator Init() { GetComponent<Renderer>().enabled = false; yield return new WaitForSeconds(2.0f); GetComponent<NavMeshObstacle>().enabled = false; GetComponent<Renderer>().enabled = true; } void Update() { } }
代碼中用了yield return來代替計時,這種方式比直接用一個time變量控制計時方便,代碼也顯得更簡潔。
五、將腳本添加到bridge
將腳本拖放到bridge對象上。
六、預覽效果
按【播放】按鈕預覽遊戲,就會發現行進的膠囊體會一直等待橋面出現後,才經過橋到達目的地。