【Unity3D】資源對象、預設、查找對象、組合模式等知識點


 

1.解釋對象與資源區別於聯系,根據官方案例,分別總結資源和對象組織的規則/規律。
    下載並查看了Adam和Survival Shooter tutorial兩個官方資源案例,這些案例作為資源,可以作為一個模板導入使用,也可以被多個對象使用或者本身實例化為游戲中的對象。導入的過程中可以自由選擇部分資源導入,導入的這些資源可以被自己新建的對象所使用。資源內部可以有很多對象。
    Unity商店資源分類有3D模型、動畫、音頻、腳本、着色器、紋理和材料、編輯器擴展等。資源有Audio, Fonts, GiParamaters, Materials, Models, Prefabs, Scripts, Textures等。對象則有玩家、環境、對手、攝像機、燈光等虛擬父類。資源是可以被多個對象使用的,本身也可以進行實例化。對比起對象,資源更像是集成的可擴展的模板包。


2.編寫簡單程序代碼,逐一驗證MonoBehaviour基本行為觸發的條件。
MonoBehaviour is the base class from which every Unity script derives.查閱了官方文檔,MonoBehaviour行為有很多,基本行為選取了Awake, Start, Update, FixedUpdate, LateUpdate, Reset, OnGUI, OnDestroy, OnDisable來進行實驗研究。
代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class exam : MonoBehaviour {
    void Awake () {
        Debug.Log ("Awake");
    }

    // Use this for initialization
    void Start () {
        Debug.Log ("Start");
    }
    
    // Update is called once per frame
    void Update () {
        Debug.Log ("Update");
    }

    void FixedUpdate () {
        Debug.Log ("FixedUpdate");
    }

    void LateUpdate () {
        Debug.Log ("LateUpdate");
    }

    void Reset () {
        Debug.Log ("Reset");
    }

    void OnGUI () {
        Debug.Log ("OnGUI");
    }

    void OnDestroy () {
        Debug.Log ("OnDestroy");
    }

    void OnDisable () {
        Debug.Log ("OnDisable");
    }
}

實驗小結:
經過閱讀官方文檔以及實踐檢驗,發現Awake是在腳本實例被加載時即被調用;
FixedUpdate是當MonoBehaviour啟用之后在每一個固定的framerate frame中被調用;
LateUpdate是當Behaviour是enabled的情況下在每一frame被調用。
OnDestroy是當MonoBehaviour被銷毀時調用
OnDisable是當行為變得無效的時候被調用
OnEnable是當對象啟用並激活的時候被調用
OnGUI是當渲染和處理GUI事件時被調用。
Reset是重置為默認值
Start只執行一次,在第一個Update被調用時啟用。
Update被叫做每一幀,如果MonoBehaviour被接受。


 

3.通過官方參考手冊,查找GameObject,Transform,Component對象,簡單解釋三者之間的關系。(使用UMlet畫教程上圖)
Unity由Scene中的各種游戲對象(GameObject)構成游戲世界,組件(Component)是用來掛載到游戲對象(Game Object)上的一組相關屬性。本質上每個組件是一個類的實例。不同類型的游戲對象,都可以看成一個空的游戲對象,通過掛載不同組件實現不同功能。Unity腳本也是以組件的形式掛載在GameObject上執行的

GameObject:Unity場景中所有實體的基類Base class for all entities in Unity scenes.
class in UnityEngine/Inherits from:Object

Transform:指對象的位置、旋轉和縮放。
場景中的每個對象都有一個變換。它用來存儲和操縱物體的位置、旋轉和縮放。每一個變換都可以有一個父函數,它允許你應用位置、旋轉和縮放。這是層次結構窗格中看到的層次結構。他們也支持枚舉,所以你可以通過兒童使用環:
class in UnityEngine/Inherits from:Component

Component:連接到所有基類對象。(Base class for everything attached to GameObjects)
class in UnityEngine/inherits form:Object

 

使用UMlet畫圖:

4.整理官方和其他學習材料,介紹如何用程序(代碼)管理一個場景的游戲對象樹林。編寫簡單代碼驗證以下技術的實現:
4.1查找對象
Unity中提供了五種獲取對象的方法
1.通過對象名稱(Find)
public static GameObject Find(string name);
通過名字尋找對象並返回它,只返回active GameObject,如果沒有GameObject,則返回null。如果名稱內包含“/”字符,會當做是hierarchy中的一個路徑名。

2.通過標簽獲取單個游戲對象
public static GameObject FindWithTag(string tag))
返回一個用tag做標識的活動的對象,如果沒有找到則為null。

using UnityEngine;
        using System.Collections;

        public class findwithtag : MonoBehaviour {
            public GameObject a;
            public GameObject b;
            void Start() {
                if (b == null)
                    b = GameObject.FindWithTag("Respawn");

                Instantiate(a, b.transform.position, b.transform.rotation);
            }
        }

3.通過標簽獲取多個游戲對象
public static GameObject[] FindGameObjectsWithTag(string tag);
返回一個用對象標記的標簽,如果沒有找到對象則返回空數組。

using UnityEngine;
        using System.Collections;

        public class Example : MonoBehaviour {
            public GameObject a;
            public GameObject[] b;
            void Start() {
                if (b == null)
                    b = GameObject.FindGameObjectsWithTag("Respawn");

                foreach (GameObject respawn in b) {
                    Instantiate(a, respawn.transform.position, respawn.transform.rotation);
                }
            }
        }

4.通過類型獲取單個游戲對象
返回類型為type的活動的第一個游戲對象。

5.通過類型獲取多個游戲對象
返回類型為type的所有活動的游戲對象列表。
4.2添加子對象
public static GameObject CreatePrimitive(PrimitiveType type);
創建一個游戲對象與原始網格渲染器和適當的collider。

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Start() {
        GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane);
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.transform.position = new Vector3(0, 0.5F, 0);
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = new Vector3(0, 1.5F, 0);
        GameObject capsule = GameObject.CreatePrimitive(PrimitiveType.Capsule);
        capsule.transform.position = new Vector3(2, 1, 0);
        GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
        cylinder.transform.position = new Vector3(-2, 1, 0);
    }
}

4.3遍歷對象樹
foreach (Transform child in transform) {
Debug.Log(child.gameObject.name);
}

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

 


5.預設有什么好處?與對象克隆 (clone or copy or Instantiate of Unity Object) 關系?
預設是一個非常容易復用的類模板,可以迅速方便創建大量相同屬性的對象、操作簡單,代碼量少,減少出錯概率。修改的復雜度降低,一旦需要修改所有相同屬性的對象,只需要修改預設即可,所有通過預設實例化的對象都會做出相應變化。而克隆只是復制一個一模一樣的對象,這個對象獨立於原來的對象,在修改的過程中不會影響原有的對象,這樣不方便整體改動。

6.解釋組合模式。並編寫驗證程序,向組合對象中子對象 cast 消息,驗證組合模式的優點。
組合模式(Composite Pattern),又叫部分整體模式,是用於把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象,用來表示部分以及整體層次。這種類型的設計模式屬於結構型模式,它創建了對象組的樹形結構。這種模式創建了一個包含自己對象組的類。該類提供了修改相同對象組的方式。組合模式是將對象組合成樹形結構以表示“部分-整體”的層次結構,它使得用戶對單個對象和組合對象的使用具有一致性。
經典案例:系統目錄結構,網站導航結構等

組合模式的使用,使得Unity離散引擎靈活、易於擴展;Component強組合於GameObject,使得內存空間管理富有效率,提高了性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM