イベントマスタはEXCEL(Spreadsheet)で管理しhttps://qiita.com/mikito/items/2ad911f69180c15102a1 こちらのUnity Excel Importerを使ってUnity内にScriptableObjectとしてインポートします。
イベント達成(ミッション)などを監視するシステムを作る場合、各シーンにまたがって変数の変化を計測したりイベント達成を表示するUIが必要になります。
しかし、各シーンに同じスクリプトをアタッチしたオブジェクトやUIオブジェクトを配置するのは保守性が悪いので、DontDestroyOnLoadで最初のゲーム内シーンで読み込ませます。
public class MissionManager : MonoBehaviour
{
private static GameObject mInstance;//シングルトン
public static GameObject Instance
{
get
{
return mInstance;
}
}
//ScriptableObjectで渡されるイベント一覧データ
[SerializeField]
Mission missions;
//イベント達成が重なった時に順番にメッセージを出していく為のリスト
List<MissionItemEntity> missionCompletedQueue = new List<MissionItemEntity>();
//ミッションの達成状態
public enum MissionState
{
Achieved, //達成済み
NotAchieved, //未達成
Received //報酬受取済み
}
//達成済みイベントを保存するディクショナリ。インデックスはイベントID。Load()でロードするのはこれ
public Dictionary<int, MissionState> achievedDailyMissionList = new Dictionary<int, MissionState>();
//イベント進度変数クラス
public MissionCounter missionCounter = new MissionCounter();
private void Awake()
{
int num = FindObjectsOfType<MissionManager>().Length;
if (num > 1)
{
Destroy(gameObject);
}
else
{
DontDestroyOnLoad(gameObject);
mInstance = gameObject;
//イベント達成ディクショナリの初期化
foreach (var v in missions.Daily)
{
achievedDailyMissionList[v.missionID] = MissionState.NotAchieved;
}
//イベント達成状態をロード
Load();
}
}
void Start()
{
//扱いやすい様に子オブジェクトを取得
}
void Update()
{
//デイリーイベントの場合は日付変更チェック
//日付が変更されていればデイリー用のイベント進度変数と達成リストクリア
//イベント達成チェック
//達成してたら達成リスト更新してセーブ
//達成メッセージ未表示イベントがあればメッセージ表示
}
}
更に、このスクリプトをアタッチしたGameObjectの配下にOverlay設定のCanvas、その配下にイベント達成メッセージUIのGameObjectを配置します。
これで、最初のシーンからこのGameObjectは継続して存在し、イベント達成を監視し続け、どのシーンでも同じ様にメッセージを表示出来ます。
DontDestroyOnLoadを使うデメリットとして、ゲーム内の最初のシーンからデバッグしないとイベント監視が行われないという点があります。




コメント