摘要:在游戲和虛擬現實場景漫游項目中尋路導航系統應用非常廣泛。實現自動尋路導航系統要有相應的算法并且需要編寫大量的腳本。在Uinty3D下,使用Unity3D的AI尋路導航系統可能實現一定的自動導航功能。全文論述了在Unity3D下實現自動尋路導航系統必要條件,實現自動尋路導航的方法以及引用Al角色動畫的方法。
關鍵詞:虛擬現實;Unity3D;AI自動尋路
中圖分類號:TP393 文獻標識碼:A
文章編號:1009-3044(2019)36-0209-03
隨著虛擬現實技術的不斷更新和游戲產業的蓬勃發展。各種游戲引擎開發工具也相繼產生。目前,比較流行的游戲引擎開發工具有Unity3D和虛幻引擎(UE4)。
1 Unity3D游戲引擎的簡介
雖然Unity3D不帶建模功能,它只有提供用于測試的幾何體。但是它可以整合和編輯各種資源,最終可以實現一個可以運行的游戲項目。它除了可以應用在游戲領域之外,在房產、醫療、軍事行業的虛擬現實仿真類的項目也都用得到了廣泛應用。
虛幻引擎4是由美國Epic Games公司制作的優秀的游戲引擎。它在實時渲染方面具有非常強大的功能。
本文主要論述在Unity3D下實現自動尋路導航功能。
2實現自動尋路導航的必要條件
在游戲的開發中大量的存在對戰問題,需要游戲角色間智能進行交互,游戲角色間可能進行跟隨也可能進行攻擊等的一系列自主的行為。這些都需要進行角色的尋路導航。同時,在虛擬現實場景漫游項目中也大量存在尋路導航問題。如果每一次的尋路導航都通過腳本完成,工作量非常大,費時費力效果還不一定好。Unity3D為我們提供了一套AI的尋路導航系統,通過一定的腳本編寫,實現角色的巡邏、尋路和人物跟隨等。
尋路算法百花齊放,各種算法各有優劣,每種算法也都有很多針對性的改進。[1]在尋路功能的沒計方面,比較傳統的是使用A*尋路,它是一種比較傳統的人工智能算法,在游戲開發中比較常用到。A*的原理并不復雜,不過由于不是Unity3D自帶功能,因此在設定網格和烘焙的過程中難免會出現問題。[2]之前unity3d用戶都是用插件進行自動尋路,而如今unity3d自帶了簡單的自動尋路組件:Nav Mesh Agent,Off' Mesh Linkc3]。在Unity3D中完成自動尋路導航,我們一般都會使用Unity3D自帶的尋路導航系統。由于尋路導航系統應用越來越廣泛,Uni-ty3D官方在2017版本后把尋路導航系統單獨做成了一個模塊。Unity3d白帶的尋路系統的原理是事先通過烘焙將地形的信息記錄起來存儲在Nav Mesh文件上。[4]如果要實現尋路導航功能,那么就要讓AI角色對象滿足以下三個條件。
2.1要讓AI角色對象認知周圍環境
在感知周圍環境前,我們先要定義周圍的環境。確定周圍環境中哪些是可行走區域,哪些是不可行走區域。哪些是常規區域,哪些是特殊區域。每個區域所需要耗費多少能量。然后才能讓AI角色對象感知這些周圍環境。
2.2讓AI角色對象確定目標位置
在AI角色感知到周圍環境后,如果要能實時追蹤到目標點,就要讓AI對象確定目標的位置。
2.3 AI物體自身屬性的設置
我們還要知道AI角色對象是哪個屬性,比如它是人類,還是動物等。確定AI角色的身高,運動速度等。
3 UIuty3D下的Navigation面板和Nav Mesh Agent組件
在了解尋路導航的必要條件后,Unity3D通過的Navigation面板讓AI游戲對象感知周圍環境。Navigation面板是unity為我們提供的導航的面板,包含四個標簽。
3.1 Agents標簽,可以設定一個AI角色類型
比如說,定義人類為Human,身高為1.7米,起跳高度是l米左右,在行徑中攀爬的最大角度為45等??梢愿鶕椖康牟煌O定不同的角色。
3.2 Areas標簽,可以設定地形
我們開發的項目中的地形是各種各樣,根據不同的地域特征,Unity3D為我們設定了三十多塊區域供我們進行設定。每種AI角色穿越所耗費的能量也是不一樣的。如果在公路上行走,不會消耗很大的能量。如果是在沼澤地里行走會費很大的力,消耗很大的能量。
利用Areas標簽,我們可以搭建一個地形區域。我們可以添加不同的區域,如添加沼澤區域,設定消耗的能量為5。默認正常走路會消耗l點能量。根據不同的地域特征,我們的設定不同的能量消耗值。這樣為AI角色自動尋路提供數據計算基礎。
3.3 0bject標簽,可以定義地形的類型
當我們搭建好不同的地形區域和每個區域所消耗的能量后。我們需要在我們搭建的場景中定義我們搭建的類型。選擇要定義的地形區域,勾選Navigation Static選項,此時在Navi-gation Area選項里,可以選擇當前地形的類型。Unity3D為我們提供了三種默認類型,一種是walkable,它是可行走區域。第二種是Not Walkable不可行走區域。第三種是jump,它是可以跳躍區域。當然也可以選擇我們自己定義的類型,比如沼澤區域或者水域等。
3.4 Bake標簽,將AI角色和地形的參數進行烘焙
在bake標簽下選擇可行走區域的大小。我們現在直接點bake。烘焙出的區域用藍色的面片顯示。這個區域也就是AI角色對象所需要認知的環境。在Unity的自動尋路功能中,通過層的概念來完成對場景路徑的烘焙工作。[5]
Unity3D在確定AI角色自身屬性時,提供了Nav MeshAgent組件,Nav Mesh Agent組件需要附著尋路的角色身上。[6]在Nav Mesh Agent組件中可以定義AI角色對象的屬性。定義的屬性有Agent Type根據Navigation面板下定義的Agents選擇角色類型。在Steering欄目下的speed表示當前物體移動的平均速度。Angular Speed是角速度。角速度越快,在遇到90度轉彎時,轉彎的回頭速度就越快。Acceleration是加速度。Stop-ping Distance是制動距離,它代表著,我在距離物體多遠時,開始減速。Obstacle Avoidance下Radius是AI物體的半徑。Height是物體的高度。這些參數都是用來定義AI角色對象的屬性。
4使用c#腳本實現目標對象的追蹤
在Unity3d中使用Nav Mesh各項選項設置和Java Script或者C#腳本結合的方法來實現漫游系統的白尋路功能。[7]在為AI角色賦予了自身屬性以及AI角色認知周圍環境后。那么AI角色需要確定追蹤的目標。如果要實現確定追蹤目標,我們需要寫一個C#腳本。在Unity3D下創建一個C#腳本,并把這個腳本賦予AI角色上。腳本是一個組件。Unity為我們提供的組件,我們都不能深度編輯,但腳本是一個可以我們可以編輯的特殊的組件。
Unity3D在NavMeshAgent這個組件里面提供了一個方法可以找到目標物體。這個方法是publie bool SetDestination(Vec-tor3 target)。其中參數Vector3是目標點的三維向量坐標,也就是玩家的位置。在腳本中,我們需要使用Vector3傳人一個三維的向量坐標,實時的傳人玩家的位置。玩家的位置通過玩家的transform組件中的position獲得。這樣,實時追蹤的腳本可寫為:
public class AI: MonoBehaviour
{public GameObject Player;
NavMeshAgent XunLu;
void Update()
{AIAnimator= etComponent();
XunLu= GetComponent();
XunLu.SetDestination(Player.transfo rm.position);
}}
在實現AI角色追蹤玩家后,我們還需要讓AI角色注視著玩家。此時需要使用pubile void Look At(Veetor3 world Position)。其中參數Vector3同樣是目標點的三維向量坐標。注視玩家的腳本可寫為:
publi{:(:lass AI: MonoBehaviour
(public GameObject Player;
void Update()
{LookAt();}
void Lx)okAt()
{transform. LookAt(newVector3(Player. transform. position.x,transform.position.y, Player.transform.position.z));
}}
5使用C#腳本實現AI角色動畫的調用
游戲中的非玩家角色行為主要是分為待機(idle)、巡邏(patrol)、攻擊(attack)、逃跑(escape)等幾個行為狀態。[8]在完成AI角色對象跟隨后,為AI角色添加待機動畫和行走動畫。在Unity3D的proj ect面板下創建動畫控制器Animator Control-ler,它的作用是把一些動畫通過特定的方法播放出來。在Ani-mator面板中,Entry是游戲從這里開始運行,然后去執行相對應的動畫播放。我們將unity3D標準資源包里的人物待機動畫和行走動畫分別放到新創建的動畫控制器里。作為自己制作的A1人物動畫。在Animator里添加一個bool值,將bool命名為iswalk,用來控制走路動畫的播放。在線條上添加一個condi-tions,當它等于true時,AI人物會行走,當它等于false時,AI人物處于待機狀態。
在腳本里,我們定義一個walk()方法,當按下W鍵實現AI角色行走,當松開W時AI角色處于待機狀態,腳本可寫為:
Animator AIAnimator;
void walk()
{if'(lnput.GetKey(KeyCode.W))
{AIAnimator.SetBool( "is,walk”, true);
}if (Input.GetKeyUp(KeyCode.W》
{AIAnimator.SetBool( "iswalk”, false);
}}
同樣的,我們分別用S,A,D控制AI角色后退,向左,向右移動,用和按W鍵相似的腳本完成AI角色的待機和行走動畫。
在控制AI角色待機動畫和行走動畫中,我們也可以使用AI角色的NavMeshAgent組件下的remainingDis,tance和stop-pingDistance變量來完成引用AI角色動畫的功能。具體腳本如下:
public GameObject Player;
NavMeshAgent XunLu;
Animator AIAnimator;
void Update()
{AIAnimatm= GetComponent();
XunLu=GetComponent();}
private void CurrentState()
{if'(XunLu.remainingDistance> XunLu.stoppingDistam:e)
{AIAnimator.SetBool( "isWalk“, true);}
else
{print(”已經追蹤到目標”);
AIAnimator.SetBool( "isWalk”, false);}}
通過Unity3D的白動尋路導航系統,我們能設計制作出AI角色自動跟隨功能。結合Unity3D的動畫系統實現AI角色待機和行走動畫,使玩家有身臨其境的體驗感。
6結論
我們使用Unity3D完成的自動尋路導航功能時,大大簡化了腳本的編寫,方便了程序開發者。但Unity3D的尋路導航系統也并不是完全智能化。Unity3D能夠判斷卅周圍的地域,計算出最優的路線,對目標進行追蹤。但還做不到設計出作戰案,自動判斷當前的作戰路線等。但隨著Unity3D版本的不斷更新,Unity3D的自動尋路導航系統的功能也會不斷地完善和強大。我們可以完成更加智能的尋路導航的功能。
參考文獻:
[1]賀小舟.交互型虛擬場景下人物的動態路徑規劃研究[D].中國地質大學(北京),2018:4.
[2]武勝,白江波,姚浩浩,等.基于虛擬現實技術的室內導航系統[J].微型機與應用,2015,34(20):76-79.
[3]倪樂波,戚鵬,遇麗娜,等.Unity3d產品虛擬展示技術的研究與應用[J].數字技術與應用,2010,(9):54-55.
[4]邱建松.基于Unity3d的實時虛擬仿真系統的研究與實現[J].電子制作,2012,(12):11-12.
[5]朱玉.基于Unity3D漫游系統的設計與研究[J].信息安全與技術,2014,(12):78-81.
[6]沈旭霞,賈欣欣,滿強,等.基于Unity3d的防噴演習系統的設計與實現[J].自動化技術與應用,2016(7):139-142.
[7]朱玉.基于Unity3D漫游系統的設計與研究[J].信息安全與技術,2014,(12):78-81.
[8]盧金浩,張帥,伍傳敏.基于Unity3D三維游戲場景與AI系統的設計與實現[J].三明學院學報,2013(6):31-35,44.
【通聯編輯:唐一東】
收稿日期:2019-08-20
基金項目:2019年寧夏工商職業技術學院科研項目課題“基于虛擬現實(VR)技術的虛擬三維數字校園漫游系統設計研究——以寧夏工商職業技術學院為例”(項目編號:NXGSKY2019-22;項目主持人:王志崗)階段性研究成果
作者簡介:王志崗(1972-),男,副教授,主要研究方向為計算機及應用。