Unity3D熱更新全書-腳本(五) NGUI

讓咱們實際的研究一下如何將NGUI和C#LightEvil結合起來。c#

這裏使用NGUI2.7,由於他是一個開源的版本,NGUI最新的版本未經做者的許可,是不能夠帶入咱們的開源項目使用的。閉包

 

imageimageimage

這個例子完成的功能是從NGUI例子裏找出了三個界面,按最下方的按鈕依次進行切換框架

這是在以前的框架演示Mode1的基礎上作的函數

由一個狀態機去進行驅動,這也是我推薦各位使用腳本的方式。3d

image《=這是腳本,也是程序blog

Mode1的模式是定義一個接口類,而後由腳本繼承此類型實現,由於隨時考慮AOT的緣故(要兼容IOS),咱們的腳本有不少限制,好比不能運行時產生IL類型。繼承

那麼若是你熟悉AOT和JIT的機制,你必定會發現,腳本繼承程序類型的是不可能的。接口

因爲咱們的腳本和C#語法兼容,因此,其實這個IState 會在程序中會和腳本中分別使用,他們是兩個不一樣的東西。只是從語法上看起來如出一轍。遊戲

image《=這是程序事件

經過一個叫作ScriptInstanceState的類,他是程序中的IState,他的做用是調用腳本中的IState,經過這個類型,腳本狀態和程序狀態能夠實現無縫切換。

繞口令來了:

在實際的遊戲中,你能夠一部分狀態用程序實現,一部分狀態用腳本實現。

因爲咱們的腳本是c#的嚴格子集,全部腳本實現的狀態,做爲程序也均可以正常執行。

程序實現的狀態,對語法進行改寫,改爲C#Light能夠經過的狀態,也就能夠做爲腳本執行了。

先無論這個,其實無縫切換很簡單,往這裏看。

image《=這是程序

s 就是狀態,直接new 就是程序,從咱們的粘合類ScriptInstanceState建立,就是腳本

大部分的操做都是沒問題的

 

注意如下紅字是舊的部分,新0.41Beta已經修改爲

1.不強制使用event,因此不修改UIEventListener也能夠掛事件,直接使用等號便可

2.修改了Reg機制,註冊更簡潔,不須要特別處理

黃字爲新的部分。

image《=這是腳本

不需修改UIEventListener,使用方法與代碼一致

image

RegHelper_DeleAction<GameObject>的意思是,咱們註冊的委託類型

是 void xxx(GameObject p1) 的形式。由於VoidDelegate就是這個形式

若是咱們要註冊一個 void xxx(int p0,string p1)的委託類型 就用RegHelper_DeleAction<int,string>

不需獨立實現,用RegHelper_DeleAction便可

新部分結束

舊的部分

有一個比較討厭的地方是回調,這裏C#LightEvil 處於嚴謹的考慮只支持了對event的訪問,而NGUI的使用卻不是event

這裏咱們能夠修改一下NGUI,對功能沒有任何不良影響。

image《=這是腳本

這是腳本中的代碼,比較偷懶使用了匿名函數,實際上建議你使用一個獨立定義在腳本里的函數,記得咱們是一個嚴格照顧AOT的項目麼,匿名函數咱們是不可能真的產生的。

他是一個模擬匿名的實現,爲了閉包是有額外的開銷的。

這裏的onClick +=是 event的用法。,

image《=這是程序

就是這裏,須要把onclick前面加一個event,因爲目前C#LightEvil只支持了對event的訪問,不容許直接對delegate賦值。

image《=這是程序

這個DeleType也要特別實現下,他的定義和Action<Gameobject>是同樣的,只要將 RegHelper_DeleAction Copy過來修改一下就是了。

舊的部分

 

腳本註冊回調並非我推薦的方法,他實際上能夠在IState裏面定義一個OnClick事件,由程序處理,集中經過實現接口來完成。

 

這個例子專門使用了匿名,自定義事件,只是爲了展現C#LightEvil的更多方面給你們看。

 

至於推薦的C#LightEvil使用方法,主要是經過一個接口來完成腳本和程序的對接,而且能夠無縫切換。

相關文章
相關標籤/搜索