Unity 熱更新例項一、C#Light 和UI系統使用例項

瘋光無線發表於2014-03-21

接下來我會運用熱更新的機制,逐步製作一些例子來闡釋指令碼系統如何和Unity結合。

指令碼不限於使用C#Lite,但是C#Lite會有一些便利之處,請往下看。

結合機制也不限於這一種,但是C#Lite的設計比較傾向於,不讓指令碼管理狀態,不讓指令碼迴圈執行,每一段指令碼就相當於一個函式。

所以C#Lite不會考慮從指令碼內定義新的型別和函式這件事,如果要互相呼叫,可以讓指令碼內直接呼叫另一個指令碼。

 

image

今天帶來的是一個指令碼系統控制的介面,這個介面完全是用指令碼程式碼產生的,這個介面系統不用指令碼也可以使用,大家一看就知道是用OnGUI製作的。

首先是初始化介面

image

我們通過這樣一個函式建立了如上介面,先不用關心介面系統,只是讓指令碼不用頻繁呼叫,做了一個樹結構把介面元素狀態起來。

並且指定了按鈕一按下時執行指令碼 btn01_click.cls指令碼,按鈕二按下時執行指令碼btn02_click.

image

在Start中呼叫codeInit 這個介面就出現了

 

現在還是程式的寫法,接下來,見證奇蹟的時刻來了。

只要把codeInit函式體內的內容完全複製到指令碼檔案中,就是指令碼了

imageimageimage

可以看到在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不詳細,不便於識別問題,也在積極改進中。

最終目標是讓指令碼和程式碼可以非常輕易的互換,即使出了錯,能詳細的提示清楚哪裡出錯,如何改。

好,接下來就讓指令碼來處理介面,讓程式碼下崗

見證奇蹟的時刻

image

簡單,把函式註釋掉,直接執行一個指令碼來解決問題。

執行場景,得到和程式碼執行完美一致的效果。

相關文章