主題 達人專欄

【Unity + Lua】模組化遊戲第二步,程式邏輯分離實戰

岩王帝君的 %%鼠 | 2022-05-26 23:14:47 | 巴幣 2120 | 人氣 291

前言:
學著做模組化遊戲,關於Asset bundle製作可看上一篇文章:【Unity】 模組化遊戲的第一步,使用AssetBundle與圖形化介面管理

一樣程式碼放在個人網站上^^



Lua

是個語法簡單的直譯語言,輕量且執行速度快(接近C語言),因此很適合當作崁入程式。
*注意: Lua陣列從1開始
更多介紹:


moonsharp

Lua轉譯套件,適用於C#、.NET、Unity...平台。
Unity的可以在Asset store下載,或參考官方安裝教學:MoonSharp
以下內容基本的部分是學來自此教學影片:


載入Lua腳本

可以直接使用字串傳入。


使用Stream讀入腳本檔案

指派方法

假設目前有個管理UI的腳本:

我希望能用Lua指令設定UI上的文字,則可指派設定的方法給Lua腳本上的"SetText()"函數。

Lua腳本:

Lua Table

lua的物件資料都是儲存成字典型態。
例如使用table紀錄x,y,z:

C#設定table

Coroutine

現在有個以下Lua腳本,在開啟時會執行SetText("Happy"),接著等待直到呼叫繼續執行下一步。

C#使用:
先宣告MoonSharp的Coroutine類型

讀取文本

使用範例:


傳送Class

有時需要傳送一個自訂類別的資料,例如以下玩家資料:

使用範例:


將資料存在"State"變數內給Lua存取:
如此第一句會印出 Hi Lontoone! I'm a lua script



進階篇

模組化Lua

Lua可以透過引入其他腳本達到模組化管理。

可惜的是Unity的Moonsharp插件不能使用模組引入,至少我嘗試了好幾天都不成功,查到的可能原因是因為引入的路徑只能是系統環境變數路徑,但既然都要做模組化了,怎麼可能叫用戶把你的模組放在系統環境變數下?

若你做的是一般的console專案,可跟著官方教學引入模組:MoonSharp Script Loaders

我想的解決方案是做個註冊器去引入。例如我在Lua腳本宣告引入的變數

C#讀取array,附加特定模組


範例:以下是個物件的Lua腳本,當HP歸零時死亡並摧毀遊戲物件。

邏輯上gameobject資料並沒有傳給lua儲存,而是將該物件相關的方法委派給Lua。


最後實戰,將Lua腳本讀進可破壞的地形方塊:
當方塊hp歸零時,呼叫我定義的Map模組的ChangeSlot去修改地形,接著就交給Unity那邊處理了。




附錄:

  1. CLR、C#、Lua 數值對應MoonSharp 从一知到半解(1)_Shiheuan的博客-CSDN博客
送禮物贊助創作者 !
0
留言

創作回應

追蹤 創作集

作者相關創作

更多創作