You've already forked taptap2024_GJ_chidouren
175 lines
4.5 KiB
C#
175 lines
4.5 KiB
C#
|
|
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);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|