OnMouse
當遊戲物件(GameObject)掛載了 Script 元件,額外再掛載上 Collider 元件時即可使用 Script 的 OnMouse 相關事件。
需要特別注意的是事件觸發範圍為 Collider 元件所涵蓋的範圍,即綠線圍出的區域。
OnMouseEnter
當滑鼠游標移入觸發區域時,可觸發此事件。
OnMouseOver
當滑鼠游標已移入觸發區域並且尚未移出觸發區域前,會持續觸發此事件
OnMouseExit
當滑鼠游標移出觸發區域時,可觸發此事件。
OnMouseDown
當滑鼠按鍵按下時,可觸發此事件。
OnMouseDrag
當滑鼠按鍵已按下並且尚未放開前,會持續觸發此事件。
OnMouseUp
當滑鼠按鍵放開時,可觸發此事件。
OnMouseUpAsButton
當滑鼠按鍵按下與放開是同一個物件,可觸發此事件。
API Documentation 參考資料
2016年1月27日 星期三
2016年1月26日 星期二
Unity開發筆記 - MonoBehaviour - OnDestroy
OnDestroy
「OnDestroy」是當掛載該 Script 物件被銷毀時觸發的事件。
此事件並非預設自動加入在程式碼中,若要使用需要自行加入。
該事件會在場景轉換時或程式結束前觸發。
使用者亦可自行呼叫 GameObject.Destroy() 銷毀物件,銷毀時會觸發 OnDestroy 事件。
API Documentation 參考資料
「OnDestroy」是當掛載該 Script 物件被銷毀時觸發的事件。
此事件並非預設自動加入在程式碼中,若要使用需要自行加入。
該事件會在場景轉換時或程式結束前觸發。
使用者亦可自行呼叫 GameObject.Destroy() 銷毀物件,銷毀時會觸發 OnDestroy 事件。
API Documentation 參考資料
2016年1月25日 星期一
Unity開發筆記 - Object - Destroy
Destroy
「Destroy」是全域可呼叫的靜態方法,當呼叫此方法並以某遊戲物件(GameObject)作為參數,可使該遊戲物件直接銷毀。
// 程式碼範例
GameObject SomeObject = new GameObject();
Destroy(SomeObject);
API Documentation 參考資料
「Destroy」是全域可呼叫的靜態方法,當呼叫此方法並以某遊戲物件(GameObject)作為參數,可使該遊戲物件直接銷毀。
// 程式碼範例
GameObject SomeObject = new GameObject();
Destroy(SomeObject);
API Documentation 參考資料
Unity開發筆記 - Object - DontDestroyOnLoad
DontDestroyOnLoad
「DontDestroyOnLoad」是全域可呼叫的靜態方法,當呼叫此方法並以某遊戲物件(GameObject)作為參數,可使該遊戲物件不在場景轉換時被回收銷毀。
// 程式碼範例
GameObject SomeObject = new GameObject();
DontDestroyOnLoad(SomeObject);
API Documentation 參考資料
「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 參考資料
「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 參考資料
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>();
在 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;
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() 方法來取得子物件的數量及指定索引位置的子物件。
以類別而言,當然必定是兩兩獨立的,後來才想通,每個 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
MonoBeheviour
- MonoBehaviour 元件
- Awake & Start
- OnDestroy
- OnMouse
- OnCollision
- OnTrigger
Component
- Collider
- Renderer
- TextMesh
訂閱:
文章 (Atom)