接下來我會運用熱更新的機制,逐步製作一些例子來闡釋指令碼系統如何和Unity結合。
指令碼不限於使用C#Lite,但是C#Lite會有一些便利之處,請往下看。
結合機制也不限於這一種,但是C#Lite的設計比較傾向於,不讓指令碼管理狀態,不讓指令碼迴圈執行,每一段指令碼就相當於一個函式。
所以C#Lite不會考慮從指令碼內定義新的型別和函式這件事,如果要互相呼叫,可以讓指令碼內直接呼叫另一個指令碼。
今天帶來的是一個指令碼系統控制的介面,這個介面完全是用指令碼程式碼產生的,這個介面系統不用指令碼也可以使用,大家一看就知道是用OnGUI製作的。
首先是初始化介面
我們通過這樣一個函式建立了如上介面,先不用關心介面系統,只是讓指令碼不用頻繁呼叫,做了一個樹結構把介面元素狀態起來。
並且指定了按鈕一按下時執行指令碼 btn01_click.cls指令碼,按鈕二按下時執行指令碼btn02_click.
在Start中呼叫codeInit 這個介面就出現了
現在還是程式的寫法,接下來,見證奇蹟的時刻來了。
只要把codeInit函式體內的內容完全複製到指令碼檔案中,就是指令碼了
可以看到在Unity裡作為一個TextAsset存在,這就是熱更新的本質了,邏輯在資源裡,不是在程式碼裡。
C#Lite比別的指令碼語言更適合Unity的是,你完全可以把邏輯在程式裡寫好,再搬運到指令碼中,當然目前C#Lite還沒做到c#語法100%相容。
這裡有兩個問題要檢討一下:
一、我用了一個特別的寫法
CLUI_Node_Label label =(CLUI_Node_Label)objlabel;
而沒有使用c#中更適合的 as 表示式,就是因為C#Lite並沒有支援 as 表示式,只支援了對一個變數進行型別轉換。
另外C#Lite的數字識別不能識別0f,只能識別0。
這兩處已經加入buglist,積極改進中。
二、C#Lite的錯誤提示也不是太友好,只有幾種很簡單的提示,log不詳細,不便於識別問題,也在積極改進中。
最終目標是讓指令碼和程式碼可以非常輕易的互換,即使出了錯,能詳細的提示清楚哪裡出錯,如何改。
好,接下來就讓指令碼來處理介面,讓程式碼下崗
見證奇蹟的時刻
簡單,把函式註釋掉,直接執行一個指令碼來解決問題。
執行場景,得到和程式碼執行完美一致的效果。