對這文章發表回應
發表限制: 非會員 可以發表
unity 自帶尋路 Navmesh 入門教程(二)
2012-08-12 11:03:11 | 分類: Unity教程
上一節簡單介紹了NavMesh尋路的基本用法,這次來介紹一下稍微複雜一點點的高低落差以及跳躍的做法,首先來看看這次的目標:


由於博客相冊上傳GIF有限制,所以我把整個過程切開了2部分上傳,第一部分是爬樓梯,第二部分是橫向跳躍和往下跳落
不管是爬樓梯,還是跳躍,NavMesh都是通過了OffMeshLink來做的。創建OffMeshLink的方法有兩種,接下來會通過製作上面的例子來進行說明:


按照上一節所講的,plane和F1——F5台階在Navigation面板勾選Navigation Static選項,然後Bake,觀察Scene視窗,會發現已經生成了我們所要的NavMesh網格,現在我們可以像上一節那樣在plane上面給人物做尋路和移動了,但人物是不會爬樓梯的。
這時候,我們找到L1樓梯,在樓梯的開始和結束的位置放置兩個點,這兩個點只需要拾取它的位移的,你可以用empty Gameobject來做,我這裡為了便於觀察,就拿了cube來做。開始點命名為startPoint,結束點命名為endPoint。

注意:startPoint和endPoint的位置要稍微比所在的平面高一點點。
接下來介紹第一種生成OffMeshLink的方法。選擇L1樓梯,然後在Component下拉選項中選擇Navigation——Off Mesh Link。

選擇後,OffMeshLink組件已經添加到了L1的身上,我們可以在Inspector面板看到:

我們把剛才放置在場景裡面的startPoint和endPoint指定到OffmeshLink組件的Start和End位置,其他選項默認不改變
再次Bake


現在我們發現,在scene面板裡面,在startPoint和endPoint之間生成了一條線,而方向是從startPoint指向endPoint的。

這時候,你應該可以通過移動目標點讓角色開始爬樓梯了。但爬上去之後角色暫時不能跳下來,如果把目標點移動到plane上,角色會順著樓梯爬下來。
我們使用同樣的方法對L2進行生成OffMeshLink。這時候,角色應該可以爬兩層樓梯了。到此第一個目標完成了。
接下來我們進行第二個目標的製作,首先先來分析一下我們的場景:

我們希望人物能從2.5M的高度往下跳,超過2.5M人物就不能跳了,太高會有危險。然後橫向我們希望人物能跳過2米的溝。
根據這個設定,我們的場景會是這樣的情況:L1和L2只能通過爬樓梯,L2和L3之間可以跳躍,L3——L5是可以往下跳的。
於是,我們在Navigation面板裡面找到Bake欄,Drop Height(掉落高度)填2.5,Jump Distance(跳躍距離)填2,單位都是米

接下來介紹第二種生成OffMeshLink的方法:
我們把L1——L5的物體選中,在Navigation面板的Object欄裡面把OffMeshLink Generation選項打上勾

再次Bake,回到scene視窗:

這時候,場景裡面會出現很多心的OffMeshLink,這是unity通過計算,把可以跳躍或者下落的地方自動生成了OffMeshLink了。
這時候,你應該已經可以通過移動目標點,讓角色進行跳躍和下落了。
進行到這裡,我們的第二個目標也完成了。
不過有些朋友可能會提出疑問,在做的過程中,假如沒有這個大兵的模型,而是用一個膠囊體來代替人物的話,它爬樓梯和跳躍的時候好像是在一瞬間完成的,沒有大兵那個爬樓梯和跳躍動作的過程。如這樣:



假如各位需要對越過OffMeshLink時候進行自己的控制,是需要另外寫腳本的。我這裡簡單的介紹一下方法,有興趣的朋友可以自己試試。
首先各位最好有用狀態來控制角色的概念。比如人物可以分為站立、走路、跑步、上下樓梯、橫向跳躍和往下掉落幾種狀態,針對NavMesh來說,人物簡單的可以分為站立、正常的NavMesh尋路,和通過OffMeshLink移動幾種狀態。
先把 Auto Traverse Off Mesh Link選項取消。
然後,當人物在通過OffMeshLink移動的狀態(可以用NavMeshAgent.isOnOffMeshLink來判斷),獲取到當前通過的OffMeshLink:
OffMeshLinkData link = NavMeshAgent.currentOffMeshLinkData;
這樣你就能獲取到link的開始點和結束點的坐標(link.startPos和link.endPos),這時候你的人物就可以用最簡單的Vector3.Lerp來進行移動,當人物的位移到達了結束點的坐標,人物的OffMeshLink移動狀態就可以結束,又重新變回正常尋路或者站立的狀態了。在這個Vector3.Lerp的過程中,你可以隨意的控制人物的爬行或者跳躍的動作。
到這裡,第二節的內容結束了。到現在,各位應該已經可以基本掌握了NavMesh尋路的全部正常操作了。接下來,我會在第三節裡面簡單講解一下NavMesh的稍微複雜的控制方法,希望大家繼續支持阿趙。
順帶一提,可能很多朋友希望我把工程文件提供下載。不過我覺得這樣並不是一件好事,因為這幾個例子都是很簡單的操作,如果各位有耐心跟著阿趙一步步的做下來,應該可以得到你想要的結果。而如果沒有耐心一步步的看下來,直接看工程文件,可能會忽略了很多重要的步驟的。
原文出處:unity自带寻路Navmesh入门教程(二) - 阿赵的日志 - 网易博客