1.一種基于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)。
2.根據(jù)權(quán)利要求1所述的基于U3D插件機(jī)制實(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)按鈕;
步驟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)一位。
3.根據(jù)權(quán)利要求1所述的基于U3D插件機(jī)制實(shí)現(xiàn)的行為樹(shù)編輯器,其特征在于,所述行為樹(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)。