在設計程式時,通常會保持單一入口,也就是程式進入點只有一個,遊戲程式也不例外。
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的需求,則此設計方針則不是絕對。