using UOP1.StateMachine.ScriptableObjects; namespace UOP1.StateMachine { /// /// Class that represents a conditional statement. /// public abstract class Condition : IStateComponent { private bool _isCached = false; private bool _cachedStatement = default; internal StateConditionSO _originSO; protected StateConditionSO OriginSO => _originSO; /// /// Specify the statement to evaluate. /// /// protected abstract bool Statement(); /// /// Wrap the so it can be cached. /// internal bool GetStatement() { if (!_originSO.cacheResult) return Statement(); if (!_isCached) { _isCached = true; _cachedStatement = Statement(); } return _cachedStatement; } internal void ClearStatementCache() { _isCached = false; } /// /// Awake is called when creating a new instance. Use this method to cache the components needed for the condition. /// /// The this instance belongs to. public virtual void Awake(StateMachine stateMachine) { } public virtual void OnStateEnter() { } public virtual void OnStateExit() { } } /// /// Struct containing a Condition and its expected result. /// public readonly struct StateCondition { internal readonly StateMachine _stateMachine; internal readonly Condition _condition; internal readonly bool _expectedResult; public StateCondition(StateMachine stateMachine, Condition condition, bool expectedResult) { _stateMachine = stateMachine; _condition = condition; _expectedResult = expectedResult; } public bool IsMet() { bool statement = _condition.GetStatement(); bool isMet = statement == _expectedResult; #if UNITY_EDITOR _stateMachine._debugger.TransitionConditionResult(_condition._originSO.name, statement, isMet); #endif return isMet; } } }