unityzgy/Assets/Scripts/ZFramwork/StepFrmework/StepNodeBase.cs
ayuan9957 bf12e02276 feat: 多语言本地化系统 - 支持中/英/法/俄实时切换
- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg)
- LoginPanel: InputField placeholder本地化、字体颜色保持
- HistoryPanel: 用时数据本地化、placeholder本地化
- RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建)
- AppraiseWindowBase: 评价等级本地化、操作消息重建
- EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized
- StudentOperateRecorder: 新增InjectOperateMsgLocalized方法
- LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选
- 字体切换时保留颜色和verticalOverflow
2026-07-16 10:05:59 +08:00

175 lines
4.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//流程中步骤节点控制基类 管理所有的前置和后置步骤 定义步骤激活和步骤完成行为
public abstract class StepNodeBase : MonoBehaviour
{
protected ProcessEnum currentProcess;//流程名称
[SerializeField]
protected bool autoFinishedStep;//激活时自动完成的步骤
[SerializeField]
string nodeName;
/// <summary>
/// 节点名称
/// </summary>
public string NodeName
{
get
{
return nodeName;
}
}
//[HideInInspector]
//节点完成情况
public NodeFinishState stepState;
public NodeFinishState StepState
{
get
{
return stepState;
}
}
//当前节点激活状态 避免重复激活
protected NodeActiceState nodeActiceState;
public NodeActiceState NodeActiceState
{
get
{
return nodeActiceState;
}
}
/// <summary>
/// 前置节点 所有的前置节点满足后 启动本节点
/// </summary>
public List<StepNodeBase> preconditionNodes = new List<StepNodeBase>();
/// <summary>
/// 后置节点 本节点完成后 通知后置节点
/// </summary>
public List<StepNodeBase> postpositionNodes = new List<StepNodeBase>();
public event UnityAction NodeFinished;//步骤完成
// Start is called before the first frame update
protected virtual void Awake()
{
ProcessManager.Instance.AddStep(this);//将操作物体加入当前流程控制器
}
/// <summary>
/// 前置节点通知完成时
/// </summary>
public void PreNodeFinished(StepNodeBase stepNode = null)
{
bool hasPNunFinised = false;
for (int i = 0; i < preconditionNodes.Count; i++)
{
if (preconditionNodes[i].StepState == NodeFinishState.unFinished)
{
hasPNunFinised = true;
break;
}
}
if (!hasPNunFinised)//前置节点都完成了 或者没有前置节点
{
stepState = NodeFinishState.unFinished;
Active();
Debug.Log($"{currentProcess}流程,前置条件均满足,{nodeName}激活");
}
}
/// <summary>
/// 开始前先设置 流程 避免某些节点激活时自动完成 导致后续流程异常
/// </summary>
/// <param name="processEnum"></param>
public void SetProcess(ProcessEnum processEnum)
{
currentProcess = processEnum;
}
/// <summary>
/// 流程开始时执行
/// </summary>
/// <param name="active"></param>
public void ProcessStart()
{
stepState = NodeFinishState.unFinished;//开始时默认所有的 步骤均为完成
if (preconditionNodes.Count == 0)//无前置节点流程开始时 直接激活
{
//Debug.Log($"{currentProcess}流程开始时{nodeName}激活");
Active();
}
}
//流程结束时
public void ProcessStop()
{
UnActive();
}
/// <summary>
/// 节点激活时执行
/// </summary>
protected abstract void Active();
/// <summary>
/// 退出激活状态时执行
/// </summary>
protected abstract void UnActive();
/// <summary>
/// 节点行为完成 退出激活状态 通知后续节点 由节点行为结束时调用
/// </summary>
protected virtual void NodeFinised()
{
Debug.Log(NodeName + "步骤完成");
stepState = NodeFinishState.finished;
UnActive();
NodeFinished?.Invoke();//节点完成事件 通知外部的事件
ProcessManager.Instance.RecordFinisedStep(NodeName);//通知管理器本节点完成
//尝试启动后续节点
for (int i = 0; i < postpositionNodes.Count; i++)
{
postpositionNodes[i].PreNodeFinished(this);
}
}
}
//节点完成状态
public enum NodeFinishState
{
/// <summary>
/// 已完成
/// </summary>
finished,
/// <summary>
/// 未完成
/// </summary>
unFinished,
}
/// <summary>
/// 节点激活状态
/// </summary>
public enum NodeActiceState
{
/// <summary>
/// 已激活状态
/// </summary>
active,
/// <summary>
/// 未激活状态
/// </summary>
unActice,
}