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

117 lines
2.9 KiB
C#
Raw Normal View History

2024-10-16 00:03:41 +08:00
using System;
using System.Collections.Generic;
using UnityEngine;
namespace XFFSM
{
/// <summary>
/// 状态节点
/// </summary>
public class FSMStateNode
{
#region
/// <summary>
/// 状态数据
/// </summary>
public FSMStateNodeData data;
internal RuntimeFSMControllerInstance instance;
private List<FSMState> states = new List<FSMState>();
internal string lastState;
internal string nextState;
/// <summary>
/// 是否正在执行中
/// </summary>
internal bool isRuning = false;
internal bool isFirstEnter = true;
[Tooltip("当前状态名称Hash,可通过方法Animator.StringToHash()转换!")]
public int nameHash;
#endregion
#region
internal FSMStateNode(FSMStateNodeData data,RuntimeFSMControllerInstance instance)
{
this.data = data;
this.instance = instance;
nameHash = Animator.StringToHash(data.name);
states.Clear();
foreach (var item in this.data.StateScripts)
{
Type type = AssemblyTools.GetType(item.className);
FSMState state = null;
if (type != null)
state = Activator.CreateInstance(type) as FSMState;
if (state != null)
{
state.controller = instance.FSMController;
state.userData = instance.FSMController.userData;
state.currentStateInfo = this;
states.Add(state);
}
}
}
internal void OnEnter()
{
isRuning = true;
foreach (var item in this.states)
{
item.lastState = lastState;
item.nextState = nextState;
if (isFirstEnter)
item.OnCreate(); // 调用 OnCreate 的方法
item.OnEnter();
}
isFirstEnter = false;
}
internal void OnExit()
{
foreach (var item in this.states)
{
item.lastState = lastState;
item.nextState = nextState;
item.OnExit();
}
isRuning = false;
}
internal void OnUpdate()
{
foreach (var item in this.states)
{
item.OnUpdate();
}
}
internal void OnFixedUpdate()
{
foreach (var item in this.states)
{
item.OnFixedUpdate();
}
}
internal void OnLateUpdate()
{
foreach (var item in this.states)
{
item.OnLateUpdate();
}
}
#endregion
}
}