Files
taptap2024_GJ_chidouren/Packages/com.xfkj.xffsm@357f537fea/Runtime/FSMCondition.cs

175 lines
4.5 KiB
C#
Raw Normal View History

2024-10-16 00:03:41 +08:00
using System;
using System.Collections.Generic;
namespace XFFSM
{
public enum ConditionState
{
// 满足
Meet,
// 未满足
NotMeet
}
public class FSMCondition
{
#region
private FSMConditionData data;
private FSMParameterData parameter;
public Action onConditionMeet;
private static Dictionary<CompareType, IPamaterCompare> Compares = new Dictionary<CompareType, IPamaterCompare>();
#endregion
#region
public ConditionState State
{
get
{
if (compare.IsMeetCondition(this.parameter, data.targetValue))
return ConditionState.Meet;
else
return ConditionState.NotMeet;
}
}
private IPamaterCompare compare => GetCompare(data.compareType);
public FSMParameterData Parameter => parameter;
#endregion
static FSMCondition() {
InitCompares();
}
public FSMCondition(FSMConditionData data, RuntimeFSMControllerInstance controller) {
this.data = data;
if (controller.parameters.ContainsKey(data.parameterName)) {
parameter = controller.parameters[this.data.parameterName];
}
if (parameter != null)
parameter.onValueChange += CheckParameterValueChange;
// 检测条件
CheckParameterValueChange();
}
public void CheckParameterValueChange()
{
// 判断条件有没有满足
if (State == ConditionState.Meet)
onConditionMeet?.Invoke();
}
private static void InitCompares() {
if (Compares.Count == 0) {
Compares.Add(CompareType.Equal, new EqualCompare());
Compares.Add(CompareType.Greater, new GreaterCompare());
Compares.Add(CompareType.Less, new LessCompare());
Compares.Add(CompareType.NotEqual, new NotEqualCompare());
}
}
public static IPamaterCompare GetCompare(CompareType type) {
IPamaterCompare pamaterCompare;
if ( Compares.TryGetValue(type,out pamaterCompare) ) {
return pamaterCompare;
}
return null;
}
}
public class FSMConditionGroup
{
private List<FSMCondition> conditions = new List<FSMCondition>();
public Action onConditionMeet;
public bool IsMeet
{
get
{
// 当前过渡没有条件并且自动切换时直接返回true已满足
if (transition.Empty && transition.AutoSwtich)
return true;
if (ConditionCount == 0)
return false;
foreach (var item in conditions)
{
if (item.State == ConditionState.NotMeet)
return false;
}
return true;
}
}
public int ConditionCount
{
get
{
if (conditions == null)
return 0;
return conditions.Count;
}
}
private RuntimeFSMControllerInstance controller;
private FSMTransitionData transition;
public FSMConditionGroup(RuntimeFSMControllerInstance controller, List<FSMConditionData> conditions,FSMTransitionData transition)
{
this.controller = controller;
this.transition = transition;
this.conditions.Clear();
foreach (var item in conditions)
{
FSMCondition condition = new FSMCondition(item, controller);
condition.onConditionMeet += this.CheckIsMeet;
this.conditions.Add(condition);
}
}
//private void OnConditionMeet()
//{
// //Debug.Log("条件满足!");
// DelayTools.DelayCall(CheckIsMeet);
//}
private void CheckIsMeet()
{
if (IsMeet)
onConditionMeet?.Invoke();
}
internal void ResetTrigger() {
foreach (var item in conditions)
{
if (item.Parameter.parameterType == ParameterType.Trigger)
controller.ClearTrigger(item.Parameter.name);
}
}
}
}