我要加入

UNITY3D聖殿-自由的遊戲設計天堂

會長:stormcorn / stormcorn開設日:2013-03-21 18:05:22

  • EXP

  • 資金24183  
  • 招募制度:自由加入制
  • 成員:1738 人
  • 昨日人氣:0

遊戲程式進入點

推上精選編輯

近期編輯:ADSL1234567B ...看更多

在設計程式時,通常會保持單一入口,也就是程式進入點只有一個,遊戲程式也不例外。

Unity的Scene,可以在Build Settings設定哪一個Scene為遊戲程式的第一個場景,而這也允許開發者可以把初始場景弄得很複雜,塞一堆東西,但不建議這麼做,理由如下:
  • 初始場景愈小愈好,這也代表Unity啟動後,進入真正的遊戲內容之時間愈短。
  • 初始場景不應該任意被修改。
  • 動態載入,程式掌控度也較高,不相依於Scene。
  • 程式均以唯一的進入點來初始化其餘組件,較不容易產生莫名其妙的問題。

簡單範例:

using System.Collections;
using UnityEngine;

public sealed class Main : MonoBehaviour
{
    private static Main _Instance;
    
    public static Main Instance
    {
        get
        {
            if (_Instance == null)
            {
                _Instance = FindObjectOfType(typeof(Main)) as Main;
                if (_Instance == null)
                {
                    GameObject go = new GameObject("_Main");
                    _Instance = go.AddComponent<Main>();
                }
            }
            return _Instance;
        }
    }
    
    // Unity 的 Component 禁止自行定義 constructor
    void Start()
    {
        DontDestroyOnLoad(this);

        // 保證 Main 只會有一個
        if (_Instance != this)
        {
            Destroy(this);
            return;
        }

        StartCoroutine(Load());
    }

    IEnumerator Load()
    {
        // Do something...
        yield return null;
    }
}

在初始場景添加一個空的GameObject,並附加此Main Component。
當執行遊戲時,在Start()會檢查Main是否為唯一的Instance,即便是後來在執行期強迫添加Main,或者在編輯期加了一堆Main,不是第一個Main均會被強制移除。
此方法也應用了Design Pattern的Singleton Pattern,但由於Unity Component禁止定義constructor,所以得用其他手法來處理。
接著,啟動Coroutine來執行載入作業,載入通常需要等待,必須要是非同步作業,才不會讓玩家覺得程式好像當了。而載入過程會初始化各個管理器、元件,載入接著需要使用的東西等。

若有WYSIWYG的需求,則此設計方針則不是絕對。

公會首頁

主選單
關聯資料