發表文章

目前顯示的是 2月, 2018的文章

Unreal Avoidance系統(下)

圖片
在上篇 我們提到使用Unreal內建的Detour迴避有一些限制 這些限制主要是純BP專案無法透過C++修改行為造成的。 所以本篇是以C++專案為基礎,說明如果要使用Detour的功能,可能要做哪些修改才能達到。 需要注意的是這篇文章為了重現當初改寫時遇到的過程,會有大量的文字描述,沒興趣的話應該會啃不下去。 但是裡面有一些遇到問題的解法,對解題過程有興趣的人可以看看,或是有更好的建議也歡迎~ 本篇會介紹下面幾個項目,可以先看看有沒有你要的內容再繼續~ 1. 為什麼要複寫CrowdManager 2. 繼承並複寫CrowdManager 3. 在執行時期更改AvoidanceGroup 為什麼要複寫CrowdManager 這是個很冗長的流程,當初我發現RVO可以動態透過API修改Avoidance Group, 但是用CrowdPathFollowingComponent(以下簡稱CPFC)卻不行時,我也是嚇了一跳。 於是我跑去追CPFC的程式碼,發現要修改Detour迴避行為的函式全部都被定義為private(圖1), 然後標頭檔的最後標示了CPFC的friend class是 CrowdManager。 顯示即使繼承CPFC也沒辦法改寫迴避的行為,設定全部都必須要透過CrowdManager處理。 圖1. 設定Detour的函式都是private。 然後跑去CrowdManager挖程式碼,卻發現CPFC那些設定相關的函式都沒被用到... 代表要繼承CrowdManager才能達到我希望能修改迴避參數的目標。 繼承並複寫CrowdManager 首先當然就是先繼承CrowdManager: 在Unreal Editor->New C++ Class->Show all classes 輸入CrowdManager,並選擇CrowdManager,輸入名字與路徑就可以完成繼承。 在Edit->Project Settings->Engine->NavigationSystem內有CrowdManagerClass 將此欄位指向剛剛創好的MyCrowdManager。可參考圖2 圖2. 在Engine設定CrowdManagerClass為自己複寫的cl

Unreal Avoidance系統(上)

圖片
AI角色在移動時,為了能夠閃開場景的物件,大致上可分為靜態物件與動態物件兩種。 靜態場景的物件能夠透過Collision+CanAffectNavigation設定或是在場景內種Navi Modifier Volume將Navigation Mesh挖空,讓AI沒辦法走在這些物件上;而動態物件的閃避(閃避其他角色)則利用Avoidance閃避系統來處理。 Unreal Engine裡面有兩種avoidance系統可以選擇性地使用,其中一個是RVO,另一種則是Detour crowd simulation。然而根據 https://wiki.unrealengine.com/Unreal_Engine_AI_Tutorial_-_2_-_Avoidance 所提到的,Unreal提供的RVO不保證在推擠或閃避的過程中角色依然能維持在Navigation mesh上,這代表有可能你的角色會發生卡在場景內走不出來的現象...(我也不知道為什麼這樣子的東西能放在上面給人使用)。 因為這樣的原因,在蒐集一些資料後我直接選擇Detour使用,RVO就直接被我跳過不用了。所以本篇會著重在Detour crowd simulation系統上作說明。除此之外,一般網路搜尋到的文章也會建議RVO與Detour不要同時打開,以免產生衝突的行為。 RVO與Detour的差異 開始詳細介紹Detour之前,先比較一下RVO跟Detour兩個系統的差別。 Table 1 . 比較RVO與Detour系統的差異。 RVO Detour 使用難易度 簡單 普通 可調整參數 少 超多 可改寫的行為 不確定 很多但麻煩(只能C++) 缺點 不保證在NavMesh上 複雜的計算與設定 使用的難易度:RVO 比 Detour容易。 RVO開啟非常簡單,更改設定也很簡單。也允許blueprint(BP)端執行期間更改迴避的設定;Detour就相對麻煩了,如果只是要開啟一些很簡單的效果,使用難度跟RVO差不多,但是只支援BP事先定義好的迴避參數,想要在實際執行過程中改變迴避設定的話有很多事情要處理,而且都是要在C++端實作才行。 可調整參數:RVO能調整的似乎就是迴避半徑,迴避比