Files
ichni_Official/Assets/Scripts/NewStorySystem/Data/StoryHelperData.cs
SoulliesOfficial c30bb258b1 Story排版
2026-07-20 16:56:04 -04:00

75 lines
3.1 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 Ichni.Story
{
/// <summary>
/// 全局 Helper 的独立数据资产。
/// <para>该资产不隶属于任何 StoryData由 <see cref="StoryManager.helperData"/> 统一引用,
/// 因而所有章节都共用同一个 Helper 角色、名称和候选对话池。</para>
/// <para>运行时会在满足条件的候选中按权重抽取,并在候选数量允许时避免与上次对话重复;
/// 具体抽取和 UI 展示逻辑将在 Helper 功能实现阶段接入。</para>
/// </summary>
[CreateAssetMenu(fileName = "StoryHelperData", menuName = "Ichni/Story/New/Story Helper Data")]
public class StoryHelperData : SerializedScriptableObject
{
/// <summary>
/// Helper 显示名称的 Unity Localization Entry Key。
/// </summary>
[LabelText("Display Name Key (Localization)")]
public string displayNameKey;
/// <summary>
/// 当所有候选对话均不满足条件时显示的兜底对话 Entry Key。
/// </summary>
[LabelText("Fallback Dialogue Key (Localization)")]
public string fallbackDialogueKey;
/// <summary>
/// 全章节共用的候选对话。条件留空表示始终可参与抽取。
/// </summary>
[LabelText("Dialogue Pool")]
[ListDrawerSettings(ShowFoldout = true, DefaultExpandedState = false, DraggableItems = true, ShowItemCount = true)]
public List<StoryHelperDialogueDefinition> dialoguePool = new List<StoryHelperDialogueDefinition>();
}
/// <summary>
/// Helper 对话池中的一条候选记录。
/// <para>条件复用故事树的 <see cref="StoryCondition"/>,因此未来可直接根据章节剧情变量、
/// 路线变量或指定 Block 的完成状态筛选,而不需要为 Helper 另写一套条件语法。</para>
/// </summary>
[Serializable]
[InlineProperty]
public class StoryHelperDialogueDefinition
{
/// <summary>
/// 候选对话的稳定 ID仅用于调试、去重和未来数据追踪。
/// 命名使用小写英文、数字和下划线,例如 <c>general_greeting_01</c>。
/// </summary>
[LabelText("Dialogue ID")]
public string dialogueId;
/// <summary>
/// 实际显示内容的 Unity Localization Entry Key。
/// </summary>
[LabelText("Dialogue Key (Localization)")]
public string dialogueKey;
/// <summary>
/// 此对话可被抽取的条件;留空表示始终可用。
/// </summary>
[LabelText("Availability Condition")]
public StoryCondition availabilityCondition = new StoryCondition();
/// <summary>
/// 在所有满足条件的候选中的相对抽取权重。值越大,出现概率越高;
/// 小于 1 的值在运行时应按 1 处理,避免无效的零或负权重。
/// </summary>
[LabelText("Weight")]
[MinValue(1)]
public int weight = 1;
}
}