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

3.4 Unity腳本的基本語(yǔ)法

通過前面兩節(jié)的介紹,讀者應(yīng)該對(duì)Unity 中專用JavaScript和C#腳本有了一些簡(jiǎn)單的了解,下面就分別對(duì)Unity中專用JavaScript和C#腳本的基本語(yǔ)法進(jìn)行介紹說明。

3.4.1 常用操作

Unity 中很多對(duì)游戲?qū)ο蟮牟偈峭ㄟ^腳本來修改對(duì)象的 Transform(變換屬性)與 Rigidbody (剛體屬性)參數(shù)來實(shí)現(xiàn)的。上述屬性的參數(shù)可以非常方便地通過腳本編程實(shí)現(xiàn)修改,例如讓物體繞x軸順時(shí)針旋轉(zhuǎn)20°,則可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

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

2   this.transform.Rotate(20, 0, 0);    //繞x軸上旋轉(zhuǎn)20°

3 }

腳本開發(fā)完成后,將這個(gè)腳本掛載到需要旋轉(zhuǎn)的游戲?qū)ο笊希陧?xiàng)目運(yùn)行時(shí)即可實(shí)現(xiàn)所需功能。當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;       //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明一個(gè)example類

4  void Update() {         //重寫Update函數(shù)

5   transform.Rotate(20, 0, 0);     //繞x軸旋轉(zhuǎn)20°

6  }}

如果希望游戲?qū)ο笱貁軸正方向移動(dòng),則可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var gameobject : GameObject;    //聲明一個(gè)游戲?qū)ο?/p>

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

3   gameobject.transform.Translate(0, 0, 1);//實(shí)現(xiàn)gameobject每幀向前移動(dòng)1個(gè)單位長(zhǎng)度

4 }

上述代碼運(yùn)行時(shí)可以實(shí)現(xiàn)gameobject游戲?qū)ο竺繋蚯耙苿?dòng)1個(gè)單位。當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;    //引入系統(tǒng)包

3 public class example : MonoBehaviour { //聲明一個(gè)example類

4  void Update() {      //重寫Update函數(shù)

5   transform.Translate(0, 0, 1);  //實(shí)現(xiàn)gameobject每幀向前移動(dòng)1個(gè)單位長(zhǎng)度

6  }}

提示

一般情況下,在Unity中,x軸為紅色的軸表示左右,y軸為綠色的軸表示上下,z軸為藍(lán)色的軸表示前后。

3.4.2 記錄時(shí)間

在Unity中記錄時(shí)間需要用到Time類。Time類中比較重要的變量為deltaTime(只讀),它指的是從最近一次調(diào)用Update()或者FixUpdate()到現(xiàn)在的時(shí)間。

說明

系統(tǒng)在繪制每一幀時(shí),都會(huì)回調(diào)一次Update函數(shù),因此,如果想在系統(tǒng)繪制每一幀時(shí)都做相同的工作,可以把對(duì)應(yīng)的代碼寫在Update函數(shù)中。

如果想勻速地旋轉(zhuǎn)一個(gè)物體,不考慮幀速率的情況下,可以乘以 Time.deltaTime,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var gameobject : GameObject;         //聲明一個(gè)游戲?qū)ο?/p>

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

3  gameobject.transform.Rotate(10* Time.deltaTime,0 , 0); //繞x軸均勻旋轉(zhuǎn)

4 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;       //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明一個(gè)example類

4  void Update() {         //重寫Update函數(shù)

5   transform.Rotate(10 * Time.deltaTime, 0, 0); //繞x軸均勻旋轉(zhuǎn)

6  }}

同樣地,也可以使用類似的方法來移動(dòng)物體,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var gameobject : GameObject;         //聲明一個(gè)游戲?qū)ο?/p>

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

3  gameobject.transform.Translate(0, 0, 1 * Time.deltaTime); //沿z軸向前移動(dòng)

4 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;       //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明一個(gè)example類

4  void Update() {         //重寫Update函數(shù)

5   transform.Translate(0, 0, 1 * Time.deltaTime);//沿z軸均勻平移

6  }}

如果想每秒增加或者減少一個(gè)值,需要乘以 Time.deltaTime,同時(shí)也要明確在游戲中是需要每秒1個(gè)單位還是每幀1個(gè)單位的效果。如果是乘以Time.deltaTime,那么,游戲?qū)ο缶蜁?huì)按固定的節(jié)奏運(yùn)動(dòng)而不是依賴游戲的幀速率,因此,游戲?qū)ο蟮倪\(yùn)動(dòng)變得更容易控制。

例如想讓游戲?qū)ο螅℅ameobject)沿 y 軸正方向每秒上升 5 個(gè)單位,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var gameobject : GameObject;      //聲明一個(gè)游戲?qū)ο?/p>

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

3  gameobject.transform.position.y+=5*Time.deltaTime;//游戲?qū)ο笱貀軸每秒上升5個(gè)單位長(zhǎng)度

4 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;         //引入系統(tǒng)包

3 public class example : MonoBehaviour {      //聲明一個(gè)example類

4   public GameObject gameobject;       //聲明一個(gè)游戲?qū)ο?/p>

5  void Update() {           //重寫Update函數(shù)

6   gameobject.transform.position.y+=5*Time.deltaTime; //沿y軸每秒上升5個(gè)單位

7  }}

如果涉及剛體時(shí),可以寫在FixUpdate函數(shù)里面,這樣就不需要乘以Time.deltaTime,例如,讓一個(gè)剛體沿y軸正方向每秒上升2個(gè)單位,可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var gameobject : Rigidbody;      //聲明一個(gè)游戲?qū)ο?/p>

2 function FixUpdate() {       //聲明Update方法

3   gameobject.rigidbody.transform.position.y+=2;//剛體沿y軸每秒上升2個(gè)單位長(zhǎng)度

4 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;        //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明一個(gè)example類

4   public GameObject gameobject;     //聲明一個(gè)游戲?qū)ο?/p>

5  void FixUpdate() {        //重寫Update函數(shù)

6   gameobject.rigidbody.transform.position.y+=2;//剛體沿y軸每秒上升2個(gè)單位長(zhǎng)度

7  }}

說明

FixUpdate方法是按固定的物理時(shí)間被系統(tǒng)回調(diào)執(zhí)行的,其中的代碼的執(zhí)行和游戲的幀速率無關(guān)。

如果涉及剛體的力的時(shí)候,通常也不需要乘以Time.deltaTime,因?yàn)閁nity引擎系統(tǒng)內(nèi)部事先處理好了。

3.4.3 訪問其他組件

組件屬于游戲?qū)ο螅热绨岩粋€(gè) Renderer(渲染器)組件附加到游戲?qū)ο笊希梢允褂螒驅(qū)ο箫@示到游戲場(chǎng)景中;把Camera(攝像機(jī))組件附加到游戲?qū)ο笊峡梢允乖搶?duì)象具有攝像機(jī)的所有屬性。由于所有的腳本都是組件,因此一般的腳本都可以附加到游戲?qū)ο笊稀?/p>

常用的組件可以通過簡(jiǎn)單的成員變量取得,下面介紹了一些常見的成員變量,如表3-1所示。

表3-1 常見的成員變量

提示

這里的組件體現(xiàn)在屬性查看器中,而變量是在腳本中體現(xiàn)的。一個(gè)游戲?qū)ο蟮乃薪M件及其所帶的屬性參數(shù)都能夠在屬性查看器中查看。如果想通過掛載在游戲?qū)ο笊系哪_本代碼來實(shí)現(xiàn)獲得該游戲?qū)ο笊系膶?duì)應(yīng)組件及其屬性,可以通過變量名來獲得,例如,獲得游戲?qū)ο螅?gameobject )上的 Transform 組件,可這樣寫gameobject.transform;如果想進(jìn)一步獲得其 position 屬性,則可這樣寫gameobject.transform.position。

如果想查看所有的預(yù)定義成員變量,可以查看關(guān)于 Component、Behavior 和 MonoBehaviour類的文檔,本書不再一一介紹。如果游戲?qū)ο笾袥]有想要取得的值,那么上面的變量將為null。

在 Unity 中,附加到游戲?qū)ο笊系慕M件可以通過 GetComponent 獲得,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var gameobject : Rigidbody;        //聲明游戲?qū)ο?/p>

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

3   gameobject.transform.Translate(1, 0, 0);    //沿x軸移動(dòng)一個(gè)單位

4   gameobject.GetComponent(Transform).Translate(1, 0, 0);//沿x軸移動(dòng)一個(gè)單位

5 }

第4行和第5行代碼作用是一樣的,都是使游戲?qū)ο笱豿軸正方向移動(dòng)。當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;       //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明一個(gè)example類

4  void Update() {         //重寫Update函數(shù)

5   transform.Translate(1, 0, 0);    //沿x軸移動(dòng)一個(gè)單位

6   GetComponent<Transform>().Translate(1, 0, 0); //沿x軸移動(dòng)一個(gè)單位

7  }}

提示

注意transfom和Transform之間大小寫的區(qū)別,前者是變量(小寫),后者是類或腳本名稱(大寫)。大小寫不同使你能夠從類和腳本名中區(qū)分變量。

同樣地,也可以通過GetComponent獲取其他的腳本。比如有一個(gè)HelloWorld腳本,里面有一個(gè)sayHello函數(shù)。HelloWorld腳本要與調(diào)用它的腳本附加在同一游戲?qū)ο笊?,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var otherScript : HelloWorld;      //聲明一個(gè)HelloWorld腳本

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

3  otherScript = GetComponent (HelloWorld);   //調(diào)用HelloWorld腳本

4  otherScript.sayHello();       //執(zhí)行sayHello方法

5 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;       //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明一個(gè)example類

4  void Update() {         //重寫Update函數(shù)

5   OtherScript otherScript = GetComponent<OtherScript>(); //得到其他腳本組件

6   otherScript.sayHello();      //執(zhí)行sayHello方法

7  }}

提示

聲明otherScript變量時(shí)也可以不指定類型,但是指定類型后,Unity就不需要進(jìn)行邏輯判斷otherScript,這樣可以優(yōu)化性能,提高運(yùn)行速度。

3.4.4 訪問其他游戲?qū)ο?/h3>

大部分腳本不單單控制一個(gè)游戲?qū)ο?。Unity 腳本中有很多方法訪問它們的游戲?qū)ο蠛陀螒蚪M件。比如有一個(gè)Test腳本,并將其附加到一個(gè)游戲?qū)ο笊希唧w可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var otherScript : Test;     //聲明一個(gè)Test腳本

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

3  otherScript = GetComponent(Test);  //調(diào)用Test腳本

4  otherScript.DoSomething();    //執(zhí)行Test腳本中的DoSomething方法

5 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;        //引入系統(tǒng)包

3 public class example : MonoBehaviour {     //聲明一個(gè)example類

4  void Update() {          //重寫Update函數(shù)

5   OtherScript otherScript = GetComponent<OtherScript>(); //得到其他腳本組件

6   otherScript.DoSomething();   //調(diào)用腳本組件中的DoSomething()方法

7  }}

1.通過屬性查看器指定參數(shù)

可以通過屬性查看器來確定一些變量的值,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 // 將要轉(zhuǎn)換的對(duì)象拖曳到target位置

2 var target : Transform;     //聲明一個(gè)游戲?qū)ο?/p>

3 function Update (){      //聲明Update方法

4  target.Translate(0, 0, 2);    //沿z軸每幀移動(dòng)2個(gè)單位

5 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 // 將要平移的對(duì)象拖曳到target位置

2 using UnityEngine;

3 using System.Collections;     //引入系統(tǒng)包

4 public class example : MonoBehaviour {  //聲明一個(gè)example類

5  public Transform target;    //定義一個(gè)Transform類型的target變量

6  void Update() {       //重寫Update函數(shù)

7   target.Translate(0, 0, 2);   //在z軸上平移2個(gè)單位

8  }}

讀者也能將參數(shù)顯示在屬性查看器,然后就可以拖曳Test腳本到屬性查看器的gameobject位置,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 //設(shè)置a DoSomething到target變量指定在屬性查看器

2 var target : Test;       //聲明一個(gè)游戲?qū)ο?/p>

3 function Update (){      //聲明Update方法

4  //設(shè)置Test對(duì)象的a變量

5  target.a = 2;

6  //調(diào)用Test的Dosomething

7  target.DoSomething("Hello");

8 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 //設(shè)置foo DoSomething到target變量指定在屬性查看器

2 using UnityEngine;

3 using System.Collections;     //引入系統(tǒng)包

4 public class example : MonoBehaviour {  //聲明一個(gè)example類

5  public Test target;      //定義一個(gè)Test類型的target變量

6  void Update() {       //重寫Update函數(shù)

7   target.a = 2;      //設(shè)置target對(duì)象的a變量

8   target.DoSomething("Hello");  //調(diào)用target的DoSomething方法

9  }}

2.確定對(duì)象的層次關(guān)系

可以通過Transform組件去找到它的子對(duì)象和父對(duì)象,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 //獲得子游戲?qū)ο蟆癏and”

2 var gameobject : GameObject;    //聲明一個(gè)游戲?qū)ο?/p>

3 function Update (){      //聲明Update方法

4  gameobject.transform.Find("Hand").Translate(0, 0, 1);//找到子對(duì)象“Hand”并沿Z軸每幀移動(dòng)1個(gè)單位

5 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;      //引入系統(tǒng)包

3 public class example : MonoBehaviour {   //聲明一個(gè)example類

4  void Update() {        //重寫Update函數(shù)

5    //找到子對(duì)象“Hand”,并沿z軸每幀移動(dòng)1個(gè)單位

6   transform.Find("Hand").Translate(0, 0, 1);

7  }}

一旦讀者在Hierarchy面板找到Transform,讀者就可以通過GetComponent獲得其他腳本,例如有一個(gè)Test.js腳本掛載在子對(duì)象Hand上,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var gameobject : GameObject;

2 function Update (){

3   //找到子對(duì)象 "Hand"

4   //獲取Test,設(shè)置a為2

5   gameobject.transform.Find("Hand").GetComponent(Test).a = 2;

6   //獲得子對(duì)象"Hand"

7   //調(diào)用附屬于它的Test的DoSomething

8   gameobject.transform.Find("Hand").GetComponent(Test).DoSomething("Hello");

9   //獲得子對(duì)象"Hand"

10  //加一個(gè)力到剛體上

11  gameobject.transform.Find("Hand").rigidbody.AddForce(0, 0, 2);

12 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;      //引入系統(tǒng)包

3 public class example : MonoBehaviour {   //聲明一個(gè)example類

4  void Update() {        //重寫Update函數(shù)

5   //找到子對(duì)象 "Hand",并得到該對(duì)象上的Test腳本組件,同時(shí)設(shè)置a為2

6   transform.Find("Hand").GetComponent<Test>().a = 2;

7   //找到子對(duì)象 "Hand",并得到該對(duì)象上的Test腳本組件,同時(shí)調(diào)用DoSomething函數(shù)

8   transform.Find("Hand").GetComponent<Test>().DoSomething("Hello");

9   //找到子對(duì)象 "Hand",在該對(duì)象的剛體屬性上加一個(gè)沿z軸的大小為2的力

10   transform.Find("Hand").rigidbody.AddForce(0, 0, 2);

11  }}

也可以使用腳本來循環(huán)到所有的子對(duì)象,然后對(duì)子對(duì)象做某種操作,如平移。具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 //y軸正方向移動(dòng)所有的子對(duì)象5個(gè)單位

2 for (var child : Transform in transform) {

3  child.Translate(0, 5, 0);

4 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 //y軸正方向移動(dòng)所有的子對(duì)象5個(gè)單位

2 foreach (Transform child in transform) {

3   child.Translate(0, 5, 0);

4 }

如果想要得到更多關(guān)于Transform的信息,可以參考相關(guān)的文檔。

3.指定名字或標(biāo)簽

可以使用GameObject.FindWithTag和GameObject.Find GameObjectsWithTag搜索指定標(biāo)簽的游戲?qū)ο?;使用GameObject.Find搜索指定名字的游戲?qū)ο?,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 function Start (){

2  //通過名字搜索

3  var name = GameObject.Find("SomeName");

4  name.transform.Translate(0, 0, 1);

5  //通過標(biāo)簽搜索

6  var tag = GameObject.FindWithTag("SomeTag");

7  tag.transform.Translate(0, 0, -1);

8 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;      //引入系統(tǒng)包

3 public class example : MonoBehaviour {   //聲明一個(gè)example類

4  void Start() {        //重寫Start函數(shù)

5             //找到名稱為SomeName的游戲?qū)ο?/p>

6   GameObject go = GameObject.Find("SomeName");

7   go.transform.Translate(0, 0, 1);   //沿z軸平移1

8             //找到Tag為SomeTag的游戲?qū)ο?/p>

9   GameObject tag = GameObject.FindWithTag("SomeTag");

10   tag.transform.Translate(0, 0, -1);  //沿z軸平移-1

11  }}

這樣,通過 GetComponent 就能得到指定游戲?qū)ο笊系娜我饽_本或組件,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 function Start (){

2  //通過名字搜索

3  var name = GameObject.Find("SomeName");

4  name.GetComponent(Test).DoSomething();

5  //通過標(biāo)簽搜索

6  var tag = GameObject.FindWithTag("SomeTag");

7  tag.GetComponent(Test).DoSomething();

8 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;      //引入系統(tǒng)包

3 public class example : MonoBehaviour {   //聲明一個(gè)example類

4  void Start() {        //重寫Start函數(shù)

5             //找到名稱為SomeName的游戲?qū)ο?/p>

6   GameObject go = GameObject.Find("SomeName");

7    //得到go對(duì)象上的Test腳本組件,并調(diào)用腳本中的方法

8   go.GetComponent<Test>().DoSomething();

9             //找到Tag為SomeTag的游戲?qū)ο?/p>

10   GameObject tag = GameObject.FindWithTag("SomeTag");

11    //得到go對(duì)象上的Test腳本組件,并調(diào)用腳本中的方法

12   tag.GetComponent<Test>().DoSomething();

13  }}

但是這里也有一些特殊的變量,比如主攝像機(jī)(Camera.main),即第一個(gè)有效的攝像機(jī)被標(biāo)示為主攝像機(jī)(只讀),如果當(dāng)前游戲場(chǎng)景中沒有主攝像機(jī)則返回null。

4.傳遞參數(shù)

一些事件中包含了特殊的信息,例如觸發(fā)碰撞事件的Collider組件。在OnTiggerStay函數(shù)中有一個(gè)碰撞體參數(shù),通過這個(gè)參數(shù),能得到碰撞的剛體,具體可以使用如下的 JavaScript 代碼片段來實(shí)現(xiàn)。

1 function OnTriggerStay( other : Collider ) {

2  //如果碰撞體是一個(gè)剛體

3  //則給它一個(gè)向前的力

4  if (other.rigidbody)

5  other.rigidbody.AddForce(0, 0, 2);

6 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;       //引入系統(tǒng)包

2 using System.Collections;     //引入系統(tǒng)包

3 public class example : MonoBehaviour {

4  void OnTriggerStay(Collider other) {

5    if (other.rigidbody)    //如果碰撞體是剛體,則給它一個(gè)向前的力

6    other.rigidbody.AddForce(0, 0, 2);

7  }}

或者通過Collider得到這個(gè)對(duì)象上掛載的腳本,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 function OnTriggerStay( other : Collider ) {

2  //一般碰撞體沒有附腳本,所以讀者需要首先檢查是否為null

3  if (other.GetComponent(Test))

4  //如果其他的碰撞體附加了Test,則調(diào)用它的DoSomething方法

5  other.GetComponent(Test).DoSomething();

6 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;     //引入系統(tǒng)包

3 public class example : MonoBehaviour {

4  void OnTriggerStay(Collider other) {

5    //如果other對(duì)象上存在Test腳本組件,就調(diào)用該腳本的方法

6   if (other.GetComponent<Test>())

7    other.GetComponent<Test>().DoSomething();

8

9  }}

說明

在上面的代碼中使用后綴方式訪問其他變量,也同樣能訪問到碰撞對(duì)象所包含的任意組件。

5.某個(gè)類型的腳本

可以使用FindObjectsOfType函數(shù)找到特定的組件,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 function Start (){

2  //獲得附加在場(chǎng)景里的游戲?qū)ο蟮腡est組件

3  var test : Test = FindObjectOfType(Test);

4  test.DoSomething();

5 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;      //引入系統(tǒng)包

3 public class example : MonoBehaviour {

4  void Start() {        //重寫Start函數(shù)

5             //找到Test類型的組件

6   Test test = FindObjectOfType(typeof(Test));

7   test.DoSomething();   //調(diào)用腳本中的DoSomething函數(shù)

8  }}

說明

如果使用FindObjectsOfType函數(shù)得到的Test類型的組件不止一個(gè),則返回第一個(gè)Test類型腳本組件。

3.4.5 向量

在Unity中使用Vector3表示空間中的所有向量,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var position : Vector3 ;

2 position.x = 3;       //x軸分量

3 position.y = 4;       //y軸分量

4 position.z = 5;       //z軸分量

也可以直接給position賦值,不必分別給x、y、z賦值,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var position : Vector3 ;

2 position = Vector3(3,4,5);

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;          //引入系統(tǒng)包

2 using System.Collections;        //引入系統(tǒng)包

3 public class example : MonoBehaviour {

4   public Vector3 position = new Vector3(3, 4, 5); //new一個(gè)新向量

5 }

Vector3也自定義了一些固定的值,例如Vector3.up等同于Vector3(0,1,0),Vector3.zero等同于Vector3(0,0,0)等,這樣可以簡(jiǎn)化代碼。

Vector3類中有很多實(shí)用的方法,例如想要獲得兩點(diǎn)之間的距離時(shí),可以使用Vector3.Distance()方法,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var position1 : Vector3 = Vector3(2,1,3); //聲明向量position1

2 var position2 : Vector3 = Vector3(3,4,5); //聲明向量position2

3 var theDistance = Vector3.Distance(position1, position2);//求向量position1和position2之間的距離

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;        //引入系統(tǒng)包

3 public class example : MonoBehaviour {

4  public Vector3 position1 = new Vector3(2, 1, 3);  //聲明向量

5  public Vector3 position2 = new Vector3(3, 4, 5);  //聲明向量

6  //求兩個(gè)向量之間的距離

7  public float theDistance = Vector3.Distance(position1, position2);

8 }

Vector3也支持運(yùn)算符,比如:JavaScript中 var position= position1+ position2,C#中 public float theDistance = position1+ position2。

3.4.6 成員變量和全局變量

一般情況下,定義在方法體外的變量是成員變量,這個(gè)變量可以在屬性查看器查看到,若進(jìn)行修改,而且它會(huì)隨著項(xiàng)目一起自動(dòng)保存,如在JavaScript中:

var a : int = 1;

而在C#腳本中:

public int a = 1;

在屬性查看器中可以看到這個(gè)變量,名字為“a”,值為“1”,讀者可以修改它的值。

如果聲明的是一個(gè)組件類型的變量(類似GameObject、Transform、Rigidbody等),需要在屬性查看器拖曳游戲?qū)ο蟮阶兞刻幉⒋_定它的值,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 //聲明一個(gè)敵人對(duì)象

2 var enemy: GameObject;

3 function Update(){

4  //如果敵人和初始點(diǎn)的距離小于10

5  if ( Vector3.Distance( enemy.position, Vector3.zero ) < 10 ) {

6   print("I sense the enemy is near!");

7 } }

這樣,在屬性查看器中直接拖曳敵人對(duì)象到 enemy 變量即可。當(dāng)然,也可以使用如下的 C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;        //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明example類

4  public Transform enemy;       //聲明一個(gè)Transform

5  void Update() {         //重寫Update方法

6         //如果enemy和transform的距離小于10,則打印出一句話

7   if (Vector3.Distance(enemy.position, transform.position) < 10)

8    print("I sense the enemy is near!");

9   }}

可以通過private創(chuàng)建私有變量,這樣在屬性查看器中就不會(huì)顯示該變量,避免錯(cuò)誤地修改。具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 private var lastCollider : Collider;

2 //碰撞檢測(cè)事件

3 function OnCollisionEnter(collisionInfo : Collision ) {

4  lastCollider = collisionInfo.collider;

5 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;        //引入系統(tǒng)包

3 public class example : MonoBehaviour {     //聲明example類

4  private Collider lastCollider;      //聲明一個(gè)Collider

5   //碰撞檢測(cè)事件

6  void OnCollisionEnter(Collision collisionInfo) {

7   lastCollider = collisionInfo.collider;

8  }}

也可以通過 static 來創(chuàng)建全局變量,這樣就可以在不同腳本間調(diào)用這個(gè)變量,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 //腳本里的靜態(tài)變量名為 'test'

2 static var test : int = 5;

3 //讀者可以像普通變量一樣去調(diào)用它

4 print(test);

5 test = 1;

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;      //引入系統(tǒng)包

3 public class example : MonoBehaviour {   //聲明example類

4  public static int test = 5;     //聲明一個(gè)靜態(tài)整型變量

5  print(test);        //打印

6  test = 1;         //賦值

7 }

如果想從另外一個(gè)腳本調(diào)用變量 test,讀者可以通過“腳本名.變量名”的方式調(diào)用,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 //腳本名稱為“Hello.js”

2 print(Test.test);

3 Test.test = 10;

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;      //引入系統(tǒng)包

3 public class hello : MonoBehaviour {   //聲明example類

4  void Start() {        //重寫Start方法

5    print(Test.test);     //打印Test.cs腳本中的變量

6    Test.test = 10;      //給Test.cs腳本中的變量賦值

7  }}

3.4.7 實(shí)例化

Unity 中如果要?jiǎng)?chuàng)建很多相同的物體(比如射擊出去的子彈,保齡球瓶等)時(shí),可以通過實(shí)例化(Instantiate)快速實(shí)現(xiàn)。而且實(shí)例化出來的對(duì)象包含了這個(gè)對(duì)象所有的屬性,這樣就能保證原封不動(dòng)地創(chuàng)建所需的對(duì)象。實(shí)例化在 Unity 中有很多用途,充分使用它非常必要。實(shí)例化常和預(yù)制件(Prefabs)一起使用。

例如,創(chuàng)建一個(gè)腳本“Hit.js”,當(dāng)一個(gè)碰撞體撞擊到一個(gè)物體時(shí),銷毀這個(gè)物體,并創(chuàng)建一個(gè)損壞的物體,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 var broke : Transform ;

2 //當(dāng)一個(gè)碰撞發(fā)生自毀

3 //在相同位置實(shí)例化一個(gè)代替物體

4 function OnCollisionEnter (){

5  //撞擊發(fā)生1s后銷毀物體

6  Destroy (broke.gameObject,1);

7  var brokes : Transform ;

8  //在物體原來的位置創(chuàng)建一個(gè)和原來物體姿態(tài)一樣的物體

9  theClonedExplosion = Instantiate(brokes,broke.position, broke.rotation);

10 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;       //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明example類

4  public Transform explosion;      //聲明explosion變量

5  void OnCollisionEnter() {      //重寫OnCollisionEnter方法

6   Destroy(gameObject,1);      //撞擊發(fā)生1s后銷毀對(duì)象

7   Transform theClonedExplosion;    //聲明變量

8          //在物體原來的位置創(chuàng)建一個(gè)和原來物體姿態(tài)一樣的物體

9   theClonedExplosion = Instantiate(explosion, transform.position,

10            transform.rotation) as Transform;

11  }}

說明

Destroy(gameobject,n)是在n秒后銷毀物體,也可以使用DestroyImmediate(gameobject,boolean),這樣就可以根據(jù)布爾值,判斷是否直接銷毀物體。

3.4.8 協(xié)同程序和中斷

如果通過寫代碼去實(shí)現(xiàn)游戲的連續(xù)步驟的話,有時(shí)會(huì)產(chǎn)生大量重復(fù)的工作,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 private var state = 0;

2 function Update() {

3   if (state == 0) {

4    //做步驟0

5    state = 1;

6    return;

7   }

8   if (state == 1) {

9    // 做步驟1

10    state = 2;

11    return;

12  }

13  // ...

14 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;       //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明example類

4  private int state = 0;       //聲明state變量

5  void Update() {         //重寫Update函數(shù)

6   if (state == 0) {       //做步驟0

7    state = 1;

8    return;

9   }

10   if (state == 1) {       // 做步驟1

11    state = 2;

12    return;

13   }}}

這時(shí)候,如果使用中斷可以更方便,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 while(true) {

2   // 做步驟0

3   yield;

4   // 等待一幀

5   // 做步驟1

6   yield;

7   // 等待一幀

8   // ...

9 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;     //引入系統(tǒng)包

3 public class example : MonoBehaviour {  //聲明example類

4  IEnumerator Example() {     //聲明Example函數(shù)

5   while (true) {

6    yield return null;    // 等待一幀

7    yield return null;    // 等待一幀

8   }}}

說明

在腳本中,中斷語(yǔ)句是一個(gè)特殊的返回類型,它可以使函數(shù)的執(zhí)行跳到中斷語(yǔ)句的下一行。

也可以傳遞時(shí)間值到中斷語(yǔ)句,Update函數(shù)會(huì)在中斷時(shí)間結(jié)束后執(zhí)行下一語(yǔ)句,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 //...

2 yield WaitForSeconds (2.0);       //等待2s

3 //...

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 //...

2 yield return new WaitForSeconds(2.0F);    //等待2s

3 //...

下面的代碼片段先執(zhí)行 Do()函數(shù),但是 Do()函數(shù)之后的 print 語(yǔ)句也會(huì)立即執(zhí)行,具體JavaScript代碼片段來實(shí)現(xiàn)。

1 Do ();            //執(zhí)行Do函數(shù)

2 print ("This is printed immediately");    //打印提示信息

3 function Do (){          //聲明Do函數(shù)

4   print("Do now");        //打印提示信息

5   yield WaitForSeconds (2);      //休眠2s

6   print("Do 2 seconds later");     //打印提示信息

7 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;       //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明example類

4  IEnumerator Do() {        //聲明Do函數(shù)

5   print("Do now");        //打印

6   yield return new WaitForSeconds(2);   //等待2s

7   print("Do 2 seconds later");     //再次打印

8  }

9   void Example() {        //聲明Exame函數(shù)

10  Do();           //調(diào)用Do方法

11   print("This is printed immediately");  //打印

12  }}

修改上面的代碼,使用連接協(xié)同程序,那么程序?qū)⑾葓?zhí)行Do函數(shù),等待,執(zhí)行完Do函數(shù)之后再執(zhí)行其他語(yǔ)句,具體可以使用如下的JavaScript代碼片段來實(shí)現(xiàn)。

1 //連接協(xié)同程序

2 yield StartCoroutine("Do");

3 print("Also after 2 seconds");      //打印提示信息

4 print ("This is after the Do coroutine has finished execution"); //打印提示信息

5 function Do (){          //聲明D函數(shù)

6   print("Do now");        //打印提示信息

7   yield WaitForSeconds (2);      //休眠2s

8   print("Do 2 seconds later");     //打印提示信息

9 }

當(dāng)然,也可以使用如下的C#代碼片段來實(shí)現(xiàn)相同的功能。

1 using UnityEngine;

2 using System.Collections;       //引入系統(tǒng)包

3 public class example : MonoBehaviour {    //聲明example類

4  IEnumerator Do() {        //聲明Example函數(shù)

5   print("Do now");        //打印

6   yield return new WaitForSeconds(2);   //等待2s

7   print("Do 2 seconds later");     //再次打印

8  }

9  IEnumerator Example() {       //聲明Example函數(shù)

10   yield return StartCoroutine("Do");   //啟動(dòng)Do協(xié)同程序

11   print("Also after 2 seconds");    //打印

12   print("This is after the Do coroutine has finished execution");//打印

13  }}

說明

任何時(shí)間處理程序都是協(xié)同程序,但是在Update()和FixUpdate()中不能使用協(xié)同程序。

3.4.9 一些重要的類

本小節(jié)將向讀者介紹Unity腳本中的一些重要的類,由于篇幅的限制,所以本小節(jié)只對(duì)這些類中的比較常用的變量和函數(shù)進(jìn)行簡(jiǎn)單的介紹說明,其他具體的信息讀者可參考官方腳本參考手冊(cè)。

1.MonoBehaviour類

MonoBehaviour 是每個(gè)腳本的基類,其繼承自 Behaviour 類。每個(gè) JavaScript 腳本自動(dòng)繼承MonoBehaviour,使用C#時(shí),需要顯式繼承MonoBehaviour。

MonoBehaviour 類中的方法可以重寫,這些方法在兩種腳本中只是在方法聲明上有一點(diǎn)差別外,其他大致相同。下面介紹一下主要可重寫的方法,如表3-2所示。

表3-2 MonoBehaviour類中主要可重寫的函數(shù)

MonoBehaviour類中有很多的繼承函數(shù),下面將介紹主要的繼承函數(shù),如表3-3所示。

表3-3 MonoBehaviour類中主要的繼承函數(shù)

MonoBehaviour類中還有很多繼承類函數(shù),下面將介紹主要的繼承類函數(shù),如表3-4所示。

表3-4 MonoBehaviour類中主要的繼承類函數(shù)

說明

讀者可能對(duì)“繼承函數(shù)”和“繼承類函數(shù)”兩個(gè)概念比較疑惑?!袄^承函數(shù)”指的是其函數(shù)都是從父類直接繼承或者從父類間接繼承而來的函數(shù),而“繼承類函數(shù)”指的是其函數(shù)均從根類Object中間接繼承而來,而非從其他父類繼承而來。

2.Transform類

場(chǎng)景中的每一個(gè)物體都有一個(gè)Transform。用于儲(chǔ)存并操控物體的位置、旋轉(zhuǎn)和縮放。每一個(gè)Transform可以有一個(gè)父級(jí),允許你分層次應(yīng)用位置、旋轉(zhuǎn)和縮放。可以在Hierarchy面板查看層次關(guān)系。Transform類中包含了很多變量,下面將介紹主要的變量,如表3-5所示。

表3-5 Transform類中主要的變量

Transform類中同時(shí)還有很多函數(shù),下面將介紹主要的函數(shù),如表3-6所示。

表3-6 Transform類中主要的函數(shù)

3.Rigidbody類

Rigidbody可以模擬物體在物理效果下的狀態(tài)。它可以讓物體接收力和扭矩,讓物體相對(duì)真實(shí)地移動(dòng)。如果一個(gè)物體想被重力所約束,其必須含有Rigidbody屬性。Rigidbody類中包含很多變量,下面將介紹主要的變量,如表3-7所示。

Rigidbody類中包含很多函數(shù),下面將介紹主要的函數(shù),如表3-8所示。

表3-7 Rigidbody類中主要的變量

表3-8 Rigidbody類中主要的函數(shù)

4.CharacterController類

角色控制器用于第三人稱或者第一人稱游戲主角控制。它可以根據(jù)碰撞檢測(cè)判斷是否能夠移動(dòng),而不必給角色控制器添加Rigidbody。而且角色控制器不會(huì)受到力的影響,當(dāng)調(diào)用Move函數(shù)時(shí),系統(tǒng)會(huì)先檢查角色控制器是否和其他物體發(fā)生碰撞,然后才決定移動(dòng)與否。

在屬性查看器中可以查看到其屬性,具體的屬性如表3-9所示。

表3-9 Inspector面板中角色控制器的主要屬性

CharacterController類中包含很多變量,下面將介紹一下CharacterController類中的主要變量,如表3-10所示。

表3-10 CharacterControler類中的主要變量

CharacterController類中包含很多函數(shù),下面將介紹一下CharacterController類中的主要函數(shù),如表3-11所示。

表3-11 CharacterControler類中的主要函數(shù)

3.4.10 性能優(yōu)化

Unity 中專用的 JavaScript 對(duì)性能進(jìn)行了大量的優(yōu)化措施,比如使用靜態(tài)類型,使用#pragma strict,緩存組件查詢,使用內(nèi)建數(shù)組以及盡量少調(diào)用函數(shù)等措施。下面將對(duì)各個(gè)措施進(jìn)行介紹。

1.使用靜態(tài)類型

在JavaScript中,很重要的優(yōu)化就是使用靜態(tài)類型代替動(dòng)態(tài)類型。Unity中有一種邏輯推理的技術(shù)自動(dòng)將JavaScript轉(zhuǎn)換為靜態(tài)腳本,無需做額外的工作。例如:

var a = 1;

此時(shí),Unity會(huì)推斷a為整形,不需要使用動(dòng)態(tài)名稱查找等技術(shù),節(jié)省了大量的時(shí)間。但是,有些變量是無法被推斷的,比如下面的代碼片段所示:

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

2   var test = GetComponent(Test);  //調(diào)用Test腳本

3   test.DoSomething();     //執(zhí)行Test腳本中的DoSomething方法

4 }

因?yàn)?test 是未知類型,所以在調(diào)用 DoSomeThing()函數(shù)之前,Unity 需要檢查 test 是否支持DoSomeThing()函數(shù),所以很耗時(shí)間。

如果想要獲得更好的性能,可將上面的代碼改成如下代碼片段:

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

2   var test: Test = GetComponent(Test); //調(diào)用Test腳本

3   test.DoSomething();     //執(zhí)行Test腳本中的DoSomething方法

4 }

說明

在腳本中,聲明變量時(shí)明確變量的類型,避免了Unity系統(tǒng)對(duì)類型的檢查,可以獲得更快的速度,這對(duì)于移動(dòng)開發(fā)更重要。

2.使用#pragma strict

有時(shí)可能會(huì)在無意識(shí)的情況下寫出未知類型的變量,如果在腳本的開始加入#pragma strict語(yǔ)句后,Unity就會(huì)禁用JavaScript的動(dòng)態(tài)類型,如果腳本中有動(dòng)態(tài)類型的聲明,Unity就會(huì)報(bào)告編譯錯(cuò)誤。例如,在禁用動(dòng)態(tài)類型的情況下,下面的代碼片段在Unity中編譯就會(huì)報(bào)錯(cuò)。

var test = GetComponent(Test);

3.緩存組件查詢

這種優(yōu)化不一定是必須的,但是如果想更高的提升性能的話,優(yōu)化組件緩沖也是可以考慮的。當(dāng)通過GetComponent查詢一個(gè)組件時(shí),可以設(shè)置一個(gè)私有變量去儲(chǔ)存這個(gè)組件。這樣,Unity無需在每一幀中去查詢Transform類型的組件。實(shí)現(xiàn)方式可以參考如下代碼片段:

1 private var myTransform : Transform ;   //聲明靜態(tài)變量

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

3   myTransform = transform;

4 }

5 function Update (){        //聲明Update方法

6   myTransform.Translate(0, 0, 2);   //沿z軸每幀移動(dòng)2個(gè)單位

7 }

說明

這種先聲明一個(gè)私有變量,然后在Awake方法中賦值,把對(duì)應(yīng)的組件對(duì)象存放在私有變量的方式同樣適用于腳本組件。

4.使用內(nèi)建數(shù)組

雖然ArrayList和Array很容易使用,而且很方便,但是相比內(nèi)建數(shù)組而言,他們的速度還是有很大的差異。內(nèi)建數(shù)組直接嵌入 struct 數(shù)據(jù)類型存入第一個(gè)緩沖區(qū)里,不需要其他類型信息或者其他資源。因此做緩存遍歷更快捷,如:

1 private var positions : Vector3 [];    //聲明靜態(tài)向量

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

3   positions = new Vector3 [100];   //創(chuàng)建一個(gè)向量

4   for (var i=0;i<100;i++){     //執(zhí)行for循環(huán)

5    positions[i] = Vector3.zero ;  //為每個(gè)向量賦值

6 } }

5.盡量少調(diào)用函數(shù)

最簡(jiǎn)單和最有效的優(yōu)化就是干最少的工作。Unity中Update()函數(shù)每一幀都在運(yùn)行,所以減少Update()函數(shù)里面工作量,可以大量?jī)?yōu)化性能。讀者通過協(xié)調(diào)程序或者加入標(biāo)志位就能實(shí)現(xiàn)。

說明

在實(shí)際開發(fā)中,一般把標(biāo)志位檢查放在函數(shù)外面,這樣就無需每一幀都檢查標(biāo)志位,減少了系統(tǒng)性能的消耗。

3.4.11 腳本編譯

Unity 可以把腳本編譯為.dll 文件,.dll 文件將在運(yùn)行時(shí)編譯運(yùn)行。這樣做可以提高執(zhí)行的速度,比傳統(tǒng)的JavaScript腳本要快20倍左右。

腳本具體的編譯需要以下4步。

(1)所有的“Standard Assert”、“Pro Standard Assert”或者“Plugins”文件夾里的腳本會(huì)被首先編譯。

(2)所有的“Standard Assert/Editor”、“Pro Standard Assert/Editor”或者“Plugins/Editor”文件夾里的腳本會(huì)被首先編譯。

(3)所有在“Editor”文件夾里面的腳本接著被編譯。

(4)其他腳本在最后編譯。所有這一步里編譯的腳本,可以訪問第一組提到的所有腳本(即“Standard Assets”、“Pro Standard Assets”或者“Plugins”文件夾里的腳本)。

提示

最后編譯的腳本可以訪問最先編譯的腳本,實(shí)現(xiàn)了不同的腳本語(yǔ)言之間的溝通。例如,想在一個(gè)JavaScript腳本中引用一個(gè)C#腳本,可以將C#腳本放到“Standard Assets”文件夾下,然后將JavaScript腳本放在此文件夾之外,JavaScript腳本便可以直接引用C#腳本。在“WebPlayer Templates”文件夾下的腳本不會(huì)被編譯。

根據(jù)Unity的版本進(jìn)行編譯。在腳本的開始寫入一些代碼:

1 // 判斷Unity的版本

2 #if UNITY_2_6_0

3 //使用2.6.0特性

4 #endif

5 // 判斷Unity的版本

6 #if UNITY_2_6

7 // 使用2.6.x特性

8 #endif

說明

上面的代碼寫在腳本的開始處,然后,當(dāng)Unity編譯器在編譯時(shí),是從Unity2.6版本開始的。

這樣,就能確保游戲的特性只在對(duì)應(yīng)的版本中使用。這樣也可以標(biāo)記腳本,確保在對(duì)應(yīng)的Unity版本中才能使用。

3.4.12 泛化方法

手冊(cè)中的一些方法可以進(jìn)行泛化通過方法名字后面加T或者.<T>。如下面的代碼片段:

function FuncName.<T>(): T;

這些就是泛化方法。這對(duì)于腳本的意義就是,當(dāng)調(diào)用這個(gè)方法時(shí),可以指定參數(shù)的類型或者返回值的類型。在JavaScript中,泛化方法可以用于動(dòng)態(tài)類型的局限性:

1 //類型推斷正確由于被定義為函數(shù)調(diào)用

2 var obj = GetComponent.<Rigidbody>();

手冊(cè)中任何一種方法都可以通過特殊的調(diào)用語(yǔ)句進(jìn)行泛化。

主站蜘蛛池模板: 正定县| 禹城市| 武威市| 九龙县| 佳木斯市| 周至县| 蕲春县| 探索| 河池市| 西丰县| 乐亭县| 科尔| 肥东县| 郸城县| 奇台县| 祁阳县| 习水县| 察隅县| 鄂州市| 德昌县| 金阳县| 镇巴县| 军事| 高平市| 新竹县| 桐城市| 榆社县| 望奎县| 临江市| 屏山县| 南召县| 淮南市| 且末县| 太湖县| 玉山县| 彩票| 姜堰市| 灌阳县| 宿迁市| 金坛市| 衡山县|