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

95 lines
3.2 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 System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
namespace SLSUtilities.Narrative
{
/// <summary>
/// 一个 NarrativeEntry 对应一个“剧情触发源”(如一个 NPC、一个区域、一个道具
/// 它包含一个有序的条件→节点路由列表。
/// </summary>
[CreateAssetMenu(fileName = "NarrativeEntry", menuName = "SLSUtilities/Story System/Narrative Entry")]
public class NarrativeEntry : SerializedScriptableObject
{
[TitleGroup("Identity", "剧情触发源身份标识", Alignment = TitleAlignments.Centered)]
[Required]
[Tooltip("全局唯一标识,对应 NPC 或触发器的 storyId (如 'OldMan', 'Forest_Gate')")]
public string storyId;
[TitleGroup("Routing Rules", "路由规则表 (从上到下评估,首个满足的生效)", Alignment = TitleAlignments.Centered)]
[ListDrawerSettings(ShowPaging = true, NumberOfItemsPerPage = 10)]
public List<NarrativeRoute> routes = new List<NarrativeRoute>();
[TitleGroup("Fallback", "兜底处理 (当所有路由条件都不满足时播什么)", Alignment = TitleAlignments.Centered)]
[Tooltip("兜底节点(可为空,为空则不播放任何对话)")]
public string fallbackNode;
}
/// <summary>
/// 单条路由规则:描述备注 + 条件列表 + 目标 Yarn 节点。
/// </summary>
[Serializable]
public class NarrativeRoute
{
[LabelText("描述 (仅编辑器备注)")]
[Required]
[Tooltip("例如:'第一次见面'、'已购买提灯后'")]
public string editorNote;
[LabelText("条件列表 (全部满足才匹配)")]
[ListDrawerSettings(ShowIndexLabels = false)]
public List<NarrativeCondition> conditions = new List<NarrativeCondition>();
[LabelText("目标 Yarn 节点")]
[Required]
[Tooltip("满足上述条件时播放的 Yarn Node 名称 (如 'OldMan_FirstMeet')")]
public string targetNode;
}
/// <summary>
/// 单个变量匹配条件:变量类型 + 变量名 + 比较方式 + 目标值。
/// </summary>
[Serializable]
public class NarrativeCondition
{
public enum ConditionType
{
Bool,
Int,
Float,
String
}
public enum CompareOp
{
[LabelText("==")] Equal,
[LabelText("!=")] NotEqual,
[LabelText(">")] Greater,
[LabelText(">=")] GreaterOrEqual,
[LabelText("<")] Less,
[LabelText("<=")] LessOrEqual
}
[HorizontalGroup("Cond", Width = 70)]
[HideLabel]
public ConditionType type = ConditionType.Bool;
[HorizontalGroup("Cond")]
[HideLabel]
[Required]
[Tooltip("StorySystem 变量名 (如 'has_lantern')")]
public string key;
[HorizontalGroup("Cond", Width = 60)]
[HideLabel]
public CompareOp op = CompareOp.Equal;
[HorizontalGroup("Cond")]
[HideLabel]
[Required]
[Tooltip("对比的值,布尔值请填 true/false其他按相应格式填写")]
public string value;
}
}