簡答題
1. 解釋遊戲對象(GameObjects) 和資源(Assets)的區別與聯繫。
遊戲對象(GameObjects) 指的是遊戲中一個可被選中的對象,比如一個方塊,一幅平面、一位角色形象等。對象可以被賦予一些屬性,進而完成某些動作。
而資源(Assets) 則是一個遊戲項目中的素材,比如音頻、視頻、腳本文件、模型等。
它們之間的聯繫是,資源可以被實例化成遊戲對象,遊戲對象也可以被保存爲資源。一個資源可以被多個遊戲對象使用,也可能不被任何對象使用。
2. 下載幾個遊戲案例,分別總結資源、對象組織的結構(指資源的目錄組織結構與遊戲對象樹的層次結構)
資源目錄下,根據資源的性質(Plugins,Code,Scene…),分成幾個子目錄,分別存放不同類型的資源。
子目錄下再進行分類(比如Resource目錄下的Effect,Image,Runtime…)方便對資源進行管理。
遊戲對象的結構如下,可以看到這個遊戲中有camera,Root,EventSystem,BDFrame等對象
3. 編寫一個代碼,使用 debug 語句來驗證 MonoBehaviour 基本行爲或事件觸發的條件
- 基本行爲包括 Awake() Start() Update() FixedUpdate() LateUpdate()
- 常用事件包括 OnGUI() OnDisable() OnEnable()
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log("Start");
}
// Update is called once per frame
void Update()
{
Debug.Log("Update");
}
void Awake()
{
Debug.Log("Awake");
}
void FixedUpdate()
{
Debug.Log("FixedUpdate");
}
void LateUpdate()
{
Debug.Log("LateUpdate");
}
void OnGUI()
{
Debug.Log("onGUI");
}
void OnDisable()
{
Debug.Log("onDisable");
}
void OnEnable()
{
Debug.Log("OnEnable");
}
}
運行結果:
4. 查找腳本手冊,瞭解 GameObject,Transform,Component 對象
- 分別翻譯官方對三個對象的描述(Description)
遊戲對象 是代表人物、道具和場景的基本對象。它們本身並沒有完成多少工作,但是它們充當組件的容器,組件實現真正的功能。
Transform 組件決定場景中每個對象的位置、旋轉和比例。每個遊戲對象都有一個Transform。
Component 是遊戲中對象和行爲的螺母和螺栓。它們是每個遊戲對象的功能部件。
-
描述下圖中 table 對象(實體)的屬性、table 的 Transform 的屬性、 table 的部件
- 本題目要求是把可視化圖形編程界面與 Unity API 對應起來,當你在 Inspector 面板上每一個內容,應該知道對應 API。
- 例如:table 的對象是 GameObject,第一個選擇框是 activeSelf 屬性。
table的屬性:activeInHierarchy(對象在當前場景中是否爲active),ObjectName,activeSelf(對象在本地是否爲active),Tag,Layer,prefabs(預設)
transform的屬性:Position,Rotation,Scale
table的部件:Mesh Filter,Box Collider,Mesh Renderer -
用 UML 圖描述 三者的關係(請使用 UMLet 14.1.1 stand-alone版本出圖)
5. 整理相關學習資料,編寫簡單代碼驗證以下技術的實現:
-
查找對象
``` //按照名字對象名查找 public static GameObject Find(string name) //按照標籤查找單個對象 public static GameObject FindWithTag(string tag) //按照標籤查找多個對象 public static GameObject[] FindGameObjectsWithTag(string tag) ```
-
添加子對象
public static GameObect CreatePrimitive(PrimitiveTypetype)
-
遍歷對象樹
foreach (Transform child in transform) { Debug.Log(child.gameObject.name); }
-
清除所有子對象
foreach (Transform child in transform) { Destroy(child.gameObject); }
-
8. 資源預設(Prefabs)與 對象克隆 (clone)
- 預設(Prefabs)有什麼好處?
- 預設相當於模板,方便我們創建具有相同屬性和行爲的對象。
- 預設方便管理對象。當同一類型的對象需要改變某些屬性時,我們只需要修改它們的預設即可。
- 預設與對象克隆 (clone or copy or Instantiate of Unity Object) 關係?
- 克隆必需是在已經存在一個對象的情況下,克隆出另外一個對象;而預設可以創造一個原先不存在的對象。
- A由B克隆得到,則B發生改變不會影響A;而預設發生改變時會影響所有創建的對象。
-
製作 table 預製,寫一段代碼將 table 預製資源實例化成遊戲對象
public GameObject table; void Start () { Debug.Log("Init Start"); GameObject newTable = (GameObject)Instantiate(table.gameObject); }
編程實踐
-
遊戲內容: 井字棋 或 貸款計算器 或 簡單計算器 等等
-
技術限制: 僅允許使用 IMGUI 構建 UI
-
作業目的:
- 解 OnGUI() 事件,提升 debug 能力
- 提升閱讀 API 文檔能力
作業鏈接:https://github.com/akanine/Unity3d_TicTacToe/tree/master
井字棋是一種在3*3棋盤上完成的連珠遊戲,類似於五子棋
實現效果如下:
思考題
- 微軟 XNA 引擎的 Game 對象屏蔽了遊戲循環的細節,並使用一組虛方法讓繼承者完成它們,我們稱這種設計爲“模板方法模式”。
- 爲什麼是“模板方法”模式而不是“策略模式”呢
模板方法模式是類的行爲模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後生命一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。
策略模式定義一組算法,這組算法實現了相同的接口或者繼承相同的抽象類。將每一個算法封裝起來,從而使它們可以相互切換。
策略模式是對象的行爲模式。
微軟XNA引擎的Game對象實際上是一組抽象類,因爲它“屏蔽了遊戲循環的細節,而使用虛方法讓繼承者完成細節”。符合模板方法模式的意圖,增強了game對象的拓展性,且使其易於維護;而策略模式的關鍵意圖在於封裝相似的算法使它們可以互相替換,但這樣會導致策略類繁多和暴露,不符合game對象的設計要求。
- 將遊戲對象組成樹型結構,每個節點都是遊戲對象(或數)。
- 嘗試解釋組合模式(Composite Pattern / 一種設計模式)。
組合模式用樹形結構來組合對象,表示部分以及整體的層次。把一組相似的對象當成一個單一對象,使用戶對單個對象和組合對象的使用具有一致性。使複雜元素的內部解耦、節點可自由增加、調用簡單。
-
使用 BroadcastMessage() 方法,向子對象發送消息。你能寫出 BroadcastMessage() 的僞代碼嗎?
public class NewBehaviourScript : MonoBehaviour { void message() { Debug.Log("HelloWorld!"); } void Start () { this.BroadcastMessage("parent"); } }
public class NewBehaviourScript1 : MonoBehaviour { void message() { Debug.Log("HelloWorld!"); } }
-
一個遊戲對象用許多部件描述不同方面的特徵。我們設計坦克(Tank)遊戲對象不是繼承於GameObject對象,而是 GameObject 添加一組行爲部件(Component)。
- 這是什麼設計模式?
裝飾器模式 - 爲什麼不用繼承設計特殊的遊戲對象?
- 採用裝飾器模式,裝飾類和被裝飾類可以獨立發展,不會相互耦合
- 繼承會增加過多的子類
- 繼承不能方便地動態添加/撤銷功能
- 這是什麼設計模式?