Unity3D热更新 -脚本(三) C#LightEvil语法与调试
2016-02-19 23:19
417 查看
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; 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继承 |
get/set | 只支持自动实现 int i { get; set; } | 不支持编写get/set过程 |
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热更新 -脚本(二) 两级分化
- Unity3D热更新 初识脚本
- Unity3D逻辑热更新,第二代舒爽解决方案,L#使用简介
- Unity3D热更新 下载
- Unity3d热更新 加载(二)如何在不用AssetBundle的前提下动态加载预设
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(56)-插件---单文件上传与easyui使用fancybox
- Unity3d热更新 从AssetBundle说起
- unity 优化
- 在顶点照明模式下如何取得光源信息
- Unity3d 编写编辑器自定义插件(1)
- Unity Physics.Raycast 之 layerMask
- Unity dll 热更新 基础框架
- 《VR入门系列教程》之14---面向大众的Unity3D
- Unity3D面试题整合
- 在unity里绘图板 制作一个画板的几种思路和原理
- Unity 武器拖尾效果插件Pocket RPG Weapon Trails
- Unity3D Android 开发环境配置
- unity3d中UIToggle相关组件的使用
- unity 内存优化
- Unity3d,双摄像机设置