Unity3D热更新全书-脚本(五) NGUI
让我们实际的研究一下如何将NGUI和C#LightEvil结合起来。
这里使用NGUI2.7,因为他是一个开源的版本,NGUI最新的版本未经作者的许可,是不可以带入我们的开源项目使用的。



这个例子完成的功能是从NGUI例子里找出了三个界面,按最下方的按钮依次进行切换
这是在之前的框架演示Mode1的基础上做的
由一个状态机去进行驱动,这也是我推荐各位使用脚本的方式。
《=这是脚本,也是程序
Mode1的模式是定义一个接口类,然后由脚本继承此类型实现,因为随时考虑AOT的缘故(要兼容IOS),我们的脚本有很多限制,比如不能运行时产生IL类型。
那么如果你熟悉AOT和JIT的机制,你一定会发现,脚本继承程序类型的是不可能的。
由于我们的脚本和C#语法兼容,所以,其实这个IState 会在程序中会和脚本中分别使用,他们是两个不同的东西。只是从语法上看起来一模一样。
《=这是程序
通过一个叫做ScriptInstanceState的类,他是程序中的IState,他的作用是调用脚本中的IState,通过这个类型,脚本状态和程序状态可以实现无缝切换。
绕口令来了:
在实际的游戏中,你可以一部分状态用程序实现,一部分状态用脚本实现。
由于我们的脚本是c#的严格子集,所有脚本实现的状态,作为程序也都可以正常执行。
程序实现的状态,对语法进行改写,改成C#Light可以通过的状态,也就可以作为脚本执行了。
先不管这个,其实无缝切换很简单,往这里看。
《=这是程序
s 就是状态,直接new 就是程序,从我们的粘合类ScriptInstanceState创建,就是脚本
大部分的操作都是没问题的
注意以下红字是旧的部分,新0.41Beta已经修改成
1.不强制使用event,所以不修改UIEventListener也可以挂事件,直接使用等号即可
2.修改了Reg机制,注册更简洁,不需要特别处理
黄字为新的部分。
《=这是脚本
不需修改UIEventListener,使用方法与代码一致

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,对功能没有任何不良影响。
《=这是脚本
这是脚本中的代码,比较偷懒使用了匿名函数,实际上建议你使用一个独立定义在脚本里的函数,记得我们是一个严格照顾AOT的项目么,匿名函数我们是不可能真的产生的。
他是一个模拟匿名的实现,为了闭包是有额外的开销的。
这里的onClick +=是 event的用法。,
《=这是程序
就是这里,需要把onclick前面加一个event,由于目前C#LightEvil只支持了对event的访问,不允许直接对delegate赋值。
《=这是程序
这个DeleType也要特别实现下,他的定义和Action<Gameobject>是一样的,只要将 RegHelper_DeleAction Copy过来修改一下就是了。
旧的部分
脚本注册回调并不是我推荐的方法,他实际上可以在IState里面定义一个OnClick事件,由程序处理,集中通过实现接口来完成。
这个例子专门使用了匿名,自定义事件,只是为了展示C#LightEvil的更多方面给大家看。
至于推荐的C#LightEvil使用方法,主要是通过一个接口来完成脚本和程序的对接,并且可以无缝切换。
Unity3D热更新全书-脚本(五) NGUI的更多相关文章
- Unity3D热更新全书-脚本(一) 初识脚本
开篇之前还是要先说明,这是一份给经验并不丰富的程序员阅读的文字. 有需求.有疑惑,往下看. 第一个问题什么是脚本?程序和脚本如何区分?我们给Unity编写的组件是程序还是脚本? 这些问题本文无意去解答 ...
- Unity3D热更新全书-脚本(三) C#LightEvil语法与调试
调试,这是一个无法规避的问题 C#Light 由于有 词法解释.语法解释.运行时三种情况 所以和C#也是有类似的问题 出错大致可以分为编译错误和运行时错误 拼写出莫名的东西或者语法不正确,会在编译阶段 ...
- Unity3D热更新全书-脚本(二) 两级分化
上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...
- Unity3D热更新全书-脚本(四) 用C#LightEvil搭建实际开发使用的脚本框架
C#LightEvil之前提供了很多和Unity结合的例子,都是采用把脚本文件放置在StreamingAssets中的方法. 这样可以利用Unity的特性,放在这个目录中的CS文件会被编译器编译,我们 ...
- Unity3D热更新全书-PageZero
由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...
- Unity3D热更新全书FAQ
只要有程序员朋友们问过两次的问题 就会收录在此FAQ中 1.C#Light对比LUA有什么好处 C#Light是静态类型脚本语言,语法同C#,Lua是动态类型脚本语言,这两种都有人喜欢. 我更喜欢静态 ...
- Unity3D热更新全书-重头再来
之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但 ...
- Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...
- Unity3d热更新全书-加载(一)从AssetBundle说起
Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle. 我们也来说说AssetBundle 我们试全面的分析一下Unity3 ...
随机推荐
- js获取新浪天气接口
<!doctype html> <html class="no-js fixed-layout"> <head> <meta charse ...
- 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- 如何在win上搭建SVN服务器
本博文转自:http://www.cnblogs.com/armyfai/p/3985660.html SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本, ...
- hdu 5976 Detachment
Detachment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- SAX解析xml文件
需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...
- Centos 反向代理创建资料
1. yum update 2. sh centos.sh 3. sh upgrade_nginx.sh nginx 1.7.0 4. cd /usr/local/nginx/conf/ upload ...
- allegro中焊盘的设置
用Cadence的pad designer制作pad的时候会遇到为thermal relief和anti pad设计尺寸的问题 Thermal relief:正规的中文翻译应该叫做防散热PAD.它主要 ...
- React Ntive 学习手记
React使今年来比较热门的前端库,之所以说是库呢,因为React.js是应用于MVC中的V层, 它并不是一个完整的MVC框架,所以,我也不知称之为框架了. 不过这并不影响React的火热. 混合应用 ...
- JAVA里面的IO流(二)方法1、输入流
- [LeetCode] 423 Reconstruct Original Digits from English
Given a non-empty string containing an out-of-order English representation of digits 0-9, output the ...