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,支持continuebreak,return

支持 if,可以if else嵌套

if(i==1)
{
}
else if(i==2)
{
}
else if(i==3)
{
}
else
{
}

不支持 while dowhile goto
命名空间 可以写
Debug.Log();
不可以写
UnityEnging.Debug.Log();
C#Evil 头部可以写using
不支持
对象调用 注册了类型以后
new 支持
as 和 强制类型转换 支持
成员变量访问支持
成员函数调用支持
向类型注册事件代理支持
支持对象的[] index访问
静态支持
C#Evil 可以在脚本里编写class
脚本里编写的class 不能继承
数组 作为类型支持
比如可以将List<int>
Dictionary<int,string> 注册成一个类型总体使用
不支持 int[] abc=new int[3]语法
传入参数有int[] 可以注册为类型使用。
由于数组是整体注册一个关键字
所以注册的List<int> 如果注册关键字为”List<int>”,编写时就不能写成  List  <   ini  > 不能有空格,要不然关键字匹配不上
委托 支持脚本编写函数注册给程序的委托接口
A.Test+=Func1;
A.SetTest(Func1);
两种形式
 
匿名函数   不支持
异常处理   不支持trycatch

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语法与调试,布布扣,bubuko.com

时间: 2024-10-13 20:40:36

Unity3D热更新全书-脚本(三) C#LightEvil语法与调试的相关文章

Unity3D热更新全书-脚本(四) 用C#LightEvil搭建实际开发使用的脚本框架

C#LightEvil之前提供了很多和Unity结合的例子,都是采用把脚本文件放置在StreamingAssets中的方法. 这样可以利用Unity的特性,放在这个目录中的CS文件会被编译器编译,我们就利用C#编译器来对我们的脚本进行验证. 同时StreamingAssets中的文件又是直接随项目发布的,所以可以直接以文件方式取出这些脚本文件编译执行. 这是一个很巧妙的方式,但是用在实际项目中会有一些问题: 一.可能会让程序员产生混淆,哪里是脚本,哪里是程序,傻傻分不清楚 二.主程序里会有一份用

Unity3D热更新全书-脚本(五) NGUI

让我们实际的研究一下如何将NGUI和C#LightEvil结合起来. 这里使用NGUI2.7,因为他是一个开源的版本,NGUI最新的版本未经作者的许可,是不可以带入我们的开源项目使用的. 这个例子完成的功能是从NGUI例子里找出了三个界面,按最下方的按钮依次进行切换 这是在之前的框架演示Mode1的基础上做的 由一个状态机去进行驱动,这也是我推荐各位使用脚本的方式. <=这是脚本,也是程序 Mode1的模式是定义一个接口类,然后由脚本继承此类型实现,因为随时考虑AOT的缘故(要兼容IOS),我们

Unity3D热更新全书-脚本(二) 两级分化

上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同的复杂度脚本将表现出完全不同的样貌,我们来看一下. 复杂度一:计算 执行字符串的核心函数应该是这样的 int i = Eval("1+2"); 我们有一套例子,本文最后有如何取得例子的说明. 程序里就可以通过执行字符串来执行逻辑,字符串的变更就可以得到逻辑的变更. 试想如果要做公式计算,他

Unity3D热更新全书-脚本(一) 初识脚本

开篇之前还是要先说明,这是一份给经验并不丰富的程序员阅读的文字. 有需求.有疑惑,往下看. 第一个问题什么是脚本?程序和脚本如何区分?我们给Unity编写的组件是程序还是脚本? 这些问题本文无意去解答,因为其中混合着太多有立场的东西,站在不同的立场会有不同的看法,这其中的矛盾不是简单可以调和的. 只要提出一个观点,就很容易陷入语言大战的泥潭. 我们不妨从另一个角度来思考,为什么要分程序和脚本,是为了找一条分界线. 这条分界线叫做灵活. 我们这个专题的出发点是探讨Unity3D客户端资源更新,已这

Unity3D热更新全书-PageZero

由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何热更新> 这一篇是写给对热更新完全没概念的人 下载系列 还没写 加载系列 <Unity3d热更新全书-资源加载(一)从AssetBundle说起 > 这一篇是探讨使用AssetBundle来做资源更新的问题,希望能让更多人理解AssetBundle是有害的 脚本系列 <Unity3D热

Unity3D热更新全书FAQ

只要有程序员朋友们问过两次的问题 就会收录在此FAQ中 1.C#Light对比LUA有什么好处 C#Light是静态类型脚本语言,语法同C#,Lua是动态类型脚本语言,这两种都有人喜欢. 我更喜欢静态类型,于是有了C#Light 2.C#Light性能怎么样 C#Light和Unilua 和ulua都做过简单性能测试,比Unilua快,和ulua各有胜负 3.C#Light IOS可以使用么 完全可以,均妥善测试 4.为什么C#Light例子和NGUI一起用会编译不过 因为Unity没有库的概念

Unity3D热更新全书-重头再来

之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但是到处都用的Myjson. 2015,重头思考这些事情,有了不一样的感悟,于是也有了新的规划 1.首先了C#Light的语法解释问题变得臃肿低效,重头开始了L#项目.目前L#项目已经进入Beta阶段,完全可以全面替换C#Light.MyJson也独立成库2.下载方面,Easydown是基于经典的文件

Unity3D热更新全书-何谓热更新,为何热更新,如何热更新

首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就明白,但是它语出何处,究竟表达了什么含义,到底代表了什么,对技术有什么要求,对经验相对较少的程序员来说可能就有一层神秘面纱了. 热更新,是对hot update 或者 hot fix的翻译,计算机术语,表示在不停机的前提下对系统进行更改. hot 就是热,机器运行会发烫,hot就是不停机的意思. 热

Unity3D热更新全书-下载 唯一的一篇

下载在这个时代实在是太平常了,每个人都深刻的理解着下载到底是什么. 这一篇文字只是把下载的代码分享并介绍,而已. 首先,下载系统担负着几个使命. 第一.是保持客户端版本库的最新. 第二.是下载要能够比对并最少下载 第三.是要尽量快一些. 其实我们并没有写一个下载系统,因为实在没有几行代码.我们这里介绍的是一个 Http下载并保存缓存,首包从StreamingAssets读取,加载资源,三个功能在一起的模块 源码位置https://github.com/lightszero/easydown 保持