Files
Cielonos/Assets/Scripts/SLSUtilities/StorySystem/Base/NarrativeTrigger.cs
SoulliesOfficial 8186f54e90 新场景,剧情
2026-06-02 12:55:39 -04:00

76 lines
2.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Sirenix.OdinInspector;
using UnityEngine;
namespace SLSUtilities.Narrative
{
/// <summary>
/// 通用剧情触发器基类。
/// 仅负责管理触发状态oneShot, hasFired与全局故事 IDstoryId
/// 具体触发的时机与条件由派生类(子类)自行重写并定义。
/// </summary>
public abstract class NarrativeTrigger : MonoBehaviour
{
/// <summary>
/// 全局静态触发事件。当任何剧情触发器被激活时触发。
/// 用于彻底解耦 SLSUtilities 核心程序集与 MainGame 层的 StoryDirector。
/// </summary>
public static System.Action<string> OnNarrativeTriggerFired;
[TitleGroup("Trigger Settings", "剧情触发器核心配置", Alignment = TitleAlignments.Centered)]
[SerializeField]
[Required]
[Tooltip("要触发的 NarrativeEntry 的 storyId")]
protected string storyId;
[SerializeField]
[Tooltip("是否仅能触发一次")]
protected bool oneShot = true;
[ShowInInspector]
[ReadOnly]
[Tooltip("该触发器当前是否已经激活过")]
protected bool hasFired;
/// <summary>获取触发的目标故事 ID。</summary>
public string StoryId => storyId;
/// <summary>是否是一次性触发器。</summary>
public bool OneShot => oneShot;
/// <summary>该触发器是否已经激活过。</summary>
public bool HasFired => hasFired;
/// <summary>
/// 激活触发器,通知订阅者启动剧情。
/// </summary>
[Button("测试触发 (Fire)", ButtonSizes.Small)]
[GUIColor(0.3f, 0.8f, 1f)]
public virtual void Fire()
{
if (oneShot && hasFired)
{
return;
}
if (string.IsNullOrEmpty(storyId))
{
Debug.LogWarning($"[NarrativeTrigger] {gameObject.name} 触发失败:未配置 storyId。");
return;
}
hasFired = true;
OnNarrativeTriggerFired?.Invoke(storyId);
}
/// <summary>
/// 重置触发状态(允许在 oneShot 模式下重新触发)。
/// </summary>
[Button("重置激活状态 (Reset)", ButtonSizes.Small)]
public virtual void ResetTrigger()
{
hasFired = false;
}
}
}