Files
taptap2024_GJ_chidouren/Packages/com.xfkj.xffsm@357f537fea/Runtime/FSMCondition.cs
2024-10-16 00:03:41 +08:00

175 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}
}
}