
舉例來說,動作遊戲的人物基本都有跑、跳、攻擊、閃躲等方法,以前我做了一個工具來集中控制方法觸發的順序:開發者僅需在控制腳本上先預設幾種動作變數,填些他們的參數,之後就交給這個工具去排執行順序與冷卻時間等等。如此一來,開發者就可以專心地在呼叫動作與其他方法宣告,不用去管誰先誰後,不用去判斷該不該中斷目前行動等等問題。
但它有個缺點,就是資料帶不走! 也就是這個「腳本跟上面的參數」和物件綁死了,一個不小心可能會因為Unity的Reload導致參數不見,或移植別的物件時某些參數又要重新調整等等,時時都活在「參數」會不會不見的恐懼中! (其實也沒那麼嚴重。)
因此,隨著這次的新開發,就來做個新架構解決這個問題吧!

舊工具的描述,

新架構,新概念!
以前的文章有介紹過「邏輯分離的資料驅動」,那時候我是在Unity打包好方法接口,以物件的方式傳給lua(分離邏輯端),優點是Lua簡單上手、能像文本一樣跟物件打包帶走,缺點是接口必須事先定義好,且Unity不支援Lua使用動態include (在該文章中我用一個管理腳本回傳所需的接口模組,去模仿include的動作),且真正的"方法"還是在Unity內,Lua只是分離了「使用方法的邏輯」而已,若哪天要改還是得從內部改。
因此,我思考如何將掛在物件上的腳本(包含類別變數的方法、呼叫等)做成分離的資料。最好的方法應該是做成dll,但若dll需要跟遊戲內的資料互動的話,就也得在dll去ref那個架構才行。 到最後會變成一群dll檔去做互動,遊戲只是載入與執行的容器。
最終設計出這個架構,以下慢慢解釋:

DLL是甚麼?
Windows 用戶在自己裝函式庫到開發環境時應該常常看到「dll遺失」的error吧。 DLL (Dynamic-link library (動態連結函式庫)),可以說是打包的函式庫,直覺來說跟exe差別在於exe啟動後他會去直行進入點的方法(例如Main()函數),而dll就是可以用來存放方法的容器,需要時再從裡面找。
例如之前的專案,我在Unity中調用的OpenCV C++函式庫就是在跟Dll互動喔。
延伸閱讀:動態連結程式庫 (DLL) - Windows Client | Microsoft Learn
XML是什麼?
XML(可延伸標記式語言(Extensible Markup Language)),XML跟HTML一樣是標籤語言,常見於專案設定檔、網路API等等,詳細就不講古了單刀直入:「為什麼用XML?」
與最常拿來比較的"Json"來說,XML比Json老、比Json胖,但格式很明確、生態系完整。


不寫格式檢查可以嗎?


實際使用

建立Interface


- interface / abstract class無法被xml Serialize解析。
- partial 比concert class 多一點擴充空間。
Unity端Load XML



必要的耦合:Unity.dll

基本方法 和 傳遞資料




動態載入dll並呼叫方法

範例: 傳遞GameObject資料




