2016年1月27日 星期三

Unity開發筆記 - MonoBehaviour - OnMouse

OnMouse

當遊戲物件(GameObject)掛載了 Script 元件,額外再掛載上 Collider 元件時即可使用 Script 的 OnMouse 相關事件。
需要特別注意的是事件觸發範圍為 Collider 元件所涵蓋的範圍,即綠線圍出的區域。

OnMouseEnter
當滑鼠游標移入觸發區域時,可觸發此事件。

OnMouseOver
當滑鼠游標已移入觸發區域並且尚未移出觸發區域前,會持續觸發此事件

OnMouseExit
當滑鼠游標移出觸發區域時,可觸發此事件。

OnMouseDown
當滑鼠按鍵按下時,可觸發此事件。

OnMouseDrag
當滑鼠按鍵已按下並且尚未放開前,會持續觸發此事件。

OnMouseUp

當滑鼠按鍵放開時,可觸發此事件。

OnMouseUpAsButton
當滑鼠按鍵按下與放開是同一個物件,可觸發此事件。

API Documentation 參考資料

2016年1月26日 星期二

Unity開發筆記 - MonoBehaviour - OnDestroy

OnDestroy

「OnDestroy」是當掛載該 Script 物件被銷毀時觸發的事件。
此事件並非預設自動加入在程式碼中,若要使用需要自行加入。

該事件會在場景轉換時或程式結束前觸發。
使用者亦可自行呼叫 GameObject.Destroy() 銷毀物件,銷毀時會觸發 OnDestroy 事件。

API Documentation 參考資料


2016年1月25日 星期一

Unity開發筆記 - Object - Destroy

Destroy

Destroy」是全域可呼叫的靜態方法,當呼叫此方法並以某遊戲物件(GameObject)作為參數,可使該遊戲物件直接銷毀。

// 程式碼範例
GameObject SomeObject = new GameObject();
Destroy(SomeObject);

API Documentation 參考資料

Unity開發筆記 - Object - DontDestroyOnLoad

DontDestroyOnLoad

DontDestroyOnLoad」是全域可呼叫的靜態方法,當呼叫此方法並以某遊戲物件(GameObject)作為參數,可使該遊戲物件不在場景轉換時被回收銷毀。

// 程式碼範例
GameObject SomeObject = new GameObject();
DontDestroyOnLoad(SomeObject);

API Documentation 參考資料


2016年1月6日 星期三

Unity開發筆記 - MonoBehaviour - Awake & Start

Awake

「Awake」是在 Script 物件載入時觸發的事件。
此事件會在「Start」之前被觸發。

Start

「Start」是在 Script 物件載入後在第一個影格會執行的事件。
當開發者建立新的 Script 時,此事件已預設加入在程式碼中,一般常作為 Script 參數的初始化之用途。

API Documentation 參考資料

2016年1月5日 星期二

Unity開發筆記 - MonoBehaviour 元件

繼承鏈

MonoBehaviour > Behaviour > Component > Object

筆記

「MonoBehaviour」類別繼承自「Behaviour」類別,而「Behaviour」類別繼承自「Component」類別,所以 Script 本身也是屬於「元件(可被掛載的)」。

「MonoBehaviour」類別是 Unity 建立 Script 後,在 Script 中預設繼承的類別。該類別包含 Awake、Start、Update、OnEnable、OnGUI、OnDestory ... 等事件供開發者加以運用。最常見的 Start 和 Update 是 Script 預設於程式碼中的事件,若不需使用可加以註解或直接刪除;而其它在「MonoBehaviour」類別中可運用的事件,若需使用必須自行加入於程式碼中。

API Documentation 參考資料

2016年1月3日 星期日

Unity開發筆記 - GameObject & Transform 的操作

Script 中的物件參考

在 Script 中,「gameObject」關鍵字代表了掛載這個 Script 元件的 GameObject;而「transform」關鍵字則代表該 GameObject 所掛載的 Transform 元件,亦可透過「gameObject.transform」來取得 GameObject 掛載的 transform 元件。

GameObject
├Transform
Script (MonoBehaviour)
├.....
├.....
├.....


物件的名稱及標籤

// 取得名稱
string Name = gameObject.name;

// 取得標籤
string Tag = gameObject.tag;

物件的座標

// 取得世界座標
Vector3 Pos = gameObject.transform.position;

// 設置世界座標 為 (x, y, z)
gameObject.transform.position = new Vector3(x, y, z);

// 設置世界座標 為 (0, 0, 0)
gameObject.transform.position = Vector3.zero;

// 取得本地座標
Vector3 Pos = gameObject.transform.localPosition;

// 設置本地座標 為 (x, y, z)
gameObject.transform.localPosition = new Vector3(x, y, z);

// 設置本地座標 為 (0, 0, 0)
gameObject.transform.localPosition = Vector3.zero;

物件的旋轉角度

// 取得世界旋轉角度
Vector3 Rot = gameObject.transform.rotation.eulerAngles;

// 設置世界旋轉角度 為 (x, y, z) Ex-1
gameObject.transform.rotation.eulerAngles = new Vector3(x, y, z);
// 設置世界旋轉角度 為 (x, y, z) Ex-2
gameObject.transform.rotation = Quaternion.Euler (new Vector3(x, y, z));

// 設置世界旋轉角度 為 (0, 0, 0) Ex-1
gameObject.transform.rotation.eulerAngles = Vector3.zero;
// 設置世界旋轉角度 為 (0, 0, 0) Ex-2
gameObject.transform.rotation = Quaternion.Euler (new Vector3(0, 0, 0));

// 取得本地旋轉角度
Vector3 Rot = gameObject.transform.localRotation.eulerAngles;

// 設置本地旋轉角度 為 (x, y, z) Ex-1
gameObject.transform.localRotation.eulerAngles = new Vector3(x, y, z);
transform.localRotation.eulerAngles= new Vector3(x, y, z);
// 設置本地旋轉角度 為 (x, y, z) Ex-2
gameObject.transform.localRotation = Quaternion.Euler (new Vector3(x, y, z));

transform.localRotation = Quaternion.Euler (new Vector3(x, y, z));

// 設置本地旋轉角度 為 (0, 0, 0) Ex-1
gameObject.transform.localRotation.eulerAngles= Vector3.zero;
// 設置本地旋轉角度 為 (0, 0, 0) Ex-2
gameObject.transform.localRotation = Quaternion.Euler (new Vector3(0, 0, 0));

物件的縮放尺寸

// 取得本地縮放尺寸
Vector3 Sca = gameObject.transform.localScale;

// 設置本地縮放尺寸為 (x, y, z)
gameObject.transform.localScale = new Vector3(x, y, z);

// 設置本地縮放尺寸為 (0, 0, 0)
gameObject.transform.localScale = Vector3.zero;

物件操作

// 取得子物件數量
int ChildCount = gameObject.transform.childCount;

// 以子物件的索引位置取得子物件(GameObject)
int ChildIndex = 0;
GameObject Child = gameObject.transform.getChild( ChildIndex ).gameObject;

// 取得父物件(GameObject)
GameObject Parent = gameObject.transform.parent.gameObject;

// 設置父物件(GameObject)
GameObject NewParent = new GameObject();
gameObject.transform.SetParent( NewParent.transfrom );

// 取得指定名稱的物件
string ObjectName = "SomeGameObject";
GameObject SearchObject = GameObject.Find( ObjectName );

// 毀滅指定物件
GameObject SomeObject = new GameObject();
GameObject.Destroy( SomaObject );

// 場景載入時不毀滅指定物件
GameObject SomeObject = new GameObject();
GameObject.DontDestoryOnLoad( SomeObject );

// 複製物件
GameObject SomeObject = new GameObject();
GameObject CloneObject = GameObject.Instantiate( SomeObject );

// 取得物件的掛載元件 Component - Collider
Collider currentCollider = gameObject.GetComponent<Collider>();

// 取得物件的掛載元件 Component - Renderer
Renderer currentRenderer = gameObject.GetComponent<Renderer>();

2016年1月2日 星期六

Unity開發筆記 - GameObject & Transform 的關係

Unity 在腳本撰寫時,最初會碰上的大概就是 GameObject 和 Transform 這兩個物件了。雖然過去曾經參與過幾次 Unity 開發的研習,但我在實際接觸開發時,卻一直以為這是兩個各自獨立的物件。

以類別而言,當然必定是兩兩獨立的,後來才想通,每個 GameObject 在場景中,必定存在某個「位置(Position)」,而 GameObject 這個物件本身並沒有提供這個屬性來存取,因為「位置」這個屬性是被定義在 Transform 類別中的。

而若以「位置」為基礎反推回去,當然必定是用來表示某個座標,而這樣用來表示「位置」的屬性,除非是用在做相關的算術運算,不然以「位置」來思考,它作為座標的表示,確實必須存在一個物體讓「位置」這個屬性去表示它的位置。


就上述的邏輯而言,當一個物體(GameObject)被置於場景(Scene)中時,它必定存在於某個「位置」上,不然你怎麼知道如何在畫面上找到它呢?


所以在這樣的思維上,一個 GameObject 便代表了一個場景上的實體(可見的顯示物件),即便它是Empty GameObject,你也能清楚見到它位於什麼位置。


因此若從不同層面來看,GameObject 和 Transform 的確是各自獨立卻又相互依存的。單從類別層面來看,兩個是不同類別表現了不同的資訊:若從顯示物件的層面而論,彼此卻又是不能拆解分離的。


但由於這樣的特性,可能有人一樣曾在物件存取時會被誤導,因為GameObject 並不能「直接存取」用來表示它「位置」的 Position 這個屬性,甚至是 Rotation 或 Scale,因為Position、Rotation 及 Scale這三個屬性其實是在 Transform 類別中才定義的,GameObject並不存在這三個屬性,只能透過對應的 Transform 去存取該 GameObject 的 Position、Rotation 及 Scale。


小結


GameObject 在場景(Scene)中,僅在三維空間中代表一個物體,並存在名稱Name)及標籤(Tag)等屬性,且在程式碼中可透過靜態方法來取得對應名稱的 GameObject 物件。

Transform 這個物件在 Unity 中較像是一個元件(Component),一個被掛載在 GameObject 上的元件,用以表示與提供存取該 GameObject 的位置(Position)、旋轉角度(Rotation)及Scale(縮放尺寸)等相關的資訊。

當在場景上新增一個GameObject時,該 GameObject 便會自動附加上Transfrom 這個元件(Component),與其它元件不同不須手動掛載上該元件
,而其他類型的元件則須自行手動附加,如碰撞器(Collider)等元件。

需要特別注意一點,GameObject 的子物件,亦必須透過 Transform 來存取,Transform 提供 childCount 屬性及 GetChild() 方法來取得子物件的數量及指定索引位置的子物件。

2016年1月1日 星期五

Unity開發筆記 - 目錄

GameObject & Transform
Component
  • Collider
  • Renderer
  • TextMesh
Object
Invoke
  • Invoke
  • InvokeRepeating
  • IsInvoking
  • CancelInvoke