using System; using UnityEngine; public abstract class GameMod : MonoBehaviour { public enum Result { Success, Timeout, Dead, Quit, MissionFail } [SerializeField] GameModProperty property; GameModData data; bool isInitialized = false; public uint ModID => property.id; public GameModData Data { get { if(data is null) { GameModDataGroup.Instance.TryGetModData(ModID, out data); Debug.Assert(Data != null, "Data is null"); } return data; } } public event Action OnDone; private void Awake() { gameObject.SetActive(false); } public void StartMod() { if (!isInitialized) { OnInitialize(); isInitialized = true; } Logger.Log("Start Dungeon " + GetType().Name); OnStartMod(); gameObject.SetActive(true); } public void EndMod() { Logger.Log("End Dungeon " + GetType().Name); OnEndMod(); gameObject.SetActive(false); } private void Update() { if (!isInitialized) return; OnUpdate(); } protected virtual void OnInitialize() { } protected abstract void OnStartMod(); protected abstract void OnUpdate(); protected abstract void OnEndMod(); protected void FireOnDone(Result result) => OnDone?.Invoke(result); }