前言
勘誤
- IActor類別一開始是定義為Interface,只是後來要做XML解析時(shí)發(fā)現(xiàn)不支援介面型態(tài),只好改成class,這種「想把它當(dāng)介面使用,但礙於情況只能定義為類別」的時(shí)候,命名規(guī)則會(huì)是依照實(shí)際型態(tài)(class)還是意圖(interface)呢?
上一篇我介面名稱為IActor其實(shí)是不太正確的,應(yīng)該說一開始改名成IActor的動(dòng)機(jī)是不對的。這種想要透過環(huán)境規(guī)定限制修改行為的稱為"Contract",是程式在規(guī)劃時(shí)要做好的管理。滿有趣的是,在[1]討論中看來Contract Class似乎也是可以以介面命名(?)。
原本用partial class 是想說未來可能有的dll的類別需要傳遞額外的資料,這樣僅須在該類別附加定義就好,但實(shí)際上跨dll的partial class是不能合併的[3]。在討論[2]中得出,partial class主要是用在自動(dòng)產(chǎn)生的程式上。
之後也許可以抽空了解更多軟體工程的詳細(xì),以前還沒實(shí)做時(shí)覺得都是紙上談兵,現(xiàn)在犯錯(cuò)後才能慢慢學(xué)習(xí)。
回顧,基本函數(shù)呼叫
上一篇只有簡單講到如何呼叫指定名稱的dll與方法,但實(shí)際上是不能寫死的,這回要談的是「如何在XML裡面指定觸發(fā)條件」。
上一篇的架構(gòu)圖:
*備註,以下部分程式碼為早期開發(fā)紀(jì)錄,實(shí)際以Github為主。
前置:XML實(shí)體宣告
由於有些值會(huì)一直重複出現(xiàn)(例如路徑),可以在一開頭宣告ENTITY物件,使用時(shí)只需 &變數(shù);
使用範(fàn)例:
前置:引入xsd檔
為了加速開發(fā)與減少錯(cuò)誤,我將XML規(guī)則打成檢查檔,可以在
Github查看。
在XML開頭引入即可。
Update掛載
首先用List型態(tài)紀(jì)錄各種觸發(fā)條件的資料,由trigger字串觸發(fā)的Event用字典型態(tài)將觸發(fā)紀(jì)錄<觸發(fā)訊息 , 方法>。
在讀取XML時(shí)加入:
在XML裡面定義一個(gè)「UPDATE時(shí) 呼叫TestDll下面的ActionDll.ForDebug類別的Prt方法,傳入?yún)?shù)為<para>標(biāo)籤的內(nèi)容。」
結(jié)果:
Input掛載與回傳
這邊是搭配舊版Unity InputSystem,須在InputManager那邊加入自定義Axies。
上面的程式是直接將Axies觸發(fā)的值裝在第一個(gè)參數(shù)回傳,因此我在XML多定義一個(gè)trig變數(shù)裝傳入值。
結(jié)果:
當(dāng)我按下左右鍵的時(shí)候,可以看到餐數(shù)有變動(dòng)。
冷卻機(jī)制
由於這個(gè)腳本工具的目標(biāo)是「通用RPG動(dòng)作管理」,所以怎麼能少了技能冷卻設(shè)定呢?
範(fàn)例: 玩家每間隔1.2秒才能跳躍,且跳躍觸發(fā)為InputSystem的"Vertical"。
用字典管理方法與對應(yīng)冷卻結(jié)束時(shí)間:
Event設(shè)計(jì)
當(dāng)初在想Event呼叫流程要怎麼個(gè)設(shè)計(jì)才好,我想到以下兩個(gè)方案:
最後選擇方法1,因?yàn)榉椒?無法傳遞資料 (如傷害數(shù)值…)。
在Contract類別(原介面)多宣告Event變數(shù),這邊分為本地與Global事件兩種。
Unity端負(fù)責(zé)呼叫
觸發(fā) (Global)
範(fàn)例:玩家觸發(fā)攻擊方法,怪物接收傷害。
由於這是外部的dll方法,無法使用Unity專案內(nèi)自己宣告的腳本,因此只能用比較原始的Tag比較等。
攻擊的XML
接收 (Global)
此為怪物的Dll內(nèi)定義的受傷的方法。
XML定義
觸發(fā)、接收 (Local)
怪物可能在遊戲內(nèi)自己受傷(例如撞到中立的尖刺物件),則是由Unity端的邏輯觸發(fā)Hurt方法,可使用Local的Event如下:
最後透過Global與Local事件,達(dá)成了有來有往的呼叫架構(gòu)。
[範(fàn)例]做個(gè)Ground Check
由於跳躍光是用冷卻時(shí)間限制還不夠完善,需要搭配Ground Check來檢查玩家是否站在地面上。
Dll 內(nèi)容:
XML: