Unity學習第二週

Unity學習第二週

我下面寫的可能會有很多錯誤,請見諒,我會更加努力學習彌補這些錯誤,感謝!
這一期博客借鑑了很多人的博客,看了下外國網站,並不能看懂。。。。所以很多理解都來源於野路子嘿嘿

通過兩個星期的學習,我對unity有了一定的瞭解,在課上我們通過新建遊戲對象,然後修改它的屬性,如transform可以調整遊戲對象的位置、形狀、大小。甚至可以多個遊戲對象組成一個整體,成爲預設等等。在接觸了腳本的編寫後,我深刻體會到了C#、JAVA等語言面向對象的好處,關於這幾天遇到的問題提出以下簡單的見解。

對象與資源

資源是硬盤中的文件,包含紋理,材質、場景、聲音、預設、腳本等,而對象則是直接出現在遊戲的場景中,是資源整合的具體實例。對象一般是以資源作爲模板實例化成的,如unity自帶案例中的賽車遊戲,賽車、建築物都是以實例化的對象存在於遊戲場景,它們的模型、紋理等等都作爲資源存在了Assets文件夾中。資源與對象是一種一對多的關係,一個資源可以被多個對象使用,一個對象可以涵蓋多個資源。

MonoBehaviour

MonoBehaviour是所有行爲對象的基類,沒有public構造函數,只能由遊戲對象創建。調度相關方法爲:
這裏寫圖片描述

由於unity採用離散仿真原理,每一秒都被分割成了很多個小的時間片,再一幀一幀地播放達到仿真的效果。爲了確認不同事件何時執行,遇到衝突該先處理哪個事件,unity採用如圖實現離散仿真系統:

這裏寫圖片描述

我們可以逐一驗證MonoBehaviour基本行爲的觸發條件

public class verification : MonoBehaviour // MonoBehaviour始終是基類
{
void Awake() {
Debug.Log(“This is Awake”);
}

void Start() {
Debug.Log(“This is Start”);
}

void Update() {
Debug.Log(“This is Update”);
}

void FixedUpdate() {
Debug.Log(“This is FixedUpdate”);
}

void LateUpdate() {
Debug.Log(“This is LateUpdate”);
} 

Void OnGUI() {     // 與Update有些類似,每次有gui事件的時候就會被觸發,                      // 一幀可能會調用多次,用於渲染和處理GUI事件
Debug.Log(“This is OnGUI”);
}

void Reset() {      // 編輯器模式情況下點擊reset按鈕時調用,
                // 可以做調試的初始化工作
Debug.Log(“This is Reset”);
} 

void OnMouseOver() { // 當鼠標懸停在GUIElement或Collider上時調用
Debug.Log(“This is OnMouseOver”);
}

}

還有一大堆方法,具體可以看http://jiangyongyuan.iteye.com/blog/2116663

GameObject、Transform、Component

GameObject爲實例化的遊戲對象,包含了一個或以上的Component,Transform屬於Component,且任何GameObject必然包含Transform組件。類關係圖如下

這裏寫圖片描述

管理一個場景的遊戲對象樹林

查找對象

首先要保證對象是active狀態

1.通過對象名稱

public static GameObject Find (string name)
傳入的name可以是單個對象的名字,也可以是hierarchy中的一個路徑名,若找到則返回該對象,否則爲null

2.通過標籤獲取單個遊戲對象

public static GameObject FindWithTag (string tag)
返回一個用tag做標識的活動的對象,否則null

3.通過標籤獲取多個遊戲對象

public static GameObject[] FindGameObjectsWithTag (string tag)
返回一個用tag做標識的活動的遊戲物體的列表,否則null

4.通過類型獲取單個遊戲對象

public static Object FindObjectOfType(Type type)
返回類型爲type的活動的第一個遊戲對象

5.通過類型獲取多個遊戲對象

public static Object FindObjectsOfType(Type type)
返回類型爲type的所有的活動的遊戲對象列表

添加子對象

public static GameObject CreatePrimitive(PrimitiveType type)

遍歷對象樹

unity中的GameObject是沒有層次關係的,但是每個GameObject都有一個transform組件,這個組件實現了IEnumerable接口,從而支持計數器,因此可以使用循環遍歷子物體

foreach(Transform child in transform)
{
Debug.Log(child.gameObject.name);
}
/* transform是所需要找的物體GameObject的Transform

·清除所有子對象
foreach(Transform child in transform)
{
Destroy(child.gameObject);
}

預設與克隆對象

當我們倖幸苦苦做出來一個超棒的人物模型的時候總是會感慨過程的艱難,這時候我們可以把這個模型作爲預設以便以後使用,這樣的人物模型,以後即可以修改成魔獸,也可以修改成天使、惡魔之類的造型,這樣可以把我們做好的對象作爲一個資源存儲起來以便以後使用,預設就是這樣的一個方便的模板。雖然預設也可以創造出對象,但是與對象克隆不同,對象克隆後,克隆體與本體之間就再無關聯,簡單來說,就是克隆體發生任何改變,本體都不會受到影響,而預設作爲一個模板,當預設的屬性發生改變時,場景中的任何一個由該預設創建出來的對象的屬性都會發生相應的變化。因此,預設可以用於批量處理。

組合模式

是組合多個對象形成樹形結構以表示具有部分-整體關係的層次結構。以資源管理器爲例,文件夾屬於容器構件,因爲它可以容納其他文件或文件夾。文件相當於葉子結構,因爲它不能再包含任何文件或文件夾。組合模式把文件和文件夾當成統一的一個對象來處理,可以讓客戶端可以統一的對待單個對象和組合對象。而實現這一點則是靠簡單對象和複合對象擁有相同的接口。
組合模式包含三個內容:
1.Component(抽象構件):是所有葉子構件和容器構件的共同父類,裏面聲明瞭葉子構件和容器構件的所有方法。
2.Leaf(葉子構件):對於從父類中繼承過來的容器構件的方法,由於它不能實現,可以拋出異常。
3.Composite(容器構件):主要處理從父類那裏繼承過來的容器構件的方法
組合模式使用面向對象思想實現樹形結構的構建和處理,描述瞭如何將容器對象和葉子對象遞歸組合,實現簡單高效的統一管理。由於在實際開發中樹形結構用的非常多,所以組合模式也是應用特別廣泛的一種設計模式。它的缺點是,在對文件或者文件夾進行操作時,無法對文件或文件夾進行精確控制。
我new了一個unity項目,創建了兩個GameObject的空對象,組織結構爲:
這裏寫圖片描述

分別掛載了一個腳本

這裏寫圖片描述

這裏父類函數中的BroadcastMessage()函數會將所有子類中函數名爲Test的方法都執行一遍。自然,結果如圖:
這裏寫圖片描述
接下來會推出我做的井字棋遊戲或者計算器或者什麼的。。。期待嗎?先趕完其他作業在發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章