離散仿真引擎基礎-作業與練習

1、簡答題

解釋 遊戲對象(GameObjects) 和 資源(Assets)的區別與聯繫。

  • 對象(GameObject)是指出現在遊戲中的具體事物,它可以是我們創建的精靈和各種形狀的物體,也可以是遊戲場景和攝像機等。遊戲對象本身不做任何事情,它們需要特殊屬性才能成爲一個角色、一種環境或者一種特殊效果。
  • 資源(Assets)是可以通過Unity資源商店下載並使用的素材,它可以被多個對象使用,它包括一些預設、腳本、聲音等。

一個對象通過使用資源實現自身的實例化,使其能夠真正地在遊戲中被應用。

下載幾個遊戲案例,分別總結資源、對象組織的結構(指資源的目錄組織結構與遊戲對象樹的層次結構)

資源的組織結構:預設、腳本、精靈、動畫、模型、使用說明等。
對象的組織結構:位置信息、文本管理、攝像機、對象的結構信息等。

編寫一個代碼,使用 debug 語句來驗證 MonoBehaviour 基本行爲或事件觸發的條件

基本行爲包括 Awake() Start() Update() FixedUpdate() LateUpdate()
常用事件包括 OnGUI() OnDisable() OnEnable()

代碼;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log("Awake.");
    }

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Start.");
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("Update.");
    }

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

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

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

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

    private void OnEnable()
    {
        Debug.Log("OnEnable.");
    }

}

在Unity中將腳本添加給一個cube並運行後可以看到結果:

執行順序與課件中的基本一致。

查找腳本手冊,瞭解 GameObject,Transform,Component 對象

分別翻譯官方對三個對象的描述(Description)

GameObject: Unity場景中所有實體的基類
Transform: 對象的位置,旋轉和縮放
Component: 附加到GameObjects的所有內容的基類

描述下圖中 table 對象(實體)的屬性、table 的 Transform 的屬性、 table 的部件

本題目要求是把可視化圖形編程界面與 Unity API 對應起來,當你在 Inspector 面板上每一個內容,應該知道對應 API。

table 的對象是 GameObject,第一行第一個選擇框是 activeSelf 屬性,第二個框是所選對象的名稱,第三個選擇框是static屬性;第二行第一個是tag屬性,第二個是Layer屬性;第三行是Perfabs屬性。
Transform第一行是Position屬性,包括xyz三個座標值;第二行是Rotation屬性,同樣包括三個座標值;第三行是Scale屬性,同樣包括三個座標值。
table的部件由4個組成,包括table1, table2, table3和table4。

用 UML 圖描述 三者的關係(請使用 UMLet 14.1.1 stand-alone版本出圖)

整理相關學習資料,編寫簡單代碼驗證以下技術的實現:

查找對象
        //search object
        var findObj = GameObject.Find("Object");
        if (findObj == null) Debug.Log("Object found.");
        else Debug.Log("Object not found.");
添加子對象
        //add sub object
        GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
        obj.transform.position = new Vector3(0, Random.Range(0, 5), 0);
        obj.transform.parent = this.transform;
遍歷對象樹
        //traverse object tree
        GameObject game[] = GameObject.FindObjectOfType<GameObject>();
        foreach (GameObject g in game)
        {
            Debug.Log(g.name);
        }
清除所有子對象
        //clear all object
        GameObject game[] = GameObject.FindObjectOfType<GameObject>();
        foreach (GameObject g in game)
        {
            GameObject.Destroy(g);
        }
資源預設(Prefabs)與 對象克隆 (clone)
預設(Prefabs)有什麼好處?

預設 (Prefab) 是存儲在工程視圖中可重複使用的遊戲對象 ,它可以放入多個場景中,並且每個場景可以使用多次,當我們向一個場景中添加一個預設時,就會創建它的一個實例,所以無論工程中有多少個實例,當我們對預設做出更改時,這些更改會運用與所有實例,這就使得遊戲製作起來更加高校和便捷。

預設與對象克隆 (clone or copy or Instantiate of Unity Object) 關係?

對象克隆需要場景中事先已存在對象,而預設允許場景中無對象存在,它只需事先創建預製即可,而場景中不存在對象時無法創建克隆對象;其次預設創建出的對象會根據預設的改變而改變,而克隆創建出的對象不會隨被克隆對象的改變而改變。

製作 table 預製,寫一段代碼將 table 預製資源實例化成遊戲對象
    public GameObject table;
    
    // Start is called before the first frame update
    void Start()
    {
        Resources.Load("table");
        Debug.Log("Start.");
        GameObject prefab = (GameObject)Instantiate(table);
        prefab.transform.position = new Vector3(0, Random.Range(0, 5), 0);
        prefab.transform.parent = this.transform;
    }


先將table拖入項目視圖,然後刪除對象,接着新建一個空對象GameObject,將table預製拖入對象層標籤,編寫好代碼後運行,發現視圖中生成了table。

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