Unity3D热更新全书-脚本(三) C#LightEvil语法与调试
调试,这是一个无法规避的问题
C#Light 由于有 词法解释、语法解释、运行时三种情况
所以和C#也是有类似的问题
出错大致可以分为编译错误和运行时错误
拼写出莫名的东西或者语法不正确,会在编译阶段报错,这种错误很好检查,因为
C#Light语法是C#的严格子集,所有的C#Light脚本都可以用C#的标准做语法检查
这也是C#Light基本上是用VisualStudio做编辑器的原因所在,直接作为C#代码编译,可以排除大部分的语法问题。
然后剩下的一些作为C#代码可以编译过,但是C#Light却编译不过,就是因为C#Light是C#的子集,没有100%的实现C#所有的语法
词法错误C#Light的 tokenParser会抛出异常,观察此异常即可获知问题所在
语法错误 C#Light的编译器会抛出异常,同理,观察异常可知。
不过你还是需要了解哪些语法会导致异常
我们先来列出那些不支持的语法:
| 项目 | 支持 | 不支持 |
|
注释 |
支持// | 不支持 /* */ |
| 基本类型 | 支持int uint bool string float double | 不支持byte char short 等,但可以扩展 |
| 变量和定义 | 同c#定义变量方式,先定义再使用,可以在定义同时赋值。 例 int i; |
|
| 数学计算 |
同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继承 |
| get/set | 只支持自动实现 int i { get; set; } |
不支持编写get/set过程 |
C#Light能够有权限调用的类型需要提前注册
env.RegType(new CSLE.RegHelper_Type(typeof(UnityEngine.Debug)));
env.RegType(new CSLE.RegHelper_Type(typeof(List<string>),"List<string>"));
env.RegType(new CSLE.RegHelper_Type(typeof(List<int>), "List<int>"));
env.RegType(new CSLE.RegHelper_Type(typeof(List<List<int>>), "List<List<int>>"));
委托的注册稍微不太一样
env.RegDeleType(new CSLE.RegHelper_DeleAction("Action"));
env.RegDeleType(new CSLE.RegHelper_DeleAction<int>("Action<int>"));
env.RegDeleType(new CSLE.RegHelper_DeleAction<int,string>("Action<int,string>"));
简单的类型不用填第二个参数关键字。
虽然不支持那一列看起来好多,实际上不会很影响,接下来说明运行时出错的排查方法
运行时排错一般有
1.打Log进行判断
2.断点调试
2.错误上下文分析(堆栈分析、附近变量分析)
C#Light不提供断点调试功能,关于打Log,这个直接调用Debug.Log即可
错误上下文C#Light有着良好的支持

只需要在运行脚本时try一下,出错以后用content.DumpValue 可以Dump出脚本堆栈上的变量值
content.DumpStack 可以Dump出脚本执行堆栈
再加上异常本身反馈的信息

这是故意产生了一个错误
DumpValue是每一层脚本函数上的变量
DumpStack就是脚本堆栈,最上面一行告诉了我们bug所在 Test03.cs的第31行
SystemError是异常抛出的部分
Unity3D热更新全书-脚本(三) C#LightEvil语法与调试的更多相关文章
- Unity3D热更新全书-脚本(四) 用C#LightEvil搭建实际开发使用的脚本框架
C#LightEvil之前提供了很多和Unity结合的例子,都是采用把脚本文件放置在StreamingAssets中的方法. 这样可以利用Unity的特性,放在这个目录中的CS文件会被编译器编译,我们 ...
- Unity3D热更新全书-脚本(五) NGUI
让我们实际的研究一下如何将NGUI和C#LightEvil结合起来. 这里使用NGUI2.7,因为他是一个开源的版本,NGUI最新的版本未经作者的许可,是不可以带入我们的开源项目使用的. 这个例子完成 ...
- Unity3D热更新全书-脚本(一) 初识脚本
开篇之前还是要先说明,这是一份给经验并不丰富的程序员阅读的文字. 有需求.有疑惑,往下看. 第一个问题什么是脚本?程序和脚本如何区分?我们给Unity编写的组件是程序还是脚本? 这些问题本文无意去解答 ...
- Unity3D热更新全书-脚本(二) 两级分化
上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...
- 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 ...
随机推荐
- 【转】Crontab定时任务配置
原文出处:http://www.cnblogs.com/kerrycode/p/3238346.html CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读 ...
- mysql 中文乱码解决方法
最近在.NET 项目中用EF连接mysql,插入中文数据时老是显示乱码,在创建表时都已将编码指定了,但是还是出现乱码,折腾了一阵子才发现在连接字符串里面也要加上指定编码 Character Set=u ...
- MongoDB(NoSQL) 入门
一.简介 NoSQL数据库因其可扩展性使其变得越来越流行,利用NoSQL数据库可以给你带来更多的好处, MongoDB是一个用C++编写的可度可扩展性的开源NoSQL数据库. 本文主要讲述MongoD ...
- 如何让电脑公司Win7系统自动关闭停止响应的程序
在注册表编辑器窗口左侧,依次展开HKEY_CURRENT_USER\ControlPanel\Desktop,选中Desktop,在右边的窗口中选择AutoEndTasks,双击打开AutoEndTa ...
- CS0234: 命名空间“System.Web.Mvc”中不存在类型或命名空间名称“Html、Ajax”(是否缺少程序集引用?)
从SVN上down下来的程序,编译报了一大堆的错,发现是缺少引用,但是明明引用了,后来打开引用,发现system.web.mvc这个引用打着叹号,如图: 后来重新引用了本机的system.web.mv ...
- C# 动态加载程序集dll (实现接口)
一.程序集(接口程序集):LyhInterface.Dll namespace LyhInterface { public interface ILyhInterface { void Run(); ...
- PHP中$_SERVER的详细参数
$_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root相关. $_SERVER['argv'] #传递给该脚本的参数. $_SERVER['argc'] ...
- 用Backbone.js创建一个联系人管理系统(三)
原文: Build a Contacts Manager Using Backbone.js: Part 3 欢迎回到这系列的教程,关注使用Backbone.js构建应用程序. 如果你还没看过第一,二 ...
- 增强拉格朗日乘子法(Augmented Lagrange Method)
增强拉格朗日乘子法的作用是用来解决等式约束下的优化问题, 假定需要求解的问题如下: minimize f(X) s.t.: h(X)=0 其中,f:Rn->R; h:Rn->Rm 朴素拉格 ...
- 我与solr(五)--关于schema.xml中的相关配置的详解
先把文件的代码贴上来: <?xml version="1.0" encoding="UTF-8" ?> <!-- 版权说明... --> ...