官术网_书友最值得收藏!

  • Unity 4 3D開發實戰詳解
  • 峰 杜化美 張月霞 索依娜編著
  • 93字
  • 2019-01-01 21:14:56

3.2 Unity中專用 JavaScript與通用 JavaScript的區別

雖然用于網頁開發的JavaScript完全符合ECMAScript標準,但是Unity中的JavaScript語言卻和ECMAScript標準相去甚遠,比如用于網頁的JavaScript庫的絕大部分都無法在Unity中使用。本書將說明Unity 中專用JavaScript與通用(ECMAScript)JavaScript的區別。

3.2.1 在運行過程中性能的差異

Unity中專用JavaScript在運行過程中存在著很多特點,其不僅比JavaScript(ECMAScript)速度快,而且性能也更加優異,下面將分別講解。

● 速度更快

Unity中的JavaScript已經編譯過,其比動態的JSP更快。理論上,在Unity中JavaScript、C#和Boo沒有速度上的差異,而且就算在Squirrelfish Extreme模式下,Unity的 JavaScript比“真正”的JavaScript還要快。

● 性能更優異

JavaScript很重要的優化是使用靜態類型替代動態類型。Unity使用一種叫做類型推理的技術來自動轉換 JavaScript為靜態類型腳本。即Unity通過#pragma strict禁用腳本的動態類型,強制使用靜態類型,并且加入了嚴格的變量檢查機制,如果有未知類型的變量,Unity就會報告編譯錯誤。

3.2.2 在語法上的區別

Unity中專用JavaScript在語法上也做了很多的改進,分別對類的定義與使用、繼承的實現、數據類型與變量的聲明、Mono(.NET)技術的調用以及調試等做出了許多的改進,接下來將逐一進行講解。

1.類的定義與使用

Unity中一個JavaScript腳本文件就是一個類。可以聲明一個和本腳本名字相同的類,如果在腳本中沒有聲明類,則 Unity 就以本腳本名自動命名一個類,腳本中的所有聲明的對象將變為這個類的成員。

比如有一個 HelloWorld 的類,里面有一個 sayHello 的方法。新建一個名為 HelloWorld 的JavaScript腳本,然后在腳本編輯器里面進行編輯,具體的代碼片段如下:

1 function sayHello() {       //聲明sayHello方法

2 print("Hello World");       //打印Hello World

3 }

然而也可以用下面這種寫法,同樣可以創建一個HelloWorld的類,具體的代碼片段如下:

1 public class HelloWorld {      //聲名HelloWorld類

2   function sayHello() {      //聲明sayHello方法

3    print("Hello World ");    //打印Hello World

4 } }

說明

雙擊Project面板中的HelloWorld.js腳本文件,Unity會默認使用Monodeveloper打開,如果讀者喜歡其他的腳本編輯器,可以在Unity中設置更改,具體的操作是單擊Edit→Preferences→External Tools→External Script Editor菜單進行修改。

2.繼承的實現

Unity中JavaScript依然可以通過extends實現繼承,如新建一個MyHello.js腳本,具體的代碼片段如下:

1 class MyHello extends HelloWorld {    //實現MyHello繼承HelloWorld

2   //do something       //實現特定的功能

3 }

這樣,MyHello類就繼承自HelloWorld類。

3.數據類型與變量的聲明

Unity中變量使用前必須聲明。聲明方式是先寫var,表示變量,然后是變量名,后面是冒號,冒號后面是變量的類型,即“var 變量名:變量類型”。

比如聲明整形變量a,可以這么寫:

var a : int; //聲明整形變量

聲明字符串類型的變量時,要注意變量類型是“String”,而且字符串的值必須用雙引號,不能用單引號,可以這么寫:

var s : String = "Hello World"; //聲明字符串類型變量

若聲明帶參數的方法時,具體的代碼片段如下:

1 function Test(var pa1 : String,var pa2 : Object) {  //聲明帶參數的方法

2   //do something          //實現特定的功能

4 }

另外要注意的是,如果聲明變量的同時定義了變量的類型,在接下來的代碼里面就不能修改變量的類型,例如:

1 var a =1;

2 a="test";

這時,Unity將會報錯。但是,如果換一種聲明方式就沒有問題。具體見如下代碼片段:

1 var a;

2 a=1;

3 a="test";

Math 在 Unity 中為 Mathf,只是名字改變,語法和用途沒有改變,例如,Mathf.round()和Mathf.floor()在語法和用途上與JavaScript(ECMAScript)中的Math.round()和Math.floor()相同。

4.Mono(.Net)技術的調用

Unity中腳本的運行環境大量廣泛地使用了Mono技術,當需要使用Mono相關類的時候,只需要導入即可,如:

1 import System;

2 import System.IO;

導入所需的類之后,只需要使用類名即可進行調用,例如,想在程序運行后刪除Project面板里的Assets文件夾下test.txt文件,可用如下的代碼片段來實現:

1 import System;           //導入系統包

2 import System.IO;          //導入系統包

3 function Start () {          //重寫Start函數

4   File.Delete("Assets\\test.txt");     //刪除文件

5 }

除了上面的方式,也可以使用全稱類名來進行調用實現相同的功能,具體可使用如下代碼:

1 function Start() {          //重寫Start函數

2   System.IO.File.Delete("Assets\\test.txt");   //刪除文件

3 }

但很少真正有開發人員實際開發時不進行導入,直接都使用全稱類名的,因為這樣寫起來太費事了。

提示

懂一點C#的讀者會發現:“所謂的Mono類不就是.NET框架中的系統類嗎?”確實如此,Mono 是一個由 Novell 公司主持的項目。該項目的目標是創建一系列符合ECMA 標準(Ecma-334 和Ecma-335)的.NET 工具,包括C# 編譯器和通用語言執行平臺。與微軟的.NET Framework不同,Mono項目不僅可以運行于Windows系統上,還可以運行于Linux、FreeBSD、Unix、Mac OS X和Solaris等其他操作系統。

同時,在Unity中還可以使用第三方的.NET類庫,如果需要時,導入所需的.dll文件即可。

5.調試

Unity 中腳本的錯誤將用紅色嘆號標識。在 Unity 中的控制臺(Console)中包含了當前的全部錯誤,每一個錯誤信息都明確指明了腳本出錯的位置和原因。若這個錯誤是腳本錯誤,當雙擊這個錯誤時,可以自動跳轉到默認的腳本編輯器中,然后光標會在錯誤所對應行的行首跳動。

Unity 也收集了有效的警告信息,用黃色嘆號表示。這些警告信息反饋了哪些變量聲明了卻沒使用,或者自定義的方法可能返回默認值等。盡量修改代碼,使其不再產生警告信息,這是一個很好的編程習慣。

提示

Unity將調試的信息顯示在控制臺(Console)中,無需開發人員去編寫關于顯示調試信息的代碼,這為代碼的調試提供了方便。

在Unity中,可以使用print()和Debug.Log()打印調試信息。但是print()只能在Mono的類中使用,所以一般情況下最好使用Debug.Log(),它和print()效果一樣,但是它可以在各處使用。同時也可以使用Debug.LogWarning()和Debug.LogError()收集警告和錯誤信息。

Unity 中通過 Debug.Break()設置斷點。如果想查看特定情況發生時對象屬性的變化時,用斷點可以快速地完成。

主站蜘蛛池模板: 镶黄旗| 水城县| 临漳县| 金塔县| 兰西县| 寻乌县| 慈利县| 边坝县| 大荔县| 田阳县| 长沙县| 义马市| 响水县| 广河县| 济宁市| 托克托县| 日土县| 福安市| 长春市| 兴宁市| 建昌县| 卫辉市| 塘沽区| 凭祥市| 当雄县| 健康| 乐业县| 宜兰县| 郁南县| 民勤县| 甘南县| 河源市| 南溪县| 定安县| 化州市| 五莲县| 德兴市| 鲜城| 靖安县| 电白县| 海阳市|