- Unity3D平臺AR與VR開發(fā)快速上手
- 吳雁濤
- 1968字
- 2020-11-28 16:08:45
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
- Word/Excel/PowerPoint 2013三合一高效辦公超級手冊
- 從原始數(shù)據(jù)到分析報告:Excel數(shù)據(jù)透視表高效達人養(yǎng)成記
- Excel 2010辦公應(yīng)用實戰(zhàn)從入門到精通(超值版)
- Word/Excel/PPT從入門到精通
- Excel 2010高效辦公:會計實務(wù)與財務(wù)管理
- WOW!電腦辦公可以這樣簡單
- Office2021完全自學(xué)教程
- Unity3D平臺AR與VR開發(fā)快速上手
- Office 2010辦公高級應(yīng)用(慕課版)
- Word/Excel/PowerPoint 2013三合一從新手到高手(超值版)
- Word-Excel-PPT 2013辦公技巧
- 新印象 Premiere Pro CC 2018短視頻剪輯基礎(chǔ)與實戰(zhàn)
- Office 2010辦公自動化培訓(xùn)教程
- 單片機應(yīng)用技術(shù)項目教程(C語言版)
- Visual C++范例大全