75 lines
3.1 KiB
C#
75 lines
3.1 KiB
C#
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;
|
||
}
|
||
}
|