using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public abstract class ActController : MonoBehaviour { [Header("Settings")] public ActSettings settings = null; protected ActPhase phase = ActPhase.NONE; [Header("Results")] public ActResults results = null; [Header("Objects")] public Canvas canvas = null; public EventSystem eventSystem = null; [Serializable] public class ActSettings { public string type; } [Serializable] public class ActResults { }; [Serializable] public class InvalidPhaseException : Exception { public readonly ActPhase currentPhase; public InvalidPhaseException(ActPhase currentPhase) { this.currentPhase = currentPhase; } }; [Serializable] public class MissingSettingsException : Exception {}; [Serializable] public enum ActPhase { NONE, INIT, START, END, CLEANUP } public ActPhase Phase { get; } /// /// Call this to initialize the Act (GameObjects, ActSettings, etc). All interactable components should be disabled in this phase. /// public virtual void ActInit() { phase = ActPhase.INIT; if(settings == null) { throw new MissingSettingsException(); } } /// /// Call this to enable all interactable components in the Act. It should be called when the player is ready to play. /// public virtual void ActStart() { if(Phase != ActPhase.INIT) throw new InvalidPhaseException(phase); phase = ActPhase.START; } /// /// Call this to disable once again all interactable components in the Act. It should be called when the Act is finished (time ran out, player reached submission limit, etc). /// public virtual void ActEnd() { if(Phase != ActPhase.START) throw new InvalidPhaseException(phase); phase = ActPhase.END; } /// /// Call this to cleanup all GameObjects created during the Init phase. /// public virtual void ActCleanup() { if(Phase != ActPhase.END) { Debug.LogWarningFormat("ActCleanup() was called during {0}", Phase); } phase = ActPhase.CLEANUP; } protected virtual void Awake() { } protected virtual void Start() { canvas = GameObject.FindGameObjectWithTag("Canvas")?.GetComponent(); eventSystem = GameObject.FindGameObjectWithTag("EventSystem")?.GetComponent(); ActInit(); } protected virtual void Update() { } protected virtual void OnDestroy() { ActCleanup(); } }