(转载)李剑英的CSLight入门指南结合NGUI热更新

时间:2021-09-16 01:37:03

原地址:http://www.xuanyusong.com/archives/3075

李剑英的CSLight入门指南
文档撰写者:Graphic
QQ: 1065147807

一. 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,这个轻量级的框架设计的很漂亮, 这里先大致扫一眼该框架的结构和类图:

(转载)李剑英的CSLight入门指南结合NGUI热更新

这个框架简洁优雅的实现了如下的两个目的:
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 的定义如下:

(转载)李剑英的CSLight入门指南结合NGUI热更新

其中的泛型T 就是【脚本】与【宿主环境】之间交互的关键所在,也正是上文强调过的【在宿主环境中的自定义接口】!
下面开始进行【CSLight如何与NGUI进行交互】的实例演示。

四. CSLIGHT 入门示例 — CSLIGHT 如何与 NGUI 进行交互

一个有意义的,同时又简洁的示例不太好找。这里随便选的一个示例是:【如何用CSLight脚本来控制NGUI中一个元素的缩放。】
虽然这个例子本身没有实际的意义,但通过这个例子搞懂框架的原理后,就可以很容易的做出一大堆有意义的事情来。

1. 新建一个Unity3D工程和场景,并把CSLight和CSLightFramework 这两份工程代码拷贝进去。
2. 新建一个NGUI_Root,并在 默认的Panel 节点下新建一个UISprite,然后随便弄个图片显示。
此时的大概情形如下所示:

(转载)李剑英的CSLight入门指南结合NGUI热更新

3. 在项目中新建一个代码接口文件,作为【在宿主环境中的自定义接口】,大致如下面所示的样子:
(转载)李剑英的CSLight入门指南结合NGUI热更新

其中第一个接口:SetNGUIElementScale(float scale); 设置NGUI某个元素的缩放,这个就没什么好说的了,届时CSLight脚本会调用这个宿主环境中的接口,传入想要缩放的数值。
其中第二个接口:IScript对象的getter方法,这个也没什么好说的,这个接口是框架约定必须要实现的,因为CSLight脚本方法之间的互相调用需要用到这个。

4. 回到Unity3D中,在NGUI默认生成的那个Panel 对象上绑定一个控制脚本(继承自MonoBehaviour),比如叫 TestController .cs,大体情形如下图所示:(记得要给那个 UISprite 对象赋上引用)
(转载)李剑英的CSLight入门指南结合NGUI热更新

5. 通过继承框架中的 ScriptMgr类来创建自己的脚本管理器,代码大致如下图所示:

(转载)李剑英的CSLight入门指南结合NGUI热更新
注意这一步需要继承并实现 ICLS_Logger 的三个接口(Log, Log_Warn, Log_Error),因为在 ScriptMgr 脚本管理器 实例化的时候,构造函数需要一个实现了ICLS_Logger 的对象作为参数。

6. 开始编写CSLight 真.脚本文件 :Script_Test .cs,如下图所示,注意这个脚本文件要放到 Assets/StreamingAssets 目录中,以方便后面使用WWW来加载,用于模拟热更新时的远程脚本加载机制。
(转载)李剑英的CSLight入门指南结合NGUI热更新

这个 真.脚本文件 的写法有几处地方要特别注意:
6.1 所有的方法必须是静态方法,否则无法切换到【原生模式】来运行,也就无法用IDE来Debug了,这是框架内用反射模拟原生模式时的约定。
6.2 必须有一个静态方法名叫:_new,类似 int main() { } 。
6.3 每个静态方法之间不能直接互相调用,需要通过图片中注释的说明方法来调用.
6.4 所有方法的第一个参数,必须是 【宿主环境中的接口】→ Interface_Test 对象.
7. 最后一步: 在TestController .cs 中继承并实现 【宿主环境中的接口】,然后加载上面的那个脚本并执行。
7.1 实现【宿主环境中的接口】→ Interface_Test,代码如下所示:
(转载)李剑英的CSLight入门指南结合NGUI热更新
7.2 加载脚本并执行,代码如下所示:
(转载)李剑英的CSLight入门指南结合NGUI热更新
至此,这个例子就结束了。

(转载)李剑英的CSLight入门指南结合NGUI热更新的更多相关文章

  1. 转载------一小时包教会 —— webpack 入门指南

    本文写的蛮好,转载地址:http://www.w2bc.com/Article/50764 其他的地址: http://webpack.github.io/docs/usage-with-gulp.h ...

  2. 《转载》编程入门指南 v1.4

    编程入门指南 v1.4 Badger · 8 个月前 作者:@萧井陌, @Badger *转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 CoCode ...

  3. opencv入门指南(转载)

    转载链接:http://blog.csdn.net/morewindows/article/details/8426318 网上的总结的一些用openncv的库来做的事: 下面列出OpenCV入门指南 ...

  4. [转载]Markdown——入门指南

    http://www.jianshu.com/p/1e402922ee32/ 转载请注明原作者,如果你觉得这篇文章对你有帮助或启发,也可以来请我喝咖啡. 导语: Markdown 是一种轻量级的「标记 ...

  5. 李洪强iOS开发之-入门指南

    李洪强iOS开发之-入门指南 1零基础小白如何进行iOS系统学习 首先,学习目标要明确:其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走:再次,学技术最重 ...

  6. [转载]TFS入门指南

    [原文发表地址] Tutorial: Getting Started with TFS in VS2010 [原文发表时间] Wednesday, October 21, 2009 1:00 PM 本 ...

  7. 教程:VS2010 之TFS入门指南(转载)

    [原文发表地址] Tutorial: Getting Started with TFS in VS2010 [原文发表时间] Wednesday, October 21, 2009 1:00 PM 本 ...

  8. 【翻译转载】【官方教程】Asp.Net MVC4入门指南(2):添加一个控制器

    2. 添加一个控制器 · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-c ...

  9. 【部分补充】【翻译转载】【官方教程】Asp.Net MVC4入门指南(4):添加一个模型

    4. 添加一个模型 · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-mo ...

随机推荐

  1. Python的平凡之路(18)

    一.JS 正则部分 test   - 判断字符串是否符合规定的正则rep = /\d+/;rep.test("asdfoiklfasdf89asdfasdf")# truerep ...

  2. 8.4c#递归

    一.概念conception: 函数体内调用本函数自身,直到符合某一条件不再继续调用. 二.应满足条件factor: (1)有反复执行的过程(调用自身): (2)有跳出反复执行过程的条件(函数出口) ...

  3. Test-NetConnection

    有了PowerShell 4.0,排除网络故障的日子就会轻松很多.Test-NetConnection cmdlet将多个测试整合到了一个简单的有几个参数的命令当中.例如,命令Test-NetConn ...

  4. Android layout的横竖屏处理

    一.layout-land和layout-prot的区别与使用 默认情况下,创建的Android项目里只有一个layout文件夹,尽管这样也可以横竖屏切换用,但是某些布局横屏过后闲的格外的丑,如下图 ...

  5. JavaSE_ 网络编程 目录(26)

    JavaSE学习总结第26天_网络编程26.01 网络编程概述26.02 网络模型概述和图解26.03 网络编程三要素概述26.04 网络编程三要素之IP概述126.05 InetAddress类的概 ...

  6. swift 动态获取label宽度或高度

    func getLabHeigh(labelStr:String,font:UIFont,width:CGFloat) -> CGFloat { let statusLabelText: NSS ...

  7. Spark:控制日志输出级别

    Spark:控制日志输出级别 终端修改 在pySpark终端可使用下面命令来改变日志级别 sc.setLogLevel("WARN") # 或者INFO等 修改日志设置文件 ** ...

  8. 【框架学习与探究之消息队列--EasyNetQ(2)】

    声明 本文欢迎转载,系博主原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7654902.html 前言 此文章,是承接上篇:[框架学习与探究之消息队列--Ea ...

  9. Java A+B(个人模版)

    JavaA+B: import java.io.*; import java.util.*; import java.math.BigInteger; import java.util.Scanner ...

  10. closures

     一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...