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。