VOOZH about

URL: https://read01.com/kLg445.html

⇱ 李劍英的CSLight入門指南結合NGUI熱更新 - 壹讀


Saturday, Apr 11, 2026

李劍英的CSLight入門指南結合NGUI熱更新

2014/08/11 來源:cnblogs

一. CSLIGHT 作者簡介

CSLight的作者是李劍英,一個有著美麗心靈的遊戲圈程式設計師,群中人稱李總,他的技術群是:【低端編程高端研究–223823428】。

二. CSLIGHT 為何而生

CSLight 最初出現的目的是為了解決Unity3D在IOS平台上的代碼熱更新的問題。 因為IOS平台上的代碼熱更新問題無法通過Mono Reflection機制來解決,故而只能引入腳本。

目前市面上的U3D腳本解決方案不多,被聽說過的大致有三種: CSLight UniLua SSharp,三者中CSLight的優點較為出眾:

1. 腳本執行性能最佳, 這個是因為李總的CSLight腳本解釋器實現的非常輕量, 不刻意追求語言基礎設施的完善性,

在保證充分可用性的前提下,完全的走實用主義道路,故而執行性能最佳。

2. 腳本語法兼容U3D項目開發中的標配C# 語言的大多數常用語法,藉助李總的CSLightFramework,

可以在源文件級別上一定程度的做到 原生C# 和 腳本C# 文件的無縫切換。

3. CSLight有商業嚴肅項目的考驗經歷。

故,CSLight是Unity3D腳本解決方案的充分可行之選。

三. CSLIGHT 框架說明

CSLight從宏觀上來看,只有兩個部分,一個是CSLight解釋器,另一個是CSLight框架。

對於剛接觸CSLight的新人來說,CSLight最重要的是CSLight框架→ CSLightFramework,這個輕量級的框架設計的很漂亮, 這裡先大致掃一眼該框架的結構和類圖:

👁 Image
...

這個框架簡潔優雅的實現了如下的兩個目的:

1. 開發者可以快速的上手開發,通過框架的封裝,使得開發者不需要關心底層解釋器的機制。

2. 藉助框架,一個C# 腳本文件,可以選擇以【原生模式(Mono虛擬機)】 或 【CSLight腳本模式(CSLight解釋器)】這兩種不同的執行模式來運行。

那麼為何需要兩種運行模式呢?這是為了方便在IDE中調試腳本代碼,因為只有在【原生模式】下運行才能借用IDE的斷點調試等功能。可等代碼穩定之後再切換到【CSLight腳本模式】。

參照上面的類結構圖:

【原生模式的執行】是通過CodeFile_Debug類 的包裝來達成的,其藉助了反射機制來做到本地化運行。

【CSLight腳本模式的執行】是通過 CodeFile_CLScript類 的包裝來達成的,其調用了CSLight底層解釋器的接口來做到解釋型的運行。

嗯,是時候需要一個典型的HelloWorld的例子,來進一步的理解這個框架了,這裡就用經常有人問到的【CSLight如何與NGUI交互】來作為例子。

嗯,One more thing,在進入入門示例章節之前,有個非常重要的問題必須要先提一下,就是【腳本】與【宿主環境】如何交互的問題!熟悉Lua的朋友會知道,Lua是通過

【設置Lua虛擬機堆棧】的這種方式來和C/C++的【宿主環境】進行交互的。那CSLight的【腳本】是如何與Unity3D原生C#的【宿主環境】進行交互的呢?嗯,答案是:在宿主環境中的自定義接口!

看一下CSLightFramework框架中 ICodeFile 的定義如下:
👁 Image
...

其中的泛型T 就是【腳本】與【宿主環境】之間交互的關鍵所在,也正是上文強調過的【在宿主環境中的自定義接口】!

下面開始進行【CSLight如何與NGUI進行交互】的實例演示。

四. CSLIGHT 入門示例 — CSLIGHT 如何與 NGUI 進行交互

一個有意義的,同時又簡潔的示例不太好找。這裡隨便選的一個示例是:【如何用CSLight腳本來控制NGUI中一個元素的縮放。】

雖然這個例子本身沒有實際的意義,但通過這個例子搞懂框架的原理後,就可以很容易的做出一大堆有意義的事情來。

1. 新建一個Unity3D工程和場景,並把CSLight和CSLightFramework 這兩份工程代碼拷貝進去。

2. 新建一個NGUI_Root,並在 默認的Panel 節點下新建一個UISprite,然後隨便弄個圖片顯示。

此時的大概情形如下所示:

👁 Image
...
3. 在項目中新建一個代碼接口文件,作為【在宿主環境中的自定義接口】,大致如下面所示的樣子:

👁 Image
...

其中第一個接口:SetNGUIElementScale(float scale); 設置NGUI某個元素的縮放,這個就沒什麼好說的了,屆時CSLight腳本會調用這個宿主環境中的接口,傳入想要縮放的數值。

其中第二個接口:IScript對象的getter方法,這個也沒什麼好說的,這個接口是框架約定必須要實現的,因為CSLight腳本方法之間的互相調用需要用到這個。

4. 回到Unity3D中,在NGUI默認生成的那個Panel 對象上綁定一個控制腳本(繼承自MonoBehaviour),比如叫 TestController .cs,大體情形如下圖所示:(記得要給那個 UISprite 對象賦上引用)

👁 Image
...

5. 通過繼承框架中的 ScriptMgr類來創建自己的腳本管理器,代碼大致如下圖所示:

👁 Image
...


注意這一步需要繼承並實現 ICLS_Logger 的三個接口(Log, Log_Warn, Log_Error),因為在 ScriptMgr 腳本管理器 實例化的時候,構造函數需要一個實現了ICLS_Logger 的對象作為參數。6. 開始編寫CSLight 真.腳本文件 :Script_Test .cs,如下圖所示,注意這個腳本文件要放到 Assets/StreamingAssets 目錄中,以方便後面使用WWW來加載,用於模擬熱更新時的遠程腳本加載機制。

👁 Image
...
這個 真.腳本文件 的寫法有幾處地方要特別注意:

6.1 所有的方法必須是靜態方法,否則無法切換到【原生模式】來運行,也就無法用IDE來Debug了,這是框架內用反射模擬原生模式時的約定。

6.2 必須有一個靜態方法名叫:_new,類似 int main { } 。

6.3 每個靜態方法之間不能直接互相調用,需要通過圖片中注釋的說明方法來調用.

6.4 所有方法的第一個參數,必須是 【宿主環境中的接口】→ Interface_Test 對象.

7. 最後一步: 在TestController .cs 中繼承並實現 【宿主環境中的接口】,然後加載上面的那個腳本並執行。

7.1 實現【宿主環境中的接口】→ Interface_Test,代碼如下所示:

👁 Image
...


7.2 加載腳本並執行,代碼如下所示:

👁 Image
...


至此,這個例子就結束了。
您可能感興趣
免責聲明:本文內容來源于cnblogs,文章觀點不代表壹讀立場,如若侵犯到您的權益,或涉不實謠言,敬請向我們提出檢舉
最新文章 / 服務條款 / 私隱保護 / DMCA / 聯絡我們

壹讀/READ01.COM