3D遊戲02-離散仿真引擎

簡答題

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)有什麼好處?
  1. 預設相當於模板,方便我們創建具有相同屬性和行爲的對象。
  2. 預設方便管理對象。當同一類型的對象需要改變某些屬性時,我們只需要修改它們的預設即可。
  • 預設與對象克隆 (clone or copy or Instantiate of Unity Object) 關係?
  1. 克隆必需是在已經存在一個對象的情況下,克隆出另外一個對象;而預設可以創造一個原先不存在的對象。
  2. 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)。

    • 這是什麼設計模式?
      裝飾器模式
    • 爲什麼不用繼承設計特殊的遊戲對象?
    1. 採用裝飾器模式,裝飾類和被裝飾類可以獨立發展,不會相互耦合
    2. 繼承會增加過多的子類
    3. 繼承不能方便地動態添加/撤銷功能
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章