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 ,支持continuebreak,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有着良好的支持

image

只需要在運行腳本時try一下,出錯以后用content.DumpValue 可以Dump出腳本堆棧上的變量值

content.DumpStack 可以Dump出腳本執行堆棧

再加上異常本身反饋的信息

image

這是故意產生了一個錯誤

DumpValue是每一層腳本函數上的變量

DumpStack就是腳本堆棧,最上面一行告訴了我們bug所在 Test03.cs的第31行

SystemError是異常拋出的部分


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM