2019-09-12 15:37:20 +00:00
using System ;
using UnityEngine ;
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 ;
2019-09-14 16:30:16 +00:00
[Serializable]
2019-09-12 15:37:20 +00:00
public class InvalidPhaseException : Exception {
public readonly ActPhase currentPhase ;
public InvalidPhaseException ( ActPhase currentPhase ) {
this . currentPhase = currentPhase ;
}
} ;
2019-09-14 16:30:16 +00:00
[Serializable]
2019-09-12 15:37:20 +00:00
public class MissingSettingsException : Exception { } ;
public ActPhase Phase { get ; }
/// <summary>
/// Call this to initialize the Act (GameObjects, ActSettings, etc). All interactable components should be disabled in this phase.
/// </summary>
public virtual void ActInit ( ) {
phase = ActPhase . INIT ;
2019-09-16 15:34:22 +00:00
canvas = GameObject . FindGameObjectWithTag ( "Canvas" ) ? . GetComponent < Canvas > ( ) ;
eventSystem = GameObject . FindGameObjectWithTag ( "EventSystem" ) ? . GetComponent < EventSystem > ( ) ;
2019-09-12 15:37:20 +00:00
if ( settings = = null ) {
throw new MissingSettingsException ( ) ;
}
}
/// <summary>
/// Call this to enable all interactable components in the Act. It should be called when the player is ready to play.
/// </summary>
public virtual void ActStart ( ) {
if ( Phase ! = ActPhase . INIT ) throw new InvalidPhaseException ( phase ) ;
phase = ActPhase . START ;
}
/// <summary>
/// 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).
/// </summary>
public virtual void ActEnd ( ) {
if ( Phase ! = ActPhase . START ) throw new InvalidPhaseException ( phase ) ;
phase = ActPhase . END ;
}
/// <summary>
/// Call this to cleanup all GameObjects created during the Init phase.
/// </summary>
public virtual void ActCleanup ( ) {
if ( Phase ! = ActPhase . END ) {
Debug . LogWarningFormat ( "ActCleanup() was called during {0}" , Phase ) ;
}
phase = ActPhase . CLEANUP ;
}
2019-09-14 16:30:16 +00:00
protected virtual void Awake ( ) {
}
2019-09-12 15:37:20 +00:00
protected virtual void Start ( ) {
2019-09-16 15:34:22 +00:00
2019-09-12 15:37:20 +00:00
}
protected virtual void Update ( ) {
}
protected virtual void OnDestroy ( ) {
ActCleanup ( ) ;
}
}