You've already forked taptap2024_GJ_chidouren
init
This commit is contained in:
174
Packages/com.xfkj.xffsm@357f537fea/Runtime/FSMCondition.cs
Normal file
174
Packages/com.xfkj.xffsm@357f537fea/Runtime/FSMCondition.cs
Normal file
@@ -0,0 +1,174 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user