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

3.8 腳本

3.8.1 基本介紹

Unity3D是基于Mono項目實現(xiàn)的,而Mono項目可以簡單理解為第三方實現(xiàn)的跨平臺的.net framework。

因此,個人推薦開發(fā)Unity3D使用C#腳本而不是Javascript腳本。一方面Unity3D的C#資源遠比Javascript資源多;另外,一些不常見的問題,可以直接查微軟的.net的幫助,很多情況下都能通用。

在這里,不介紹C#語言的基礎(chǔ)了,大家可以直接查微軟的資料,基本數(shù)據(jù)類型、語法、類的操作等不變。這里只介紹與微軟C#不同的地方。

在“Assets”里右擊,選擇“Create”→“C# Script”就可以添加腳本組件,如圖3-52所示。

圖3-52

3.8.2 MonoBehaviour

一個腳本想要成為組件,必須繼承MonoBehaviour類。

之后,公開屬性的定義,除了可以在代碼中定義,在Unity3D里,公開屬性可以在Unity編輯界面中定義。

例:新建腳本test.cs

    using UnityEngine;
    using System.Collections;

    public class test : MonoBehaviour {

        public string str;
        public GameObject go;

        // Use this for initialization
        void Start () {

        }
    }

新建一個游戲?qū)ο螅瑢⒛_本拖到該游戲?qū)ο笙鲁蔀槠浣M件,如圖3-53所示。

圖3-53

這時,可以直接在組件上定義公開屬性的值,如“str”;也可以通過拖動,將其他對象作為公開屬性的值,如“go”,如圖3-54所示。

圖3-54

3.8.3 Transform

Transform屬性可以用來設(shè)置游戲?qū)ο蟮奈恢谩⒔嵌群涂s放,等同于在編輯界面修改Transform的值。

(1)設(shè)置游戲?qū)ο笪恢?/p>

設(shè)置對象的transform.position屬性即可。

代碼:

    this.transform.position = new Vector3 (1f, 2f, 3f);

等效于在編輯器中直接修改position的值,如圖3-55所示。

圖3-55

(2)設(shè)置游戲?qū)ο蠼嵌?/p>

調(diào)用對象的transform.Rotate方法。

代碼:

    transform.Rotate (new Vector3 (15f, 45f, 90f));

等效于在編輯器中修改rotation的值,如圖3-56所示。

圖3-56

(3)設(shè)置游戲?qū)ο蟮拇笮?/p>

設(shè)置對象的transform.localScale屬性即可。

代碼:

    transform.localScale = new Vector3 (1.5f, 2f, 3f);

等效于在編輯器中修改scale的值,如圖3-57所示。

圖3-57

3.8.4 GameObject

GameObject用來控制游戲?qū)ο蟊旧恚畛S玫姆椒ㄊ菃⒂没蛘呓糜螒驅(qū)ο蟆?/p>

代碼:

    gameObject.SetActive(false);

等效于在編輯界面操作,就是Cube選項選中或者不選中,分別對應(yīng)啟用和禁用兩種狀態(tài),如圖3-58所示。

圖3-58

3.8.5 常用事件

1. Awake

這個函數(shù)總是在任何Start()函數(shù)之前一個預(yù)設(shè)被實例化之后被調(diào)用,如果一個GameObject是非激活的(inactive),在啟動期間Awake函數(shù)是不會被調(diào)用的,直到它是活動的(active)。

2. OnEnable

只有在對象是激活(active)狀態(tài)下才會被調(diào)用,這個函數(shù)只有在Object被啟用(enable)后才會調(diào)用。這會發(fā)生在一個MonoBehaviour實例被創(chuàng)建,例如當(dāng)一個關(guān)卡被加載或者一個帶有腳本組件的GameObject被實例化。

3. Start

只要腳本實例被啟用了Start()函數(shù),將會在Update()函數(shù)第一幀之前被調(diào)用。

4. FixedUpdate

FixedUpdate函數(shù)會比Update函數(shù)更頻繁地被調(diào)用。它一幀會被調(diào)用多次,但它很少在幀之間被調(diào)用。所有的圖形計算和更新在FixedUpdate之后會立即執(zhí)行。當(dāng)在FixedUpdate里執(zhí)行移動計算,你并不需要Time.deltaTime乘以你的值,這是因為FixedUpdate是按真實時間,獨立于幀率被調(diào)用的。

5. Update

Update每一幀都會被調(diào)用,對于幀更新它是主要的負荷函數(shù)。

6. LateUpdate

LateUpdate會在Update結(jié)束之后每一幀被調(diào)用,任何計算在Update里執(zhí)行結(jié)束當(dāng)LateUpdate開始時。LateUpdate常用為第三人稱視角相機跟隨。

7. OnDisable

當(dāng)行為變?yōu)榉菃⒂茫╠isable)或非激活(inactive)時調(diào)用。

3.8.6 Instantiate

Instantiate方法是用來實例化一個預(yù)制件的方法,支持泛型。

關(guān)鍵代碼:

        public GameObject perfab;

        public void AddGameObject(){
            Instantiate (perfab);
        }

新建一個預(yù)制件,如圖3-59所示。

圖3-59

將預(yù)制件賦值給腳本,如圖3-60所示。

圖3-60

運行如下,每次點擊都會生成一個新的游戲?qū)ο螅鐖D3-61所示。

圖3-61

3.8.7 Destory

Destory方法是用來刪除一個游戲?qū)ο蠡蛘呓M件。當(dāng)傳入?yún)?shù)的類型是游戲?qū)ο髸r將刪除該游戲?qū)ο螅划?dāng)傳入?yún)?shù)的類型是其他組件的時候,將刪除該組件。

關(guān)鍵代碼:

        public GameObject obj;

        public void ToDel(){
            Destroy (obj);
        }

初始狀態(tài),如圖3-62所示。

圖3-62

點擊按鈕以后,如圖3-63所示。

圖3-63

3.8.8 獲取指定游戲?qū)ο蠡蚪M件

獲取指定游戲?qū)ο蠡蚪M件有5種方法。

(1)方法一,在窗口直接復(fù)制。

新建一個公開屬性:

    public cmptone one;
    Public cmptthree three;

然后在窗口將包含該組件的游戲?qū)ο笸械阶兞坷铮梢允亲陨砘蛘咂渌螒驅(qū)ο螅鐖D3-64所示。

圖3-64

運行如圖3-65所示。

圖3-65

(2)方法二,如果組件在同一個游戲?qū)ο螅梢杂肎etComponent方法獲取制定組件,如圖3-66所示。

    GetComponent<cmpttwo> ().output();

圖3-66

(3)方法三,可以用FindObjectOfType方法獲取組件,無論對象是否和當(dāng)前腳本在同一游戲?qū)ο螅鐖D3-67所示。

    FindObjectOfType<cmptfour>().output();

圖3-67

(4)方法四,可以用GameObject.Find方法根據(jù)游戲?qū)ο竺Q獲取指定名稱的游戲?qū)ο螅鐖D3-68所示。

    GameObject.Find ("GameObject one").SetActive (false);

圖3-68

(5)方法五,可以用GameObject.FindGameObjectWithTag方法根據(jù)游戲?qū)ο笏诘腡ag來獲取游戲?qū)ο螅鐖D3-69所示。

    GameObject.FindGameObjectWithTag ("Player").SetActive (false);

圖3-69

3.8.9 指定平臺

Unity3D支持在代碼里,可以讓某段代碼只在指定平臺或Unity版本下運行。例如,下面代碼將只在安卓平臺下運行。

              #if UNITY_ANDROID
              .....
              #endif

3.8.10 DontDestroyOnLoad

用DontDestroyOnLoad可以將對象所在的游戲?qū)ο蟊A簦?dāng)場景切換的時候不被銷毀。

關(guān)鍵代碼:

        void Start () {
            DontDestroyOnLoad (gameObject);
            SceneManager.LoadScene ("showgo");
        }

如圖3-70所示,圖中的方塊就是從上一個場景中帶過來的,這個方法也可以被用來在不同場景中傳遞數(shù)據(jù)信息。

圖3-70

3.8.11 SendMessage

SendMessage方法可以用來調(diào)用制定游戲?qū)ο笾械哪_本組件的方法,無論該方法是否是公開方法。

腳本一(如圖3-71所示):

    void TestOne(){
        Debug.Log ("this is one.");
    }

圖3-71

腳本二(如圖3-72所示):

    void TestTwo(){
        Debug.Log ("this is two");
    }

圖3-72

測試(如圖3-73所示):

    void Start () {
        SendMessage ("TestTwo");
        GameObject.Find ("GameObject one").SendMessage ("TestOne");
    }

圖3-73

3.8.12 場景切換

場景切換過去是使用Application.LoadLevel方法,Unity 5.0以后,改用SceneManager.LoadScene方法。

切換的場景,必須都在“Scenes In Build”里,如圖3-74所示。

圖3-74

從場景“one”切換到場景“two”,如圖3-75所示。

圖3-75

代碼如下:

    SceneManager.LoadScene ("two");

或者

    SceneManager.LoadScene (1);

這里的數(shù)字與“Scenes In Build”里一致。

點擊之前,如圖3-76所示。

圖3-76

點擊以后,如圖3-77所示。

圖3-77

主站蜘蛛池模板: 民权县| 泾源县| 将乐县| 年辖:市辖区| 油尖旺区| 八宿县| 洪湖市| 保德县| 玉门市| 都昌县| 丹阳市| 曲水县| 明水县| 毕节市| 突泉县| 西峡县| 恩施市| 八宿县| 平遥县| 兰西县| 古田县| 铜梁县| 达尔| 黑河市| 新化县| 新津县| 贵港市| 青海省| 天镇县| 襄城县| 涟源市| 荆州市| 石台县| 邯郸县| 旅游| 鸡泽县| 南川市| 抚州市| 定远县| 若羌县| 衡阳县|