亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器的制作方法

文檔序號(hào):11828833閱讀:257來(lái)源:國(guó)知局
基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器的制作方法與工藝

本發(fā)明屬于游戲開(kāi)發(fā)技術(shù)領(lǐng)域,具體涉及一種基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器。



背景技術(shù):

在游戲人工智能AI編程領(lǐng)域中,行為樹(shù)(Behavior-Tree)的廣泛應(yīng)用已經(jīng)開(kāi)始逐漸取代了設(shè)計(jì)復(fù)雜而龐大的狀態(tài)機(jī)(State Machine),越來(lái)越多游戲使用行為樹(shù)作為AI的實(shí)現(xiàn)結(jié)構(gòu)。

現(xiàn)有技術(shù)中,普遍使用Brainiac Designer工具編輯行為樹(shù),使用該工具編輯行為樹(shù)時(shí),需要首先編寫(xiě)出各個(gè)樹(shù)節(jié)點(diǎn),然后將各個(gè)編寫(xiě)出的樹(shù)節(jié)點(diǎn)生成dll動(dòng)態(tài)鏈接庫(kù),并作為插件導(dǎo)入到Brainiac Designer中。雖然Brainiac Designer提供了源碼,但是,用戶非常難以在Brainiac Designer工具定義一些滿足特殊需求的樹(shù)節(jié)點(diǎn);此外,當(dāng)編輯到一棵行為樹(shù)后,由于行為樹(shù)涉及數(shù)量眾多的節(jié)點(diǎn),因此,編程人員難以預(yù)見(jiàn)行為樹(shù)的實(shí)現(xiàn)效果,導(dǎo)致不方便對(duì)行為樹(shù)進(jìn)行調(diào)試。



技術(shù)實(shí)現(xiàn)要素:

針對(duì)現(xiàn)有技術(shù)存在的缺陷,本發(fā)明提供一種基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器,可有效解決上述問(wèn)題。

本發(fā)明采用的技術(shù)方案如下:

本發(fā)明提供一種基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器,包括行為樹(shù)編輯模塊、行為樹(shù)預(yù)覽模塊、行為樹(shù)導(dǎo)出模塊和行為樹(shù)導(dǎo)入模塊;

所述行為樹(shù)編輯模塊提供行為樹(shù)編輯面板,用于編輯得到一顆行為樹(shù);

所述行為樹(shù)預(yù)覽模塊用于將所述行為樹(shù)編輯模塊編輯得到的行為樹(shù)輸入到預(yù)存儲(chǔ)游戲場(chǎng)景中的某個(gè)游戲角色中,通過(guò)所述行為樹(shù)控制所述游戲角色的動(dòng)作,并播放所述行為樹(shù)對(duì)所述游戲角色的控制過(guò)程,實(shí)現(xiàn)對(duì)編輯得到的行為樹(shù)運(yùn)行過(guò)程的預(yù)覽;

所述行為樹(shù)導(dǎo)出模塊用于將預(yù)覽成功的所述行為樹(shù)以特定數(shù)據(jù)結(jié)構(gòu)導(dǎo)出,供游戲運(yùn)行時(shí)調(diào)用;

所述行為樹(shù)導(dǎo)入模塊用于將已導(dǎo)出的所述行為樹(shù)再次導(dǎo)入到所述行為樹(shù)編輯模塊,通過(guò)所述行為樹(shù)編輯模塊對(duì)所述行為樹(shù)進(jìn)行改進(jìn)。

優(yōu)選的,所述行為樹(shù)編輯模塊包括行為樹(shù)編輯面板以及事件監(jiān)聽(tīng)器;

所述行為樹(shù)編輯面板提供行為樹(shù)繪制區(qū)域;

所述事件監(jiān)聽(tīng)器用于對(duì)所述行為樹(shù)繪制區(qū)域進(jìn)行監(jiān)聽(tīng),具體監(jiān)聽(tīng)過(guò)程包括:

步驟1:當(dāng)監(jiān)聽(tīng)到所述行為樹(shù)繪制區(qū)域發(fā)生鼠標(biāo)右鍵點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域彈出操作面板,其中,所述操作面板包括:添加節(jié)點(diǎn)按鈕、刪除節(jié)點(diǎn)按鈕、上移當(dāng)前節(jié)點(diǎn)按鈕和下移當(dāng)前節(jié)點(diǎn)按鈕;

步驟2:然后,所述事件監(jiān)聽(tīng)器對(duì)所述操作面板中的各個(gè)按鈕進(jìn)行監(jiān)聽(tīng),并區(qū)分以下四種情況:

1)當(dāng)監(jiān)聽(tīng)到所述添加節(jié)點(diǎn)按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域彈出節(jié)點(diǎn)類型面板,所述節(jié)點(diǎn)類型面板包含行為節(jié)點(diǎn)子按鈕、條件節(jié)點(diǎn)子按鈕、順序節(jié)點(diǎn)子按鈕和選擇節(jié)點(diǎn)子按鈕;然后,所述事件監(jiān)聽(tīng)器對(duì)所述節(jié)點(diǎn)類型面板中的各個(gè)子按鈕進(jìn)行監(jiān)聽(tīng),如果監(jiān)聽(tīng)到所述行為節(jié)點(diǎn)子按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域添加行為節(jié)點(diǎn);如果監(jiān)聽(tīng)到所述條件節(jié)點(diǎn)子按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域添加條件節(jié)點(diǎn);如果監(jiān)聽(tīng)到所述順序節(jié)點(diǎn)子按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域添加順序節(jié)點(diǎn);如果監(jiān)聽(tīng)到所述選擇節(jié)點(diǎn)子按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域添加選擇節(jié)點(diǎn);然后,所述事件監(jiān)聽(tīng)器對(duì)已添加到所述行為樹(shù)繪制區(qū)域的行為節(jié)點(diǎn)、條件節(jié)點(diǎn)、順序節(jié)點(diǎn)或選擇節(jié)點(diǎn)進(jìn)行監(jiān)聽(tīng),當(dāng)監(jiān)聽(tīng)到所述行為節(jié)點(diǎn)發(fā)生節(jié)點(diǎn)雙擊事件時(shí),向被雙擊節(jié)點(diǎn)位置彈出包含有已配置的用于控制游戲角色的具體行為指令的選擇面板;然后,當(dāng)接收到所述選擇面板返回的具體行為指令時(shí),所述事件監(jiān)聽(tīng)器保存節(jié)點(diǎn)標(biāo)識(shí)和具體行為指令的對(duì)應(yīng)關(guān)系;

當(dāng)監(jiān)聽(tīng)到所述條件節(jié)點(diǎn)、所述順序節(jié)點(diǎn)或所述選擇節(jié)點(diǎn)發(fā)生節(jié)點(diǎn)雙擊事件時(shí),向被雙擊節(jié)點(diǎn)位置彈出節(jié)點(diǎn)屬性修改面板,當(dāng)接收到通過(guò)所述節(jié)點(diǎn)屬性修改面板發(fā)送的節(jié)點(diǎn)屬性時(shí),所述事件監(jiān)聽(tīng)器保存節(jié)點(diǎn)標(biāo)識(shí)和節(jié)點(diǎn)屬性的對(duì)應(yīng)關(guān)系;

2)當(dāng)監(jiān)聽(tīng)到所述刪除節(jié)點(diǎn)按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),所述事件監(jiān)聽(tīng)器將被 點(diǎn)擊區(qū)域?qū)?yīng)的節(jié)點(diǎn)刪除;

3)當(dāng)監(jiān)聽(tīng)到所述上移當(dāng)前節(jié)點(diǎn)按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),所述事件監(jiān)聽(tīng)器將被點(diǎn)擊的當(dāng)前按鈕的子節(jié)點(diǎn)依次向上移動(dòng)一位;

4)當(dāng)監(jiān)聽(tīng)到所述下移當(dāng)前節(jié)點(diǎn)按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),所述事件監(jiān)聽(tīng)器將被點(diǎn)擊的當(dāng)前按鈕的子節(jié)點(diǎn)依次向下移動(dòng)一位。

優(yōu)選的,所述行為樹(shù)預(yù)覽模塊對(duì)所述行為樹(shù)的運(yùn)行過(guò)程進(jìn)行預(yù)覽,具體包括以下步驟:

S1,所述行為樹(shù)預(yù)覽模塊設(shè)置行為樹(shù)中的節(jié)點(diǎn)具有4個(gè)狀態(tài),分別為初始狀態(tài)、懸掛狀態(tài)、執(zhí)行成功狀態(tài)和執(zhí)行失敗狀態(tài);

其中,所述初始狀態(tài)是指:在最初第一次執(zhí)行根節(jié)點(diǎn)之前,行為樹(shù)中所有節(jié)點(diǎn)均為初始狀態(tài);

所述懸掛狀態(tài)是指:當(dāng)某個(gè)節(jié)點(diǎn)正在被執(zhí)行時(shí),或者,當(dāng)某個(gè)節(jié)點(diǎn)的任意一個(gè)子節(jié)點(diǎn)正在被執(zhí)行且沒(méi)有執(zhí)行完畢時(shí),該節(jié)點(diǎn)即為懸掛狀態(tài)的節(jié)點(diǎn);

S2,設(shè)需執(zhí)行的行為樹(shù)共有n層,按自上而下順序,依次記為:第1層、第2層…第n層;其中,n為自然數(shù);第1層即為根節(jié)點(diǎn);第n層即為葉子節(jié)點(diǎn),所述葉子節(jié)點(diǎn)均為行為節(jié)點(diǎn);所述非葉節(jié)點(diǎn),即:第1層節(jié)點(diǎn)到第n-1層節(jié)點(diǎn),均為控制節(jié)點(diǎn);

S3,每隔預(yù)設(shè)時(shí)間間隔,即執(zhí)行一次根節(jié)點(diǎn),執(zhí)行方法為:

S3.1,在當(dāng)前時(shí)刻,所述行為樹(shù)預(yù)覽模塊執(zhí)行第1層節(jié)點(diǎn),即:讀取所述第1層節(jié)點(diǎn)的狀態(tài),判斷所述第1層節(jié)點(diǎn)當(dāng)前是否為懸掛狀態(tài),如果是,則執(zhí)行S3.2-S3.5;如果否,則執(zhí)行S3.6;

S3.2,所述行為樹(shù)預(yù)覽模塊讀取各個(gè)所述第2層節(jié)點(diǎn),查找到當(dāng)前為懸掛狀態(tài)的第2層節(jié)點(diǎn),記為:節(jié)點(diǎn)2.x;其中,當(dāng)所述第1層節(jié)點(diǎn)為懸掛狀態(tài)時(shí),其兒子節(jié)點(diǎn)中有且僅有一個(gè)節(jié)點(diǎn)為懸掛狀態(tài);

S3.3,所述行為樹(shù)預(yù)覽模塊執(zhí)行節(jié)點(diǎn)2.x的懸掛函數(shù),同時(shí)判斷所述節(jié)點(diǎn)2.x是否為葉子節(jié)點(diǎn),如果否,則執(zhí)行S3.4;否則,直接執(zhí)行S3.5;

S3.4,所述行為樹(shù)預(yù)覽模塊繼續(xù)遞歸執(zhí)行節(jié)點(diǎn)2.x的子孫節(jié)點(diǎn)的懸掛函數(shù),直到執(zhí)行到葉子節(jié)點(diǎn),然后執(zhí)行S3.5;其中,整根行為樹(shù)有且僅有一條分支的各 節(jié)點(diǎn)處于懸掛狀態(tài);

S3.5,所述行為樹(shù)預(yù)覽模塊執(zhí)行葉子節(jié)點(diǎn)的懸掛函數(shù);所述葉子節(jié)點(diǎn)的懸掛函數(shù)直接導(dǎo)致游戲?qū)ο蟮男袨榘l(fā)生變化;

S3.6,當(dāng)所述第1層節(jié)點(diǎn)不為懸掛狀態(tài)時(shí),所述行為樹(shù)預(yù)覽模塊根據(jù)第1層節(jié)點(diǎn)的類型,遍歷執(zhí)行各個(gè)第2層節(jié)點(diǎn),

如果某個(gè)第2層節(jié)點(diǎn)為行為節(jié)點(diǎn),則直接執(zhí)行該行為節(jié)點(diǎn),并將執(zhí)行結(jié)果返回給所述第1層節(jié)點(diǎn);所述第1層節(jié)點(diǎn)根據(jù)所接收到的執(zhí)行結(jié)果,改變自身狀態(tài);

如果某個(gè)第2層節(jié)點(diǎn)為選擇節(jié)點(diǎn),則該選擇節(jié)點(diǎn)迭代執(zhí)行該選擇節(jié)點(diǎn)的各個(gè)子節(jié)點(diǎn),如果某個(gè)子節(jié)點(diǎn)執(zhí)行后返回執(zhí)行失敗的通知消息,則繼續(xù)迭代執(zhí)行其他子節(jié)點(diǎn);只要存在一個(gè)子節(jié)點(diǎn)執(zhí)行后返回執(zhí)行成功的通知消息,即停止迭代,該選擇節(jié)點(diǎn)向自身的父節(jié)點(diǎn)返回執(zhí)行成功的通知消息,然后,所述父節(jié)點(diǎn)將自身狀態(tài)設(shè)置為執(zhí)行成功狀態(tài);否則,如果所有子節(jié)點(diǎn)執(zhí)行后均返回執(zhí)行失敗的通知消息,則:所述父節(jié)點(diǎn)將自身狀態(tài)設(shè)置為執(zhí)行失敗狀態(tài);

如果某個(gè)第2層節(jié)點(diǎn)為順序節(jié)點(diǎn),則該順序節(jié)點(diǎn)迭代執(zhí)行該順序節(jié)點(diǎn)的各個(gè)子節(jié)點(diǎn),只有存在一個(gè)子節(jié)點(diǎn)執(zhí)行后返回執(zhí)行失敗的通知消息,即停止迭代,該順序節(jié)點(diǎn)向自身的父節(jié)點(diǎn)返回執(zhí)行失敗的通知消息,并且,所述父節(jié)點(diǎn)將自身狀態(tài)設(shè)置為執(zhí)行失敗狀態(tài);否則,只有當(dāng)所有子節(jié)點(diǎn)執(zhí)行后均返回執(zhí)行成功的通知消息后,該順序節(jié)點(diǎn)才向自身的父節(jié)點(diǎn)返回執(zhí)行成功的通知消息,然后,所述父節(jié)點(diǎn)將自身狀態(tài)設(shè)置為執(zhí)行成功狀態(tài)。

本發(fā)明的有益效果如下:

本發(fā)明提供的基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器,具有以下優(yōu)點(diǎn):可以在U3D中直接設(shè)計(jì)AI行為樹(shù),而不需要預(yù)先編輯各個(gè)樹(shù)節(jié)點(diǎn),從而簡(jiǎn)化了行為樹(shù)編輯過(guò)程;此外,該行為樹(shù)編輯器提供行為樹(shù)預(yù)覽功能,能夠方便快速的對(duì)編輯得到的行為樹(shù)效果進(jìn)行預(yù)覽,方便對(duì)編輯得到的行為樹(shù)進(jìn)行修改調(diào)試,從而全面提高了行為樹(shù)編輯效率。

附圖說(shuō)明

圖1為本發(fā)明提供的基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器的結(jié)構(gòu)原理圖;

圖2為本發(fā)明提供的行為樹(shù)預(yù)覽模塊執(zhí)行行為樹(shù)的流程示意圖。

具體實(shí)施方式

以下結(jié)合附圖對(duì)本發(fā)明進(jìn)行詳細(xì)說(shuō)明:

本發(fā)明提供一種基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器,是在U3D插件機(jī)制的基礎(chǔ)上,在U3D里面編寫(xiě)的一個(gè)可視化編輯行為樹(shù)的工具。該工具能直接在U3D里設(shè)計(jì)AI行為樹(shù),添加各種行為樹(shù)的樹(shù)節(jié)點(diǎn),例如,選擇節(jié)點(diǎn)、順序節(jié)點(diǎn)、行為節(jié)點(diǎn)或條件節(jié)點(diǎn)等,并能導(dǎo)出相應(yīng)的json文件格式的行為樹(shù)。當(dāng)實(shí)際運(yùn)行游戲時(shí),讀取記錄有AI行為樹(shù)的json文件,從而向游戲?qū)ο?,如主角、小怪、boss等指定相應(yīng)的AI行為樹(shù),實(shí)現(xiàn)對(duì)游戲?qū)ο蟮闹悄芸刂疲哂懈吲渲眯院透邤U(kuò)展性的優(yōu)勢(shì),利于策劃配置和程序的可擴(kuò)展。

具體的,結(jié)合圖1,行為樹(shù)編輯器包括行為樹(shù)編輯模塊、行為樹(shù)預(yù)覽模塊、行為樹(shù)導(dǎo)出模塊和行為樹(shù)導(dǎo)入模塊。以下分別詳細(xì)介紹這四個(gè)功能模塊:

(一)行為樹(shù)編輯模塊

行為樹(shù)編輯模塊提供行為樹(shù)編輯面板,用于編輯得到一顆行為樹(shù);即:在U3D中編輯已經(jīng)構(gòu)思好的一個(gè)行為樹(shù),,實(shí)現(xiàn)對(duì)各種樹(shù)節(jié)點(diǎn)的添加、刪除、修改參數(shù)以及查看所有節(jié)點(diǎn)的功能,實(shí)現(xiàn)行為樹(shù)的編輯功能。

行為樹(shù)編輯模塊具體包括行為樹(shù)編輯面板以及事件監(jiān)聽(tīng)器;所述行為樹(shù)編輯面板提供行為樹(shù)繪制區(qū)域;

所述事件監(jiān)聽(tīng)器用于對(duì)所述行為樹(shù)繪制區(qū)域進(jìn)行監(jiān)聽(tīng),具體監(jiān)聽(tīng)過(guò)程包括:

步驟1:當(dāng)監(jiān)聽(tīng)到所述行為樹(shù)繪制區(qū)域發(fā)生鼠標(biāo)右鍵點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域彈出操作面板,其中,所述操作面板包括:添加節(jié)點(diǎn)按鈕、刪除節(jié)點(diǎn)按鈕、上移當(dāng)前節(jié)點(diǎn)按鈕和下移當(dāng)前節(jié)點(diǎn)按鈕;其中,通過(guò)上移當(dāng)前節(jié)點(diǎn)按鈕和下移當(dāng)前節(jié)點(diǎn)按鈕,實(shí)現(xiàn)對(duì)當(dāng)前節(jié)點(diǎn)上移和下移的調(diào)節(jié),通過(guò)調(diào)整當(dāng)前節(jié)點(diǎn)的位置,最終調(diào)整了當(dāng)前節(jié)點(diǎn)在行為樹(shù)節(jié)點(diǎn)中的先后執(zhí)行順序,越向上靠近根節(jié)點(diǎn)的節(jié)點(diǎn),越先被執(zhí)行。

此外,當(dāng)選擇添加節(jié)點(diǎn)按鈕后,會(huì)彈出行為節(jié)點(diǎn)、條件節(jié)點(diǎn)、順序節(jié)點(diǎn)和選擇節(jié)點(diǎn)面板。這里的每一個(gè)行為節(jié)點(diǎn)和條件節(jié)點(diǎn)是需要具體的代碼來(lái)實(shí)現(xiàn),能夠使游戲中的對(duì)象產(chǎn)生相應(yīng)的行為。屬于具體的業(yè)務(wù)邏輯部分

步驟2:然后,所述事件監(jiān)聽(tīng)器對(duì)所述操作面板中的各個(gè)按鈕進(jìn)行監(jiān)聽(tīng),其中,操作面板中的各個(gè)按鈕需要具體的代碼實(shí)現(xiàn),能夠使游戲中的對(duì)象產(chǎn)生相應(yīng)的行為,屬于具體的業(yè)務(wù)邏輯部分,在具體實(shí)現(xiàn)上,可使本發(fā)明提供的行為樹(shù)編輯器對(duì)接業(yè)務(wù)邏輯模塊,將業(yè)務(wù)邏輯模塊所需的能夠產(chǎn)生具體控制行為的代碼直接傳輸?shù)叫袨闃?shù)編輯器,方便對(duì)具體行為樹(shù)的編輯。

對(duì)各個(gè)按鈕監(jiān)聽(tīng)過(guò)程,可區(qū)分以下四種情況:

1)當(dāng)監(jiān)聽(tīng)到所述添加節(jié)點(diǎn)按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域彈出節(jié)點(diǎn)類型面板,所述節(jié)點(diǎn)類型面板包含行為節(jié)點(diǎn)子按鈕、條件節(jié)點(diǎn)子按鈕、順序節(jié)點(diǎn)子按鈕和選擇節(jié)點(diǎn)子按鈕;然后,所述事件監(jiān)聽(tīng)器對(duì)所述節(jié)點(diǎn)類型面板中的各個(gè)子按鈕進(jìn)行監(jiān)聽(tīng),如果監(jiān)聽(tīng)到所述行為節(jié)點(diǎn)子按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域添加行為節(jié)點(diǎn);如果監(jiān)聽(tīng)到所述條件節(jié)點(diǎn)子按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域添加條件節(jié)點(diǎn);如果監(jiān)聽(tīng)到所述順序節(jié)點(diǎn)子按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域添加順序節(jié)點(diǎn);如果監(jiān)聽(tīng)到所述選擇節(jié)點(diǎn)子按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),向被點(diǎn)擊區(qū)域添加選擇節(jié)點(diǎn);然后,所述事件監(jiān)聽(tīng)器對(duì)已添加到所述行為樹(shù)繪制區(qū)域的行為節(jié)點(diǎn)、條件節(jié)點(diǎn)、順序節(jié)點(diǎn)或選擇節(jié)點(diǎn)進(jìn)行監(jiān)聽(tīng),當(dāng)監(jiān)聽(tīng)到所述行為節(jié)點(diǎn)發(fā)生節(jié)點(diǎn)雙擊事件時(shí),向被雙擊節(jié)點(diǎn)位置彈出包含有已配置的用于控制游戲角色的具體行為指令的選擇面板;然后,當(dāng)接收到所述選擇面板返回的具體行為指令時(shí),所述事件監(jiān)聽(tīng)器保存節(jié)點(diǎn)標(biāo)識(shí)和具體行為指令的對(duì)應(yīng)關(guān)系;

當(dāng)監(jiān)聽(tīng)到所述條件節(jié)點(diǎn)、所述順序節(jié)點(diǎn)或所述選擇節(jié)點(diǎn)發(fā)生節(jié)點(diǎn)雙擊事件時(shí),向被雙擊節(jié)點(diǎn)位置彈出節(jié)點(diǎn)屬性修改面板,當(dāng)接收到通過(guò)所述節(jié)點(diǎn)屬性修改面板發(fā)送的節(jié)點(diǎn)屬性時(shí),所述事件監(jiān)聽(tīng)器保存節(jié)點(diǎn)標(biāo)識(shí)和節(jié)點(diǎn)屬性的對(duì)應(yīng)關(guān)系;

2)當(dāng)監(jiān)聽(tīng)到所述刪除節(jié)點(diǎn)按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),所述事件監(jiān)聽(tīng)器將被點(diǎn)擊區(qū)域?qū)?yīng)的節(jié)點(diǎn)刪除;

3)當(dāng)監(jiān)聽(tīng)到所述上移當(dāng)前節(jié)點(diǎn)按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),所述事件監(jiān)聽(tīng)器將被點(diǎn)擊的當(dāng)前按鈕的子節(jié)點(diǎn)依次向上移動(dòng)一位;

4)當(dāng)監(jiān)聽(tīng)到所述下移當(dāng)前節(jié)點(diǎn)按鈕發(fā)生按鈕點(diǎn)擊事件時(shí),所述事件監(jiān)聽(tīng)器 將被點(diǎn)擊的當(dāng)前按鈕的子節(jié)點(diǎn)依次向下移動(dòng)一位。

(二)行為樹(shù)預(yù)覽模塊

為方便理解行為樹(shù)預(yù)覽模塊的執(zhí)行原理,首先對(duì)本發(fā)明提供的行為樹(shù)相關(guān)知識(shí)進(jìn)行介紹:

行為樹(shù)節(jié)點(diǎn)包括四類,順序節(jié)點(diǎn)、選擇節(jié)點(diǎn)、條件節(jié)點(diǎn)和行為節(jié)點(diǎn)。順序節(jié)點(diǎn)、選擇節(jié)點(diǎn)和條件節(jié)點(diǎn)可統(tǒng)稱為組合節(jié)點(diǎn)或控制節(jié)點(diǎn)。

其中,順序節(jié)點(diǎn)執(zhí)行本節(jié)點(diǎn)時(shí),迭代執(zhí)行自己的子節(jié)點(diǎn),只要遇到一個(gè)子節(jié)點(diǎn)執(zhí)行后返回執(zhí)行失敗False的消息,則停止迭代,并向自己的父節(jié)點(diǎn)也返回執(zhí)行失敗False的消息;否則,只有當(dāng)所有子節(jié)點(diǎn)均返回執(zhí)行成功True的消息時(shí),本節(jié)點(diǎn)才向自己的父節(jié)點(diǎn)返回True。相當(dāng)于邏輯與運(yùn)算。

選擇節(jié)點(diǎn)執(zhí)行本節(jié)點(diǎn)時(shí),迭代執(zhí)行自己所有的子節(jié)點(diǎn)。如遇到一個(gè)子節(jié)點(diǎn)執(zhí)行后返回True,則停止迭代,并向自己的父節(jié)點(diǎn)也返回True;否則,只有所有的子節(jié)點(diǎn)均返回False,本節(jié)點(diǎn)才向自己的父節(jié)點(diǎn)返回False。相當(dāng)于邏輯或運(yùn)算。

整棵行為樹(shù)中,只有行為節(jié)點(diǎn)才能成為葉子節(jié)點(diǎn),而也只有子節(jié)點(diǎn)才是需要特別定制的節(jié)點(diǎn),程序?qū)崿F(xiàn)上需要根據(jù)邏輯編寫(xiě)具體實(shí)現(xiàn)的子類繼承之;組合節(jié)點(diǎn)不能作為葉子節(jié)點(diǎn),主要作用是用于控制行為樹(shù)中的決策走向。

任何節(jié)點(diǎn)被執(zhí)行后,必須向其父節(jié)點(diǎn)報(bào)告執(zhí)行結(jié)果,執(zhí)行成功(True)或執(zhí)行失敗(False)。這簡(jiǎn)單的成功失敗匯報(bào)原則被很巧妙地用于控制整棵樹(shù)的決策方向。

為了程序方便控制行為樹(shù)每一次決策的走向流程,規(guī)定所有節(jié)點(diǎn)具有4個(gè)狀態(tài)。分別是初始狀態(tài)Init(即本次的行為樹(shù)迭代一開(kāi)始時(shí)所有節(jié)點(diǎn)的狀態(tài)),正在執(zhí)行的懸掛狀態(tài)Pending(即該節(jié)點(diǎn)或者其中某一個(gè)子節(jié)點(diǎn)正在被執(zhí)行且沒(méi)有執(zhí)行完畢),執(zhí)行成功狀態(tài)Finish,執(zhí)行失敗狀態(tài)Fail。只要有一個(gè)子節(jié)點(diǎn)是Pending狀態(tài),包括所有孫子節(jié)點(diǎn),那么該節(jié)點(diǎn)就一定是Pending狀態(tài)。子節(jié)點(diǎn)執(zhí)行成功和失敗后需要向父節(jié)點(diǎn)返回結(jié)果。

上述過(guò)程中,子節(jié)點(diǎn)并非局限于某個(gè)節(jié)點(diǎn)的兒子節(jié)點(diǎn),也包括孫子節(jié)點(diǎn)等,是某個(gè)節(jié)點(diǎn)的所有后代節(jié)點(diǎn)。

基于上述設(shè)計(jì)原則,行為樹(shù)預(yù)覽模塊具體執(zhí)行過(guò)程為:

順序節(jié)點(diǎn)、選擇節(jié)點(diǎn)和條件節(jié)點(diǎn)可統(tǒng)稱為組合節(jié)點(diǎn)或控制節(jié)點(diǎn),是一類具有子節(jié)點(diǎn)的一種節(jié)點(diǎn),而行為節(jié)點(diǎn)屬于葉子節(jié)點(diǎn),是沒(méi)有子節(jié)點(diǎn)的一種節(jié)點(diǎn)。

所述行為樹(shù)預(yù)覽模塊用于將所述行為樹(shù)編輯模塊編輯得到的行為樹(shù)輸入到預(yù)存儲(chǔ)游戲場(chǎng)景中的某個(gè)游戲角色中,通過(guò)所述行為樹(shù)控制所述游戲角色的動(dòng)作,并播放所述行為樹(shù)對(duì)所述游戲角色的控制過(guò)程,實(shí)現(xiàn)對(duì)編輯得到的行為樹(shù)運(yùn)行過(guò)程的預(yù)覽;

行為樹(shù)預(yù)覽模塊對(duì)所述行為樹(shù)的運(yùn)行過(guò)程進(jìn)行預(yù)覽,具體包括以下步驟:

S1,所述行為樹(shù)預(yù)覽模塊設(shè)置行為樹(shù)中的節(jié)點(diǎn)具有4個(gè)狀態(tài),分別為初始狀態(tài)、懸掛狀態(tài)、執(zhí)行成功狀態(tài)和執(zhí)行失敗狀態(tài);

其中,所述初始狀態(tài)是指:在最初第一次執(zhí)行根節(jié)點(diǎn)之前,行為樹(shù)中所有節(jié)點(diǎn)均為初始狀態(tài);

所述懸掛狀態(tài)是指:當(dāng)某個(gè)節(jié)點(diǎn)正在被執(zhí)行時(shí),或者,當(dāng)某個(gè)節(jié)點(diǎn)的任意一個(gè)子節(jié)點(diǎn)正在被執(zhí)行且沒(méi)有執(zhí)行完畢時(shí),該節(jié)點(diǎn)即為懸掛狀態(tài)的節(jié)點(diǎn);

S2,設(shè)需執(zhí)行的行為樹(shù)共有n層,按自上而下順序,依次記為:第1層、第2層…第n層;其中,n為自然數(shù);第1層即為根節(jié)點(diǎn);第n層即為葉子節(jié)點(diǎn),所述葉子節(jié)點(diǎn)均為行為節(jié)點(diǎn);所述非葉節(jié)點(diǎn),即:第1層節(jié)點(diǎn)到第n-1層節(jié)點(diǎn),均為控制節(jié)點(diǎn);

S3,每隔預(yù)設(shè)時(shí)間間隔,即執(zhí)行一次根節(jié)點(diǎn),執(zhí)行方法如圖2所示,包括以下步驟:

S3.1,在當(dāng)前時(shí)刻,所述行為樹(shù)預(yù)覽模塊執(zhí)行第1層節(jié)點(diǎn),即:讀取所述第1層節(jié)點(diǎn)的狀態(tài),判斷所述第1層節(jié)點(diǎn)當(dāng)前是否為懸掛狀態(tài),如果是,則執(zhí)行S3.2-S3.5;如果否,則執(zhí)行S3.6;

S3.2,所述行為樹(shù)預(yù)覽模塊讀取各個(gè)所述第2層節(jié)點(diǎn),查找到當(dāng)前為懸掛狀態(tài)的第2層節(jié)點(diǎn),記為:節(jié)點(diǎn)2.x;其中,當(dāng)所述第1層節(jié)點(diǎn)為懸掛狀態(tài)時(shí),其兒子節(jié)點(diǎn)中有且僅有一個(gè)節(jié)點(diǎn)為懸掛狀態(tài);

S3.3,所述行為樹(shù)預(yù)覽模塊執(zhí)行節(jié)點(diǎn)2.x的懸掛函數(shù),同時(shí)判斷所述節(jié)點(diǎn)2.x是否為葉子節(jié)點(diǎn),如果否,則執(zhí)行S3.4;否則,直接執(zhí)行S3.5;

S3.4,所述行為樹(shù)預(yù)覽模塊繼續(xù)遞歸執(zhí)行節(jié)點(diǎn)2.x的子孫節(jié)點(diǎn)的懸掛函數(shù), 直到執(zhí)行到葉子節(jié)點(diǎn),然后執(zhí)行S3.5;其中,整根行為樹(shù)有且僅有一條分支的各節(jié)點(diǎn)處于懸掛狀態(tài);

S3.5,所述行為樹(shù)預(yù)覽模塊執(zhí)行葉子節(jié)點(diǎn)的懸掛函數(shù);所述葉子節(jié)點(diǎn)的懸掛函數(shù)直接導(dǎo)致游戲?qū)ο蟮男袨榘l(fā)生變化;

S3.6,當(dāng)所述第1層節(jié)點(diǎn)不為懸掛狀態(tài)時(shí),所述行為樹(shù)預(yù)覽模塊根據(jù)第1層節(jié)點(diǎn)的類型,遍歷執(zhí)行各個(gè)第2層節(jié)點(diǎn),

如果某個(gè)第2層節(jié)點(diǎn)為行為節(jié)點(diǎn),則直接執(zhí)行該行為節(jié)點(diǎn),并將執(zhí)行結(jié)果返回給所述第1層節(jié)點(diǎn);所述第1層節(jié)點(diǎn)根據(jù)所接收到的執(zhí)行結(jié)果,改變自身狀態(tài);

如果某個(gè)第2層節(jié)點(diǎn)為選擇節(jié)點(diǎn),則該選擇節(jié)點(diǎn)迭代執(zhí)行該選擇節(jié)點(diǎn)的各個(gè)子節(jié)點(diǎn),如果某個(gè)子節(jié)點(diǎn)執(zhí)行后返回執(zhí)行失敗的通知消息,則繼續(xù)迭代執(zhí)行其他子節(jié)點(diǎn);只要存在一個(gè)子節(jié)點(diǎn)執(zhí)行后返回執(zhí)行成功的通知消息,即停止迭代,該選擇節(jié)點(diǎn)向自身的父節(jié)點(diǎn)返回執(zhí)行成功的通知消息,然后,所述父節(jié)點(diǎn)將自身狀態(tài)設(shè)置為執(zhí)行成功狀態(tài);否則,如果所有子節(jié)點(diǎn)執(zhí)行后均返回執(zhí)行失敗的通知消息,則:所述父節(jié)點(diǎn)將自身狀態(tài)設(shè)置為執(zhí)行失敗狀態(tài);

如果某個(gè)第2層節(jié)點(diǎn)為順序節(jié)點(diǎn),則該順序節(jié)點(diǎn)迭代執(zhí)行該順序節(jié)點(diǎn)的各個(gè)子節(jié)點(diǎn),只有存在一個(gè)子節(jié)點(diǎn)執(zhí)行后返回執(zhí)行失敗的通知消息,即停止迭代,該順序節(jié)點(diǎn)向自身的父節(jié)點(diǎn)返回執(zhí)行失敗的通知消息,并且,所述父節(jié)點(diǎn)將自身狀態(tài)設(shè)置為執(zhí)行失敗狀態(tài);否則,只有當(dāng)所有子節(jié)點(diǎn)執(zhí)行后均返回執(zhí)行成功的通知消息后,該順序節(jié)點(diǎn)才向自身的父節(jié)點(diǎn)返回執(zhí)行成功的通知消息,然后,所述父節(jié)點(diǎn)將自身狀態(tài)設(shè)置為執(zhí)行成功狀態(tài)。

本發(fā)明中,每隔設(shè)定時(shí)間,例如10幀左右,即執(zhí)行一次根節(jié)點(diǎn),不斷對(duì)某個(gè)游戲角度的行為角色進(jìn)行控制,根據(jù)迭代次數(shù)根據(jù)預(yù)覽需求而定,從而實(shí)現(xiàn)對(duì)行為樹(shù)執(zhí)行效果的預(yù)覽功能。

(三)行為樹(shù)導(dǎo)出模塊

所述行為樹(shù)導(dǎo)出模塊用于將預(yù)覽成功的所述行為樹(shù)以特定數(shù)據(jù)結(jié)構(gòu)導(dǎo)出,供游戲運(yùn)行時(shí)調(diào)用;

具體的,行為樹(shù)編輯后,以合適的數(shù)據(jù)結(jié)構(gòu)導(dǎo)出行為樹(shù)。例如,使用Json數(shù)據(jù)格式導(dǎo)出行為樹(shù),在游戲運(yùn)行時(shí),讀取導(dǎo)出的行為樹(shù)文件,通過(guò)解析該文 件得到對(duì)應(yīng)的行為樹(shù),然后將行為樹(shù)賦給游戲?qū)ο?,控制其相?yīng)的行為。

具體實(shí)現(xiàn)上,可以采用MiniJSON反序列化字符串和序列化Json,從而將json導(dǎo)出成字符串并存到文件中,并且可以從文件中的字符串解析成json,實(shí)現(xiàn)行為樹(shù)導(dǎo)出或?qū)牍δ堋?/p>

(四)行為樹(shù)導(dǎo)入模塊

所述行為樹(shù)導(dǎo)入模塊用于將已導(dǎo)出的所述行為樹(shù)再次導(dǎo)入到所述行為樹(shù)編輯模塊,通過(guò)所述行為樹(shù)編輯模塊對(duì)所述行為樹(shù)進(jìn)行改進(jìn)。當(dāng)然,對(duì)于前一次尚未編輯完成的行為樹(shù),也可以通過(guò)行為樹(shù)導(dǎo)入模塊導(dǎo)入到行為樹(shù)編輯模塊,繼續(xù)對(duì)該未編輯完成的行為樹(shù)進(jìn)行編輯操作。

本發(fā)明提供的行為樹(shù)編輯器,是在EditorWindow的OnGUI函數(shù)中實(shí)現(xiàn)繪制界面功能的模塊。包括繪制按鈕區(qū)域、繪制行為樹(shù)區(qū)域。繪制按鈕區(qū)域提供導(dǎo)出按鈕、導(dǎo)入按鈕和預(yù)覽按鈕,按鈕的繪制只需要調(diào)用GUILayout.Button即可實(shí)現(xiàn)。存儲(chǔ)行為樹(shù)的數(shù)據(jù)結(jié)構(gòu)可以用C#的Queue,Queue的每一項(xiàng)是自定義的TreeNode類,TreeNode類的基本屬性包括當(dāng)前節(jié)點(diǎn)的孩子節(jié)點(diǎn)和深度。此外,還需要有行為樹(shù)節(jié)點(diǎn)的點(diǎn)擊處理回調(diào),包括右鍵節(jié)點(diǎn)彈出添加刪除節(jié)點(diǎn)小面板,雙擊節(jié)點(diǎn)彈出面板修改節(jié)點(diǎn)屬性。編輯器編輯模塊的核心功能是將用戶在編輯器外構(gòu)思出的樹(shù)完整地在Unity3d中編輯出來(lái),并且導(dǎo)出成所需的格式,并一鍵賦到游戲?qū)ο笊希瑢?shí)現(xiàn)對(duì)編輯得到的行為樹(shù)執(zhí)行效果的預(yù)覽,從而方便對(duì)編輯得到的行為樹(shù)進(jìn)行修改調(diào)試,從而全面提高了行為樹(shù)編輯效率。

綜上所述,本發(fā)明提供的基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器,具有以下優(yōu)點(diǎn):可以在U3D中直接設(shè)計(jì)AI行為樹(shù),而不需要預(yù)先編輯各個(gè)樹(shù)節(jié)點(diǎn),從而簡(jiǎn)化了行為樹(shù)編輯過(guò)程;此外,該行為樹(shù)編輯器提供行為樹(shù)預(yù)覽功能,能夠方便快速的對(duì)編輯得到的行為樹(shù)效果進(jìn)行預(yù)覽,方便對(duì)編輯得到的行為樹(shù)進(jìn)行修改調(diào)試,從而全面提高了行為樹(shù)編輯效率。

以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視本發(fā)明的保護(hù)范圍。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1