这是第一个 Unity 开放项目的repo,是 Unity 和社区合作创建的一个小型开源游戏演示,第一款游戏是一款名为 Chop Chop 的动作冒险游戏。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

88 行
2.2 KiB

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