• Unity3D热更新全书-脚本(五) NGUI


    让我们实际的研究一下如何将NGUI和C#LightEvil结合起来。

    这里使用NGUI2.7,因为他是一个开源的版本,NGUI最新的版本未经作者的许可,是不可以带入我们的开源项目使用的。

    imageimageimage

    这个例子完成的功能是从NGUI例子里找出了三个界面,按最下方的按钮依次进行切换

    这是在之前的框架演示Mode1的基础上做的

    由一个状态机去进行驱动,这也是我推荐各位使用脚本的方式。

    image《=这是脚本,也是程序

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

  • 相关阅读:
    How to change the generated method stub code for C#
    White Paper: Microsoft Data Platform Development
    spring2.5jar包和配置文件总结
    自定义拦截器
    spring+jdbc开发
    Spring Aop支持的两种方式
    C#中Aop编程
    struts2整合spring
    批处理命令总结
    利用datawindow或者datastore的saveas方法导出excell文件,然后修改中文表头
  • 原文地址:https://www.cnblogs.com/crazylights/p/3906048.html
Copyright © 2020-2023  润新知