转自:http://blog.csdn.net/leonwei/article/details/39233775

最近做U3D的热更新,研究了各种方式无果后,最容易最先想到的方式就是利用c#的反射机制,动态加载代码,但是由于ios上aot的限制,导致ios上不能实现,最后 找到了cslight这个东西,可以在一定范围内动态编译执行cs代码。项目主页http://crazylights.cnblogs.com/  github 主页https://github.com/lightszero/CSLightStudio,这个cslight的作者还是很厉害的,利用这个东西成功的将项目中策划配表等容易经常变动的地方实现了动态编译执行,下面总结下对cslight的理解和使用心得。

1.首先cslight支持部分的c#代码,支持情况包括

项目 支持 不支持

注释

支持// 不支持 /* */
基本类型 支持int uint bool string float double 不支持byte char short 等,但可以扩展
变量和定义 同c#定义变量方式,先定义再使用,可以在定义同时赋值。

int i;
int j=0;
int k=i+1;
bool b1;
bool b2=true;
bool b3=false;

 
数学计算

同c#

支持

+ - * / %

五种数学计算

支持

+= -= /= *= %=

五种自运算

支持

++ --

两种自增运算,只支持变量在左侧

++i 不支持  i++ 支持

支持

> >= < <= != == && ||

八种逻辑运算

支持! 取反

支持三目运算?:

不支持位运算
循环 支持 for foreach while dowhile,支持continue,break,return

支持 if,可以if else嵌套

不支持switch goto
命名空间 可以写
Debug.Log();
不可以写
UnityEnging.Debug.Log();
C#Evil 头部可以写using
不支持
对象调用 注册了类型以后
new 支持
as 和 强制类型转换 支持
成员变量访问支持
成员函数调用支持
向类型注册事件代理支持
支持对象的[] index访问
静态支持
C#Evil 可以在脚本里编写class
脚本里编写的class 不能继承
数组 数组完整支持
支持
new int[3]
new int[]{1,2,3}
两种语法
任何类型数组都必须注册子类型和数组类型
泛型数组
作为类型支持
比如可以将List<int>
Dictionary<int,string> 注册成一个类型总体使用
 
泛型 支持

List<int> 作为一个类型不能有空格
例如 List  <  int > 就不认识了

 
委托 支持脚本编写函数注册给程序的委托接口
A.Test+=Func1;
A.SetTest(Func1);
两种形式
 
匿名函数 支持lambda表达式
可以给委托赋值
不支持 将lambda 表达式赋值给var变量
异常处理 支持  
继承 可以继承脚本中编写的interface,可以多继承 不支持class继承(是因为IOS 上aot的缘故)
get/set 只支持自动实现
int i
{
  get;
  set;
}
不支持编写get/set过程
     

2.基本的程序(cs)和脚本(cslight)之间的关系

3.使用步骤

1)new一个environment

CLS_Environment env=new CLS_Environment(this);

2)注册引擎的类给脚本,如env.RegType(new CSLE.RegHelper_Type(typeof(List<string>),"List<string>"));

3)编译脚本

Dictionary<string, IList<Token>> project = new Dictionary<string, IList<Token>>();
List<string> csPaths=new List<string>();
List<byte[]> bytes=new List<byte[]>();

for(int i=0;i<bytes.Count;i++){
IList<Token> tokens =env.ParserToken( CommonTool.Bytes2String(bytes[i],enc));
project.Add(csPaths[i],tokens);
}
env.Project_Compiler(project,true);

4)动态的执行代码

CLS_Content content=env.CreateContent();
IList<Token> runCodetokens = env.ParserToken(code);
CLS_Content.Value value=null;
try
{
ICLS_Expression expr = env.Expr_CompilerToken(runCodetokens);
value= env.Expr_Execute(expr, content);
}
catch (Exception err) {
Debug.LogError( string.Format("cs light run error dump:\n {0} {1}  
{2}",content.DumpValue(),content.DumpStack(null),err.ToString()));
}
return value;

C#Light能够有权限调用的类型需要提前注册

委托的注册稍微不太一样

env.RegDeleType(new CSLE.RegHelper_DeleAction("Action"));

调试错误

1.打Log进行判断

2.只需要在运行脚本时try一下,出错以后用content.DumpValue 可以Dump出脚本堆栈上的变量值

content.DumpStack 可以Dump出脚本执行堆栈

再加上异常本身反馈的信息

UNITY3D在线更新之道-CSlight 使用总结的更多相关文章

  1. UNITY3d在移动设备上的一些优化实战(一)-概述

    转自:UNITY3d在移动设备上的一些优化实战(一)-概述 http://blog.csdn.net/leonwei/article/details/39233921 项目进入了中期之后,就需要对程序 ...

  2. [转]unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  3. Unity3d三大光照渲染介绍

      重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Re ...

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

    原地址:http://www.xuanyusong.com/archives/3075 李剑英的CSLight入门指南文档撰写者:GraphicQQ: 1065147807 一. CSLIGHT 作者 ...

  5. Unity3D脚本中文系列教程(十五)

    http://dong2008hong.blog.163.com/blog/static/4696882720140322449780/ Unity3D脚本中文系列教程(十四) ◆ LightRend ...

  6. Unity3D脚本中文系列教程(九)

    Unity3D脚本中文系列教程(八) name 对象名称hideFlags 该物体是否被隐藏,保存在场景中或被用户修改继承的函数 GetInstanceID 返回该物体的实例id继承的类函数 oper ...

  7. unity3D中协程和线程混合

    这是我google unity3D一个问题偶然发现的在stackflow上非常有趣的帖子: 大意是 要在unity3D上从server下载一个zip,并解压到持久化地址.并将其载入到内存中.以下展示了 ...

  8. Unity3D手游-横版ACT游戏完整源代码下载

    说明: 这不是武林.这不是江湖,没有道不完的恩怨,没有斩不断的情仇,更没有理不清的烦恼,这是剑的世界,一代剑魁闯入未知世界,将会为这个世界展开什么样的蓝图.让你来创造它的未来,剑魁道天下,一剑斗烛龙! ...

  9. [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究

    各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...

随机推荐

  1. 利用mybatis的分页插件实现商品列表的显示

    分析思路: 当我们点击查询商品的时候,会出现商品的列表,并按上下页可以实现分页的查询的功能. 首先首先我们先找到商品查询商品的按钮在jsp的那个页面,即首页index.jsp 这里有个url即显示商品 ...

  2. 支持向量机(SVM)入门

    一.简介 支持向量机,一种监督学习方法,因其英文名为support vector machine,故一般简称SVM. 通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器, ...

  3. app中Webview实现下载表格

    <script type="text/javascript"> function getUrl(){ var close = confirm("请点击确定下载 ...

  4. Java数据结构——用链表实现栈

    //================================================= // File Name : LinkStack_demo //---------------- ...

  5. 第7章 jQuery插件的使用和写法

    第7章 jQuery插件的使用和写法 插件又称扩展,是一种遵循一定规范的应用程序接口写出来的程序. 插件的编写思想基于面向对象. 获取最新的插件可以查看jquery官网:http://plugins. ...

  6. Bitmap动画

    http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html htt ...

  7. C/C++宏中#与##的讲解

    http://www.cnblogs.com/morewindows/archive/2011/08/18/2144112.html

  8. FBX Transformation

    2010: http://download.autodesk.com/us/fbx/20102/FBX_SDK_Help/index.html?url=WS1a9193826455f5ff3913a1 ...

  9. Mac下切换bash

    MAC下的终端是神器,安装ZSH后,突然间发现太不好操作了,即使再配上oh-my-zsh也感觉不爽. 然后想删除,自己尝试了下找不到命令删除,于是在网上找找,但是也没找到.最后直接进隐藏文件夹,直接一 ...

  10. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...