ETH官方钱包

前往
大廳
主題 達(dá)人專欄

[Unity x 資料驅(qū)動(dòng) #2] 在XML定義Global與Local事件,讓dll之間自己溝通吧!

%%鼠 拒收病婿 | 2022-11-10 23:15:06 | 巴幣 1540 | 人氣 712

前言
程式碼一樣在個(gè)人網(wǎng)站上閱讀比較舒服~

勘誤
  • 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好擴(kuò)充?
原本用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:

送禮物贊助創(chuàng)作者 !
0
留言

創(chuàng)作回應(yīng)

貓貓風(fēng) ?●ω●?
一直想學(xué)這個(gè) 可是又不知道怎麼開始比較好OAO 有沒有什麼建議嗎 ><?
2022-11-16 02:10:09
追蹤 創(chuàng)作集

作者相關(guān)創(chuàng)作

相關(guān)創(chuàng)作

更多創(chuàng)作