IndieGame/client/Assets/ParadoxNotion/NodeCanvas/Modules/StateMachines/Nodes/ActionState.cs

87 lines
2.7 KiB
C#
Raw Normal View History

2024-10-11 10:12:15 +08:00
using NodeCanvas.Framework;
using ParadoxNotion.Design;
using UnityEngine;
namespace NodeCanvas.StateMachines
{
[Name("Action State", 100)]
[Description("Execute a number of Action Tasks OnEnter. All actions will be stoped OnExit. This state is Finished when all Actions are finished as well")]
public class ActionState : FSMState, ITaskAssignable
{
[SerializeField]
private ActionList _actionList;
[SerializeField]
private bool _repeatStateActions;
public Task task {
get { return actionList; }
set { actionList = (ActionList)value; }
}
public ActionList actionList {
get { return _actionList; }
set { _actionList = value; }
}
public bool repeatStateActions {
get { return _repeatStateActions; }
set { _repeatStateActions = value; }
}
public override void OnValidate(Graph assignedGraph) {
if ( actionList == null ) {
actionList = (ActionList)Task.Create(typeof(ActionList), assignedGraph);
actionList.executionMode = ActionList.ActionsExecutionMode.ActionsRunInParallel;
}
}
protected override void OnEnter() { OnUpdate(); }
protected override void OnUpdate() {
var actionListStatus = actionList.Execute(graphAgent, graphBlackboard);
if ( !repeatStateActions && actionListStatus != Status.Running ) {
Finish(actionListStatus);
}
}
protected override void OnExit() {
actionList.EndAction(null);
}
protected override void OnPause() {
actionList.Pause();
}
///----------------------------------------------------------------------------------------------
///---------------------------------------UNITY EDITOR-------------------------------------------
#if UNITY_EDITOR
protected override void OnNodeGUI() {
if ( repeatStateActions ) {
GUILayout.Label("<b>[REPEAT]</b>");
}
base.OnNodeGUI();
}
protected override void OnNodeInspectorGUI() {
ShowTransitionsInspector();
if ( actionList == null ) {
return;
}
EditorUtils.CoolLabel("Actions");
GUI.color = repeatStateActions ? GUI.color : new Color(1, 1, 1, 0.5f);
repeatStateActions = UnityEditor.EditorGUILayout.ToggleLeft("Repeat State Actions", repeatStateActions);
GUI.color = Color.white;
actionList.ShowListGUI();
actionList.ShowNestedActionsGUI();
}
#endif
}
}