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使用方法,主要是经过一个接口来完成脚本和程序的对接,而且能够无缝切换。

相关文章
相关标签/搜索