Unity チュートリアルのタワーディフェンステンプレートを触ってみる(47)
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(46)では Prefab から追加した GameManager 継承関係にある Singleton と PersistentSingleton、GameManagerBase の解説を行った。今回は Prefab から追加した GameManager の解説を行っていく。
1.タワーディフェンステンプレートのステージの設定編 – GameManager.cs
GameManager.cs について稚拙ながら解説
「GameManager.cs」は「Assets/Scripts/TowerDefense/Game/GameManager.cs」の指しておりスクリプトについては以下の通り。内容としてはレベルの管理・読み込み・保存を行っている。
[cce_csharp]using Core.Data; using Core.Game; using UnityEngine; using UnityEngine.SceneManagement; namespace TowerDefense.Game { /// <summary> /// Game Manager - a persistent single that handles persistence, and level lists, etc. /// This should be initialized when the game starts. /// </summary> public class GameManager : GameManagerBase<GameManager, GameDataStore> { /// <summary> /// Scriptable object for list of levels /// </summary> public LevelList levelList; /// <summary> /// Set sleep timeout to never sleep /// </summary> protected override void Awake() { Screen.sleepTimeout = SleepTimeout.NeverSleep; base.Awake(); } /// <summary> /// Method used for completing the level /// </summary> /// <param name="levelId">The levelId to mark as complete</param> /// <param name="starsEarned"></param> public void CompleteLevel(string levelId, int starsEarned) { if (!levelList.ContainsKey(levelId)) { Debug.LogWarningFormat("[GAME] Cannot complete level with id = {0}. Not in level list", levelId); return; } m_DataStore.CompleteLevel(levelId, starsEarned); SaveData(); } /// <summary> /// Gets the id for the current level /// </summary> public LevelItem GetLevelForCurrentScene() { string sceneName = SceneManager.GetActiveScene().name; return levelList.GetLevelByScene(sceneName); } /// <summary> /// Determines if a specific level is completed /// </summary> /// <param name="levelId">The level ID to check</param> /// <returns>true if the level is completed</returns> public bool IsLevelCompleted(string levelId) { if (!levelList.ContainsKey(levelId)) { Debug.LogWarningFormat("[GAME] Cannot check if level with id = {0} is completed. Not in level list", levelId); return false; } return m_DataStore.IsLevelCompleted(levelId); } /// <summary> /// Gets the stars earned on a given level /// </summary> /// <param name="levelId"></param> /// <returns></returns> public int GetStarsForLevel(string levelId) { if (!levelList.ContainsKey(levelId)) { Debug.LogWarningFormat("[GAME] Cannot check if level with id = {0} is completed. Not in level list", levelId); return 0; } return m_DataStore.GetNumberOfStarForLevel(levelId); } } }[/cce_csharp]
12行目 : 「public class GameManager : GameManagerBase<GameManager, GameDataStore>」は前回解説した GameManagerBase を継承し、総称型として GameManager と GameDataStore を指定していることを指している。
GameManagerBase と 総称型については前回解説を行っているため、こちらを参照してほしい。
22行目 : 「protected override void Awake()」は Unity 固有の起動処理を行っている。内容としてはプレイ中は画面の sleep を行わない(Never Sleep)ように設定後、GameManagerBase の起動処理を行っている。
33行目 : 「public void CompleteLevel(string levelId, int starsEarned)」はクリアした Level の保存を行っている。内容としては LevelList に ID が存在していなければ警告を出力後、GameManagerBase のグローバル変数として定義した m_DataStore にクリアしたレベルの登録後、GameManagerBase の SaveData を行っている。
48行目 : 「public LevelItem GetLevelForCurrentScene()」は現在のシーン名から LevelItem の取得をおこなている。
60行目 : 「public bool IsLevelCompleted(string levelId)」は引数で与えられた LevelId がクリアしているか判定を行っている。
76行目 : 「public int GetStarsForLevel(string levelId)」は引数で与えられた LevelId の Level を取得している。