主题
GameUI.ConversationSystem
Conversation 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public abstract class Conversation : IExecutableObject, IExecutionContext, IGameObject, IGameObject<GameDataConversation>, IEventSender对话的运行时实例(仅客户端),管理对话行、选项和分支跳转。 由 GameDataConversation 配置驱动。
构造函数
Conversation 仅客户端
csharp
protected Conversation(IGameLink<GameDataConversation> link, IExecutionContext creationContext)属性
Link 仅客户端
csharp
public IGameLink<GameDataConversation> Link { get; }Cache 仅客户端
csharp
public GameDataConversation Cache { get; }Parent 仅客户端
csharp
public IExecutableObject? Parent { get; }Shared 仅客户端
csharp
public ConversationParamShared Shared { get; }获取对话专用的共享参数(包含对话历史)
备注
提供对 ConversationParamShared 的类型安全访问。 所有对话节点共享同一个实例(根对话创建,子对话继承)。
Source 仅客户端
csharp
public ITarget Source { get; }AggregatorWeakReference 仅客户端
csharp
public WeakReference<EventAggregator> AggregatorWeakReference { get; }方法
StartAsync 仅客户端
csharp
public Task<CmdResult> StartAsync()Execute 仅客户端
csharp
public abstract Task Execute()Publish 仅客户端
csharp
public virtual void Publish<TEvent>(TEvent eventToPublish)GetPublisher 仅客户端
csharp
public Action<TEvent>? GetPublisher<TEvent>()ConversationChoiceGroup 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationChoiceGroup : Conversation, IGameObject<GameDataConversationChoiceGroup>, IGameObject构造函数
ConversationChoiceGroup 仅客户端
csharp
protected internal ConversationChoiceGroup(IGameLink<GameDataConversationChoiceGroup> link, IExecutionContext creationContext)属性
Link 仅客户端
csharp
public new IGameLink<GameDataConversationChoiceGroup> Link { get; }Cache 仅客户端
csharp
public new GameDataConversationChoiceGroup Cache { get; }方法
Execute 仅客户端
csharp
public override Task Execute()ConversationChoiceHistoryEntry 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationChoiceHistoryEntry : ConversationHistoryEntry选择历史记录
备注
记录对话中的选择事件,包括所有可用选项和玩家的选择。
构造函数
ConversationChoiceHistoryEntry 仅客户端
csharp
public ConversationChoiceHistoryEntry()属性
PromptInfo 仅客户端
csharp
public ConversationChoicePromptInfo? PromptInfo { get; init; }提示信息(如果有)
备注
选择组显示的提示内容(角色、文本等)。 可能为 null,表示没有提示,仅显示选项列表。
AllChoices 仅客户端
csharp
public required List<ConversationChoiceInfo> AllChoices { get; init; }所有可用的选项
备注
包含所有显示给玩家的选项,包括禁用的选项。 可用于回顾玩家在该时刻的所有可能选择。
SelectedIndex 仅客户端
csharp
public required int SelectedIndex { get; init; }玩家选择的选项索引(从0开始)
备注
指向 AllChoices 列表中的索引。 可用于回放玩家的选择路径。
SelectedChoiceText 仅客户端
csharp
public string SelectedChoiceText { get; }玩家选择的选项文本(便捷访问)
ChoiceGroupReference 仅客户端
csharp
public WeakReference<ConversationChoiceGroup>? ChoiceGroupReference { get; init; }选择组运行时对象的弱引用(可选)
备注
使用 WeakReference1` 以避免阻止垃圾回收。 仅用于实时访问,不应该用于持久化存储。
ConversationChoiceInfo 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationChoiceInfo选择项信息
构造函数
ConversationChoiceInfo 仅客户端
csharp
public ConversationChoiceInfo()属性
Text 仅客户端
csharp
public required string Text { get; set; }选择项文本
IsEnabled 仅客户端
csharp
public bool IsEnabled { get; set; }是否可用(不可用的选择项应该显示为灰色或者不显示)
ConversationChoicePromptInfo 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationChoicePromptInfo选择组的提示信息
备注
用于在显示选项之前,给玩家提供上下文信息。 所有字段都是可选的,如果都为 null,则不显示提示内容。
构造函数
ConversationChoicePromptInfo 仅客户端
csharp
public ConversationChoicePromptInfo()属性
PromptText 仅客户端
csharp
public string? PromptText { get; set; }提示文本
CharacterName 仅客户端
csharp
public string? CharacterName { get; set; }提示角色名称
Portrait 仅客户端
csharp
public Texture? Portrait { get; set; }提示角色立绘
PortraitSide 仅客户端
csharp
public PortraitSide PortraitSide { get; set; }立绘显示位置
DisplayMode 仅客户端
csharp
public ConversationDisplayMode DisplayMode { get; set; }显示模式,控制提示内容在哪里显示
ConversationCustomAction 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationCustomAction : Conversation, IGameObject<GameDataConversationCustomAction>, IGameObject构造函数
ConversationCustomAction 仅客户端
csharp
protected internal ConversationCustomAction(IGameLink<GameDataConversationCustomAction> link, IExecutionContext creationContext)属性
Link 仅客户端
csharp
public new IGameLink<GameDataConversationCustomAction> Link { get; }Cache 仅客户端
csharp
public new GameDataConversationCustomAction Cache { get; }方法
Execute 仅客户端
csharp
public override Task Execute()ConversationDurationEstimator 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public static class ConversationDurationEstimator对话持续时间估算器 根据文本内容(字符数、标点符号)估算合理的显示时间
方法
Estimate 仅客户端
csharp
public static TimeSpan Estimate(string text)根据文本内容估算合理的持续时间
text— 对话文本
返回: 估算的持续时间
EstimateWithStats 仅客户端
csharp
public static TimeSpan EstimateWithStats(string text, out int charCount, out int punctuationCount, out double totalPauseMs)估算持续时间并输出详细统计信息(用于调试)
text— 对话文本charCount— 输出:字符数punctuationCount— 输出:标点符号数totalPauseMs— 输出:总停顿时间
返回: 估算的持续时间
ConversationExtensions 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public static class ConversationExtensions方法
StartConversation 仅客户端
csharp
public static Task<CmdResult> StartConversation(this GameDataConversation data, IExecutionContext? context = null)ConversationHistoryEntry 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public abstract class ConversationHistoryEntry对话历史记录条目基类
备注
使用多态设计,支持不同类型的历史记录(台词、选择等)。
构造函数
ConversationHistoryEntry 仅客户端
csharp
protected ConversationHistoryEntry()属性
Timestamp 仅客户端
csharp
public DateTime Timestamp { get; init; }记录的时间戳
ConversationHistoryExtensions 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public static class ConversationHistoryExtensions对话历史扩展方法
方法
GetLines 仅客户端
csharp
public static IEnumerable<ConversationLineHistoryEntry> GetLines(this List<ConversationHistoryEntry> history)获取所有台词历史记录
history— 历史记录列表
返回: 所有台词历史记录的枚举
GetChoices 仅客户端
csharp
public static IEnumerable<ConversationChoiceHistoryEntry> GetChoices(this List<ConversationHistoryEntry> history)获取所有选择历史记录
history— 历史记录列表
返回: 所有选择历史记录的枚举
GetLinesByCharacter 仅客户端
csharp
public static IEnumerable<ConversationLineHistoryEntry> GetLinesByCharacter(this List<ConversationHistoryEntry> history, string characterName)获取特定角色的台词
history— 历史记录列表characterName— 角色名称
返回: 该角色的所有台词历史记录
GetHistoryInTimeRange 仅客户端
csharp
public static IEnumerable<ConversationHistoryEntry> GetHistoryInTimeRange(this List<ConversationHistoryEntry> history, DateTime startTime, DateTime endTime)获取指定时间范围内的历史记录
history— 历史记录列表startTime— 起始时间endTime— 结束时间
返回: 时间范围内的历史记录
ConversationLine 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationLine : Conversation, IGameObject<GameDataConversationLine>, IGameObject构造函数
ConversationLine 仅客户端
csharp
protected internal ConversationLine(IGameLink<GameDataConversationLine> link, IExecutionContext creationContext)属性
Link 仅客户端
csharp
public new IGameLink<GameDataConversationLine> Link { get; }Cache 仅客户端
csharp
public new GameDataConversationLine Cache { get; }方法
Execute 仅客户端
csharp
public override Task Execute()ConversationLineHistoryEntry 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationLineHistoryEntry : ConversationHistoryEntry台词历史记录
备注
记录对话中显示的每一句台词的信息。
构造函数
ConversationLineHistoryEntry 仅客户端
csharp
public ConversationLineHistoryEntry()属性
LineInfo 仅客户端
csharp
public required ConversationLineInfo LineInfo { get; init; }台词显示信息
备注
包含了台词的所有显示数据(文本、角色、立绘等)。 可以安全地用于持久化存储和回放。
LineReference 仅客户端
csharp
public WeakReference<ConversationLine>? LineReference { get; init; }台词运行时对象的弱引用(可选)
备注
使用 WeakReference1以避免阻止垃圾回收。 对话结束后,运行时对象可能被回收,此引用可能失效。 ⚠️ 注意: 此引用仅用于实时访问运行时数据, 不应该用于持久化存储。持久化应该只使用LineInfo`。
ConversationLineInfo 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationLineInfo台词显示信息
构造函数
ConversationLineInfo 仅客户端
csharp
public ConversationLineInfo()属性
Text 仅客户端
csharp
public required string Text { get; set; }台词文本
CharacterName 仅客户端
csharp
public string? CharacterName { get; set; }角色名称
Portrait 仅客户端
csharp
public Texture? Portrait { get; set; }角色立绘
PortraitSide 仅客户端
csharp
public PortraitSide PortraitSide { get; set; }立绘显示位置
Duration 仅客户端
csharp
public TimeSpan? Duration { get; set; }显示持续时间(null表示一直显示直到确认)
WaitForConfirmation 仅客户端
csharp
public bool WaitForConfirmation { get; set; }是否需要等待玩家确认
AllowSkip 仅客户端
csharp
public bool AllowSkip { get; set; }是否允许跳过
DisplayMode 仅客户端
csharp
public ConversationDisplayMode DisplayMode { get; set; }显示模式,控制对话内容在哪里显示
ConversationParamShared 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationParamShared : ExecutionParamShared对话系统的共享参数,扩展了 ExecutionParamShared 以支持对话日志
备注
在整个对话树中共享,所有对话节点都能访问同一个历史记录列表。 根对话创建新实例,子对话继承父对话的实例。
构造函数
ConversationParamShared 仅客户端
csharp
public ConversationParamShared(IExecutionContext creationContext)属性
ConversationHistory 仅客户端
csharp
public List<ConversationHistoryEntry> ConversationHistory { get; }对话历史记录列表
备注
记录了整个对话流程中的所有台词和选择,按时间顺序排列。 UI层可以使用此列表实现对话历史回顾功能。
MaxHistoryEntries 仅客户端
csharp
public int MaxHistoryEntries { get; set; }最大历史记录数量,超过后自动删除最旧的记录
备注
默认值为 100。设置为 0 表示不限制数量。
方法
AddHistory 仅客户端
csharp
public void AddHistory(ConversationHistoryEntry entry)添加历史记录(自动管理容量)
entry— 要添加的历史记录条目
ClearHistory 仅客户端
csharp
public void ClearHistory()清除所有历史记录
ConversationSet 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationSet : Conversation, IGameObject<GameDataConversationSet>, IGameObject构造函数
ConversationSet 仅客户端
csharp
protected internal ConversationSet(IGameLink<GameDataConversationSet> link, IExecutionContext creationContext)属性
Link 仅客户端
csharp
public new IGameLink<GameDataConversationSet> Link { get; }Cache 仅客户端
csharp
public new GameDataConversationSet Cache { get; }方法
Execute 仅客户端
csharp
public override Task Execute()ConversationUI 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public static class ConversationUI对话UI管理器,用于注册和获取当前的对话UI实现
属性
Current 仅客户端
csharp
public static IConversationUI? Current { get; }当前的对话UI实现
方法
Register 仅客户端
csharp
public static void Register(IConversationUI ui)注册对话UI实现
Unregister 仅客户端
csharp
public static void Unregister()注销对话UI实现
ConversationWait 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public class ConversationWait : Conversation, IGameObject<GameDataConversationWait>, IGameObject构造函数
ConversationWait 仅客户端
csharp
protected internal ConversationWait(IGameLink<GameDataConversationWait> link, IExecutionContext creationContext)属性
Link 仅客户端
csharp
public new IGameLink<GameDataConversationWait> Link { get; }Cache 仅客户端
csharp
public new GameDataConversationWait Cache { get; }方法
Execute 仅客户端
csharp
public override Task Execute()IConversationUI 仅客户端
命名空间 GameUI.ConversationSystem
csharp
public interface IConversationUI对话UI接口,用于在客户端显示对话内容
备注
游戏需要实现此接口来提供具体的UI表现。对话系统会通过此接口与UI层交互, 将对话内容显示给玩家。 实现要点: 所有异步方法都应该是可取消的(响应 CancellationToken) ShowLineAsync 在等待确认时应该阻塞,直到玩家点击继续或被取消 ShowChoicesAsync 应该等待玩家选择,并返回选择的索引 实现应该处理超时和取消的情况 注册方式: // 在游戏初始化时注册UI实现 ConversationUI.Register(new MyConversationUI());
方法
ShowLineAsync 仅客户端
csharp
Task ShowLineAsync(ConversationLineInfo lineInfo, ConversationLine? line, CancellationToken cancellationToken = default(CancellationToken))显示一条台词,并等待显示完成或玩家确认
lineInfo— 台词信息,包含文本、角色、显示时间等line— 台词运行时对象(可选),提供访问执行上下文和运行时数据的能力cancellationToken— 取消令牌,用于支持自动持续时间和超时
返回: 等待台词显示完成或玩家确认
备注
此方法的行为取决于 的WaitForConfirmation属性: 如果需要等待确认:方法应该阻塞直到玩家点击继续或被取消 如果不需要等待确认:方法应该在指定的持续时间后自动完成 当 被触发时,方法应该抛出OperationCanceledException。 参数提供了对话运行时对象,可用于: 访问执行上下文(IExecutionContext) 获取运行时计算的数据 访问角色绑定的实际游戏单位 ⚠️ 注意: UI层应该只读取数据,不应该修改对话状态或调用改变游戏状态的方法。
ShowChoicesAsync 仅客户端
csharp
Task<int> ShowChoicesAsync(List<ConversationChoiceInfo> choices, ConversationChoicePromptInfo? promptInfo, ConversationChoiceGroup? choiceGroup, CancellationToken cancellationToken = default(CancellationToken))显示选择组,并等待玩家做出选择
choices— 选择项列表,包含文本和是否可用等信息promptInfo— 提示信息(可选),用于在选项上方显示上下文choiceGroup— 选择组运行时对象(可选),提供访问执行上下文和运行时数据的能力cancellationToken— 取消令牌,用于支持超时机制
返回: 玩家选择的选项索引(从0开始)
备注
此方法应该: 如果 不为空且有内容,先显示提示信息(角色、文本等) 显示所有选择项,不可用的选项应显示为灰色或禁用 等待玩家点击某个选项 返回被选中选项的索引(从0开始) 如果设置了超时(通过 ),当超时时应该抛出OperationCanceledException, 对话系统会根据超时默认选项自动选择。 参数提供了选择组运行时对象,可用于: 访问执行上下文(IExecutionContext) 获取运行时计算的数据 访问选择项的详细配置数据 访问角色绑定的实际游戏单位 ⚠️ 注意: UI层应该只读取数据,不应该修改对话状态或调用改变游戏状态的方法。
Hide 仅客户端
csharp
void Hide()隐藏对话UI
备注
在对话完成时调用,UI应该隐藏对话界面但保留当前显示的内容(可能用于淡出动画)。 调用此方法后可能会立即调用 Clear 来清除内容。
Clear 仅客户端
csharp
void Clear()清除当前显示的内容
备注
清除所有对话相关的显示内容(文本、角色立绘、选项等),为下一次对话做准备。
GameDataCharacter 仅客户端
命名空间 GameUI.ConversationSystem.Data
csharp
public class GameDataCharacter : GameDataCategory<GameDataCharacter>, IGameDataCategory<GameDataCharacter>, IGameData<GameDataCharacter>, IGameData对话角色数据,用于定义纯立绘角色或为实际单位提供额外的显示信息
构造函数
GameDataCharacter 仅客户端
csharp
public GameDataCharacter(GameLink<GameDataCharacter, GameDataCharacter> link)GameDataCharacter 仅客户端
csharp
public GameDataCharacter(IGameLink<GameDataCharacter> link)属性
DisplayName 仅客户端
csharp
public LocalizedString? DisplayName { get; set; }角色显示名称
Portrait 仅客户端
csharp
public Texture? Portrait { get; set; }角色立绘(头像或半身像)
NameColorOverride 仅客户端
csharp
public Color? NameColorOverride { get; set; }角色名字颜色,用于在对话UI中区分不同角色 为空时使用默认颜色
Description 仅客户端
csharp
public LocalizedString? Description { get; set; }角色描述(可选)
InGameUnit 仅客户端
csharp
public Unit? InGameUnit { get; set; }游戏中的实际单位,如果对话设置为显示在单位上方,则需要在运行时动态设置此值
GameDataConversation 仅客户端
命名空间 GameUI.ConversationSystem.Data
csharp
public abstract class GameDataConversation : GameDataCategory<GameDataConversation>, IExecutableData, IGameData, IEventSender, IGameDataCategory<GameDataConversation>, IGameData<GameDataConversation>对话数据基类,所有对话相关的数据类型(台词、选择、对话集合等)都继承自此类
备注
对话系统是一个客户端驱动的系统,用于创建和管理游戏中的对话内容。 支持以下功能: 单句台词显示(GameDataConversationLine) 玩家选择分支(GameDataConversationChoiceGroup) 对话集合和序列(GameDataConversationSet) 等待和延迟(GameDataConversationWait) 自定义动作(GameDataConversationCustomAction)
构造函数
GameDataConversation 仅客户端
csharp
public GameDataConversation(GameLink<GameDataConversation, GameDataConversation> link)GameDataConversation 仅客户端
csharp
public GameDataConversation(IGameLink<GameDataConversation> link)属性
Validators 仅客户端
csharp
public Validator? Validators { get; set; }对话的验证器,只有满足验证器条件的对话内容才能显示
备注
验证器通常用于: 检查玩家是否满足显示条件(如任务进度、物品持有等) 控制选项的可用性(不满足条件的选项会显示为灰色或隐藏) 动态控制对话内容的显示
AggregatorWeakReference 仅客户端
csharp
public WeakReference<EventAggregator> AggregatorWeakReference { get; }方法
Execute 仅客户端
csharp
public void Execute(IExecutableObject context)Validate 仅客户端
csharp
public CmdResult Validate(IExecutableObject context)CreateConversation 仅客户端
csharp
public Conversation? CreateConversation(IExecutionContext? context = null)CreateConversationInternal 仅客户端
csharp
protected abstract Conversation? CreateConversationInternal(IExecutionContext context)Publish 仅客户端
csharp
public void Publish<TEvent>(TEvent eventToPublish)GetPublisher 仅客户端
csharp
public Action<TEvent>? GetPublisher<TEvent>()GameDataConversationChoiceGroup 仅客户端
命名空间 GameUI.ConversationSystem.Data
csharp
public class GameDataConversationChoiceGroup : GameDataConversation, IGameData<GameDataConversationChoiceGroup>, IGameData对话选择组数据,表示一组供玩家选择的选项
备注
用于创建分支对话,让玩家做出选择并导向不同的对话路径。 支持超时机制和默认选择,适用于限时决策场景(如战斗选择)。 示例: var choiceGroup = new GameDataConversationChoiceGroup { Choices = new List<IGameLink<GameDataConversationChoiceItem>?> { acceptChoice.ToLink(), declineChoice.ToLink() }, Timeout = TimeSpan.FromSeconds(30), DefaultChoiceOnTimeout = 1 // 超时默认选择"拒绝" };
构造函数
GameDataConversationChoiceGroup 仅客户端
csharp
public GameDataConversationChoiceGroup(GameLink<GameDataConversation, GameDataConversationChoiceGroup> link)GameDataConversationChoiceGroup 仅客户端
csharp
public GameDataConversationChoiceGroup(IGameLink<GameDataConversationChoiceGroup> link)属性
Choices 仅客户端
csharp
public List<IGameLink<GameDataConversationChoiceItem>?> Choices { get; set; }选择项列表
备注
每个选择项可以有自己的验证器、服务器效果和后续对话。 不满足验证器条件的选项会显示为灰色或隐藏。
Timeout 仅客户端
csharp
public TimeSpan? Timeout { get; set; }选择超时时间,为空时不限制
备注
超时使用游戏时间(受暂停和时间缩放影响),而非实际时间。 超时后会根据 DefaultChoiceOnTimeout 自动选择或中断对话。
DefaultChoiceOnTimeout 仅客户端
csharp
public int? DefaultChoiceOnTimeout { get; set; }超时后的默认选择索引,为空时超时后不自动选择
备注
索引从0开始。如果设置的索引超出范围,会记录警告并中断对话。
PromptText 仅客户端
csharp
public LocalizedString? PromptText { get; set; }选择组的提示文本(可选)
备注
显示在选项上方,用于给玩家提供上下文信息。 如果为空,则不显示额外文本,仅显示选项列表。 常用场景: 重复上一句对话,确保玩家能看到问题 提供简短的选择提示(如"你想购买什么?") 显示当前状态或情境描述
PromptCharacter 仅客户端
csharp
public IGameLink<GameDataCharacter>? PromptCharacter { get; set; }提示文本的说话角色(可选)
备注
为空时表示旁白或系统消息。 设置角色后,会显示角色的名称、立绘等信息。
PromptPortraitSide 仅客户端
csharp
public PortraitSide PromptPortraitSide { get; set; }提示文本的立绘显示位置
备注
仅在 PromptCharacter 不为空时有效。
PromptVoice 仅客户端
csharp
public IGameLink<GameDataActorSound>? PromptVoice { get; set; }提示语音,为空时不播放语音
备注
仅在 PromptText 不为空时有效。 可以为提示文本添加语音,增强表现力。
PromptTextParameters 仅客户端
csharp
public List<Func<IExecutionContext, object>>? PromptTextParameters { get; set; }提示文本的参数,用于替换提示文本中的占位符
备注
仅在 PromptText 不为空时有效。 例如:"你有 {0} 金币,想购买什么?" 可以动态替换玩家金币数量。
Camera 仅客户端
csharp
public IGameLink<GameDataCamera>? Camera { get; set; }镜头设置,为空时不改变镜头
备注
显示选择组时切换到指定镜头。 选择完成后,镜头会在对话结束时重置。
CameraFollowCharacter 仅客户端
csharp
public bool CameraFollowCharacter { get; set; }镜头是否跟随提示角色
备注
仅在 PromptCharacter 不为空且角色绑定了实际单位时有效。 镜头会跟随角色单位移动。
PromptSpeakerAnimation 仅客户端
csharp
public IGameLink<GameDataAnimation>? PromptSpeakerAnimation { get; set; }提示角色说话时的动画,只有当角色绑定了实际单位时才有效
备注
仅在 PromptCharacter 不为空且角色绑定了实际单位时有效。 可以让角色在显示提示时播放特定动画(如思考、询问等)。
DisplayMode 仅客户端
csharp
public ConversationDisplayMode DisplayMode { get; set; }选择组的显示模式
备注
控制选择组及其提示内容的显示位置。 目前支持的模式: UI:在对话UI中显示(默认) OnUnit:在单位上方显示(需要角色绑定了实际单位)
Link 仅客户端
csharp
public new IGameLink<GameDataConversationChoiceGroup> Link { get; }方法
CreateConversationInternal 仅客户端
csharp
protected override Conversation? CreateConversationInternal(IExecutionContext context)GameDataConversationChoiceItem 仅客户端
命名空间 GameUI.ConversationSystem.Data
csharp
public class GameDataConversationChoiceItem : GameDataCategory<GameDataConversationChoiceItem>, IEventSender, IGameDataCategory<GameDataConversationChoiceItem>, IGameData<GameDataConversationChoiceItem>, IGameData对话选择项数据,表示选择组中的一个选项
备注
选择项是玩家可以选择的选项,可以包含验证器、后续对话、服务器端效果等。 支持两种方式在服务器端执行逻辑: ServerEffect:自动在服务器端执行效果,安全可靠(推荐) 监听 EventPlayerConversationChoiceSelected 事件:灵活的自定义逻辑 示例 - 使用 ServerEffect: var rewardEffect = new GameDataEffectSet { Effects = new List<IGameLink<GameDataEffect>?> { giveGoldEffect.ToLink(), giveExpEffect.ToLink() } }; var choice = new GameDataConversationChoiceItem { Text = new LocalizedString("领取奖励", "Claim Reward"), ServerEffect = rewardEffect.ToLink(), // 服务器端自动执行 Validators = ctx => HasCompletedQuest(ctx), NextConversation = thankYouDialog.ToLink() };
构造函数
GameDataConversationChoiceItem 仅客户端
csharp
public GameDataConversationChoiceItem(GameLink<GameDataConversationChoiceItem, GameDataConversationChoiceItem> link)GameDataConversationChoiceItem 仅客户端
csharp
public GameDataConversationChoiceItem(IGameLink<GameDataConversationChoiceItem> link)属性
Validators 仅客户端
csharp
public Validator? Validators { get; set; }选项的验证器,只有满足验证器条件的选项才能被选择
备注
不满足条件的选项会显示为灰色(IsEnabled = false)或完全隐藏,具体表现由UI实现决定。 常用于检查玩家是否有足够的资源、是否完成了前置任务等。
Text 仅客户端
csharp
public LocalizedString? Text { get; set; }选项的显示文本,支持多语言
NextConversation 仅客户端
csharp
public IGameLink<GameDataConversation>? NextConversation { get; set; }选择此选项后要执行的后续对话
备注
可以链接到任何类型的对话节点(台词、选择组、对话集合等)。 为空时选择后直接结束对话。
ServerEffect 仅客户端
csharp
public IGameLink<GameDataEffect>? ServerEffect { get; set; }当玩家选择此选项时,服务器会自动执行的效果
备注
工作原理: 效果在服务器端执行,客户端无法伪造,安全可靠 施法者和目标自动设置为本地玩家的主控单位 如果玩家没有主控单位,则不执行 设置此属性会自动通知服务器(无需手动设置 NotifyServer) 执行顺序: ServerEffect 优先于 EventPlayerConversationChoiceSelected 事件执行 适用场景: 给予玩家奖励(金币、经验、物品等) 改变玩家状态(属性、Buff、任务进度等) 触发游戏事件
NotifyServer 仅客户端
csharp
public bool NotifyServer { get; set; }是否将选择事件通知给服务器,使服务器可以捕捉到 EventPlayerConversationChoiceSelected 事件
备注
如果设置了 ServerEffect,则必定会通知服务器(无论此属性的值如何)。 当需要在服务器端执行复杂的自定义逻辑时,设置此属性为 true 并在服务器端监听事件。
Icon 仅客户端
csharp
public Icon? Icon { get; set; }选项的图标
备注
选项的图标,可以用于显示在对话UI中。 如果为空,则使用默认图标。
AggregatorWeakReference 仅客户端
csharp
public WeakReference<EventAggregator> AggregatorWeakReference { get; }方法
Publish 仅客户端
csharp
public virtual void Publish<TEvent>(TEvent eventToPublish)GetPublisher 仅客户端
csharp
public Action<TEvent>? GetPublisher<TEvent>()GameDataConversationCustomAction 仅客户端
命名空间 GameUI.ConversationSystem.Data
csharp
public class GameDataConversationCustomAction : GameDataConversation, IGameData<GameDataConversationCustomAction>, IGameData对话自定义动作节点,用于在对话中执行任意自定义逻辑
备注
自定义动作允许你在对话流程中插入任意代码逻辑,例如: 播放特效或音乐 触发游戏事件 修改游戏状态 执行复杂的条件判断 与其他系统交互 示例: var customAction = new GameDataConversationCustomAction { Func = async (ctx) => { // 播放特效 await PlayDramaticEffect(); // 检查条件 if (CheckCondition(ctx)) { return true; // 继续后续对话 } return false; // 中断对话 }, NextConversation = nextDialog.ToLink() };
构造函数
GameDataConversationCustomAction 仅客户端
csharp
public GameDataConversationCustomAction(GameLink<GameDataConversation, GameDataConversationCustomAction> link)GameDataConversationCustomAction 仅客户端
csharp
public GameDataConversationCustomAction(IGameLink<GameDataConversationCustomAction> link)属性
Func 仅客户端
csharp
public Func<IExecutionContext, ValueTask<bool>> Func { get; set; }自定义动作函数,返回 true 表示继续后续对话,返回 false 表示中断对话
备注
函数参数为当前执行上下文(即当前对话自定义动作节点的实例 ConversationCustomAction)。 函数应该是异步的,以支持异步操作(如播放动画、等待事件等)。
NextConversation 仅客户端
csharp
public IGameLink<GameDataConversation>? NextConversation { get; set; }后续对话,只有在自定义动作返回 true 后才会执行
备注
为空时,动作执行完成后对话结束。
Link 仅客户端
csharp
public new IGameLink<GameDataConversationCustomAction> Link { get; }方法
CreateConversationInternal 仅客户端
csharp
protected override Conversation? CreateConversationInternal(IExecutionContext context)GameDataConversationLine 仅客户端
命名空间 GameUI.ConversationSystem.Data
csharp
public class GameDataConversationLine : GameDataConversation, IGameData<GameDataConversationLine>, IGameData对话台词数据,表示对话中的一句话
备注
对话台词是对话系统的基本单元,用于显示角色说话的内容。 可以包含角色信息、文本、语音、动画、镜头等元素。 示例: var line = new GameDataConversationLine { Character = npcCharacter.ToLink(), Text = new LocalizedString("你好,勇者!", "Hello, hero!"), WaitForConfirmation = true, AllowSkip = true }; await line.StartConversation();
构造函数
GameDataConversationLine 仅客户端
csharp
public GameDataConversationLine(GameLink<GameDataConversation, GameDataConversationLine> link)GameDataConversationLine 仅客户端
csharp
public GameDataConversationLine(IGameLink<GameDataConversationLine> link)属性
Character 仅客户端
csharp
public IGameLink<GameDataCharacter>? Character { get; set; }说话的角色
备注
为空时表示旁白或系统消息。 角色数据包含名称、立绘、颜色等显示信息。
Text 仅客户端
csharp
public LocalizedString? Text { get; set; }台词文本内容,支持多语言
备注
可以使用 TextParameters 来动态替换文本中的占位符。 例如:"你好,{0}!你已经完成了 {1} 个任务。"
Voice 仅客户端
csharp
public IGameLink<GameDataActorSound>? Voice { get; set; }语音,为空时不播放语音 TODO: 支持多语言语音 TODO: 支持获取语音时长,需要等引擎支持
TextParameters 仅客户端
csharp
public List<Func<IExecutionContext, object>>? TextParameters { get; set; }台词的参数,用于替换台词中的占位符
Camera 仅客户端
csharp
public IGameLink<GameDataCamera>? Camera { get; set; }镜头,为空时不改变镜头 整个对话结束后,镜头会重置
CameraFollowCharacter 仅客户端
csharp
public bool CameraFollowCharacter { get; set; }镜头是否跟随角色,只有当角色绑定了实际单位时才有效
SpeakerAnimation 仅客户端
csharp
public IGameLink<GameDataAnimation>? SpeakerAnimation { get; set; }角色说话时的动画,只有当角色绑定了实际单位时才有效
Duration 仅客户端
csharp
public TimeSpan? Duration { get; set; }台词的显示时间,为空时使用音效时间、动画时间或由台词长度决定
WaitForConfirmation 仅客户端
csharp
public bool WaitForConfirmation { get; set; }是否需要等待确认,如果需要等待确认,则需要等待用户确认后才能继续执行
AllowSkip 仅客户端
csharp
public bool AllowSkip { get; set; }是否允许跳过,如果允许跳过,则可以通过点击屏幕等方式跳过当前台词,直接执行下一条台词。 跳过的方式由具体的UI系统决定
PortraitSide 仅客户端
csharp
public PortraitSide PortraitSide { get; set; }立绘的显示位置,位于对话UI的左侧或右侧
DisplayMode 仅客户端
csharp
public ConversationDisplayMode DisplayMode { get; set; }台词的显示模式
备注
如果父级为ConversationSet,且父级的LineDisplayMode不为空,则由父级决定,会忽略本设置。 目前支持的模式: UI:在对话UI中显示 OnUnit:在单位上方显示(需要角色绑定了实际单位)
Link 仅客户端
csharp
public new IGameLink<GameDataConversationLine> Link { get; }方法
CreateConversationInternal 仅客户端
csharp
protected override Conversation? CreateConversationInternal(IExecutionContext context)GameDataConversationSet 仅客户端
命名空间 GameUI.ConversationSystem.Data
csharp
public class GameDataConversationSet : GameDataConversation, IGameData<GameDataConversationSet>, IGameData对话集合数据,用于组织多个对话节点
备注
对话集合可以包含多个对话节点(台词、选择、等待、自定义动作等),并控制它们的执行顺序。 支持两种执行模式: 顺序执行(Sequential):按顺序依次播放所有对话节点 随机一条(RandomOne):随机选择并播放一个对话节点 示例 - 顺序对话: var conversation = new GameDataConversationSet { Lines = new List<IGameLink<GameDataConversation>?> { line1.ToLink(), choiceGroup.ToLink(), line2.ToLink() }, ExecutionMode = ConversationExecutionMode.Sequential }; 示例 - 随机闲聊: var randomChatter = new GameDataConversationSet { Lines = new List<IGameLink<GameDataConversation>?> { greeting1.ToLink(), greeting2.ToLink(), greeting3.ToLink() }, ExecutionMode = ConversationExecutionMode.RandomOne };
构造函数
GameDataConversationSet 仅客户端
csharp
public GameDataConversationSet(GameLink<GameDataConversation, GameDataConversationSet> link)GameDataConversationSet 仅客户端
csharp
public GameDataConversationSet(IGameLink<GameDataConversationSet> link)属性
Lines 仅客户端
csharp
public List<IGameLink<GameDataConversation>?>? Lines { get; set; }对话节点列表
备注
可以包含任何类型的对话节点:台词、选择组、对话集合(支持嵌套)、等待、自定义动作等。
LineDisplayMode 仅客户端
csharp
public ConversationDisplayMode? LineDisplayMode { get; set; }台词的显示模式
备注
为空时由对话节点自己决定。 目前支持的模式: UI:在对话UI中显示 OnUnit:在单位上方显示(需要角色绑定了实际单位)
ExecutionMode 仅客户端
csharp
public ConversationExecutionMode? ExecutionMode { get; set; }对话的执行模式
备注
Sequential:按顺序依次播放所有对话节点 RandomOne:随机选择并播放一个对话节点(适合NPC闲聊)
Link 仅客户端
csharp
public new IGameLink<GameDataConversationSet> Link { get; }方法
CreateConversationInternal 仅客户端
csharp
protected override Conversation? CreateConversationInternal(IExecutionContext context)GameDataConversationWait 仅客户端
命名空间 GameUI.ConversationSystem.Data
csharp
public class GameDataConversationWait : GameDataConversation, IGameData<GameDataConversationWait>, IGameData对话等待节点,用于在对话中插入延迟
备注
通常用于过场动画或自动播放的对话序列中,在台词之间添加停顿。 等待时间使用游戏时间(受暂停和时间缩放影响)。 示例: var conversation = new GameDataConversationSet { Lines = new List<IGameLink<GameDataConversation>?> { line1.ToLink(), new GameDataConversationWait { Duration = TimeSpan.FromSeconds(1) }.ToLink(), line2.ToLink() }, ExecutionMode = ConversationExecutionMode.Sequential };
构造函数
GameDataConversationWait 仅客户端
csharp
public GameDataConversationWait(GameLink<GameDataConversation, GameDataConversationWait> link)GameDataConversationWait 仅客户端
csharp
public GameDataConversationWait(IGameLink<GameDataConversationWait> link)属性
Duration 仅客户端
csharp
public TimeSpan Duration { get; set; }等待持续时间
备注
使用游戏时间,会受到游戏暂停和时间缩放的影响。
Link 仅客户端
csharp
public new IGameLink<GameDataConversationWait> Link { get; }方法
CreateConversationInternal 仅客户端
csharp
protected override Conversation? CreateConversationInternal(IExecutionContext context)ConversationDisplayMode 仅客户端
命名空间 GameUI.ConversationSystem.Data.Enum
csharp
public enum ConversationDisplayMode对话显示模式,控制对话内容在哪里显示
枚举值
UI— 在对话UI中显示(默认模式)OnUnit— 在单位上方显示
ConversationExecutionMode 仅客户端
命名空间 GameUI.ConversationSystem.Data.Enum
csharp
public enum ConversationExecutionMode对话执行模式,控制对话集合中的对话节点如何执行
枚举值
Sequential— 顺序执行模式(默认)RandomOne— 随机选择一条执行
PortraitSide 仅客户端
命名空间 GameUI.ConversationSystem.Data.Enum
csharp
public enum PortraitSide立绘在对话界面中的显示位置
枚举值
Left— 显示在左侧Right— 显示在右侧
EventConversationChoiceSelected 仅客户端
命名空间 GameUI.ConversationSystem.Event
csharp
public class EventConversationChoiceSelected : ITriggerEvent<EventConversationChoiceSelected>对话选择事件(客户端),当玩家在对话中做出选择时触发
conversation— 对话实例choiceIndex— 选择项的索引(从0开始)choiceLink— 被选中的选择项
备注
此事件只在客户端触发,用于追踪玩家的对话选择或执行客户端特定的逻辑。 常见用途: 播放选择确认音效 更新客户端UI状态 记录玩家选择用于客户端统计 触发客户端动画或特效 示例: Game.Instance.Subscribe<EventConversationChoiceSelected>(e => { Game.Logger.LogInfo("玩家选择: {0} (索引 {1})", e.ChoiceLink.FriendlyName, e.ChoiceIndex); // 播放确认音效 PlayConfirmSound(); });
构造函数
EventConversationChoiceSelected 仅客户端
csharp
public EventConversationChoiceSelected(Conversation conversation, int choiceIndex, IGameLink<GameDataConversationChoiceItem> choiceLink)对话选择事件(客户端),当玩家在对话中做出选择时触发
conversation— 对话实例choiceIndex— 选择项的索引(从0开始)choiceLink— 被选中的选择项
备注
此事件只在客户端触发,用于追踪玩家的对话选择或执行客户端特定的逻辑。 常见用途: 播放选择确认音效 更新客户端UI状态 记录玩家选择用于客户端统计 触发客户端动画或特效 示例: Game.Instance.Subscribe<EventConversationChoiceSelected>(e => { Game.Logger.LogInfo("玩家选择: {0} (索引 {1})", e.ChoiceLink.FriendlyName, e.ChoiceIndex); // 播放确认音效 PlayConfirmSound(); });
属性
Conversation 仅客户端
csharp
public Conversation Conversation { get; }对话实例
ChoiceIndex 仅客户端
csharp
public int ChoiceIndex { get; }选择项的索引(从0开始)
ChoiceLink 仅客户端
csharp
public IGameLink<GameDataConversationChoiceItem> ChoiceLink { get; }被选中的选择项
EventConversationCompleted 仅客户端
命名空间 GameUI.ConversationSystem.Event
csharp
public class EventConversationCompleted : ITriggerEvent<EventConversationCompleted>对话完成事件,在客户端对话正常完成时触发
conversation— 完成的对话实例
备注
此事件在对话执行完毕(或被取消)时触发。 常见用途: 恢复游戏或重新启用玩家输入 隐藏对话UI界面 停止对话相关的背景音乐 记录对话完成状态 触发后续游戏逻辑(如给予奖励、开始任务等) 示例: Game.Instance.Subscribe<EventConversationCompleted>(e => { Game.Logger.LogInfo("对话完成: {0}", e.Conversation.Cache.Link.FriendlyName); // 恢复游戏 Game.Resume(); // 隐藏对话UI HideConversationUI(); });
构造函数
EventConversationCompleted 仅客户端
csharp
public EventConversationCompleted(Conversation conversation)对话完成事件,在客户端对话正常完成时触发
conversation— 完成的对话实例
备注
此事件在对话执行完毕(或被取消)时触发。 常见用途: 恢复游戏或重新启用玩家输入 隐藏对话UI界面 停止对话相关的背景音乐 记录对话完成状态 触发后续游戏逻辑(如给予奖励、开始任务等) 示例: Game.Instance.Subscribe<EventConversationCompleted>(e => { Game.Logger.LogInfo("对话完成: {0}", e.Conversation.Cache.Link.FriendlyName); // 恢复游戏 Game.Resume(); // 隐藏对话UI HideConversationUI(); });
属性
Conversation 仅客户端
csharp
public Conversation Conversation { get; }完成的对话实例
EventConversationStarted 仅客户端
命名空间 GameUI.ConversationSystem.Event
csharp
public class EventConversationStarted : ITriggerEvent<EventConversationStarted>对话开始事件,在客户端对话开始时触发
conversation— 开始的对话实例
备注
此事件在对话实例创建并开始执行时触发。 常见用途: 暂停游戏或禁用玩家输入 播放对话相关的背景音乐或音效 显示对话UI界面 记录对话统计或日志 示例: Game.Instance.Subscribe<EventConversationStarted>(e => { Game.Logger.LogInfo("对话开始: {0}", e.Conversation.Cache.Link.FriendlyName); // 暂停游戏 Game.Pause(); // 显示对话UI ShowConversationUI(); });
构造函数
EventConversationStarted 仅客户端
csharp
public EventConversationStarted(Conversation conversation)对话开始事件,在客户端对话开始时触发
conversation— 开始的对话实例
备注
此事件在对话实例创建并开始执行时触发。 常见用途: 暂停游戏或禁用玩家输入 播放对话相关的背景音乐或音效 显示对话UI界面 记录对话统计或日志 示例: Game.Instance.Subscribe<EventConversationStarted>(e => { Game.Logger.LogInfo("对话开始: {0}", e.Conversation.Cache.Link.FriendlyName); // 暂停游戏 Game.Pause(); // 显示对话UI ShowConversationUI(); });
属性
Conversation 仅客户端
csharp
public Conversation Conversation { get; }开始的对话实例
ProtoConversationChoiceItem 仅客户端
命名空间 GameUI.ConversationSystem.Proto
csharp
public readonly struct ProtoConversationChoiceItem : IProtocolClientTransient<ProtoConversationChoiceItem>, IBytesReplicableUnmanaged<ProtoConversationChoiceItem>, IBytesReplicable<ProtoConversationChoiceItem>, IProtocolClientTransient, IGameClass, IEquatable<ProtoConversationChoiceItem>构造函数
ProtoConversationChoiceItem 仅客户端
csharp
public ProtoConversationChoiceItem(IGameLink<GameDataConversationChoiceItem> choiceItem)属性
ProtoChoiceItem 仅客户端
csharp
public ProtoIGameLink<GameDataConversationChoiceItem> ProtoChoiceItem { get; }ChoiceItem 仅客户端
csharp
public IGameLink<GameDataConversationChoiceItem>? ChoiceItem { get; }方法
ToString 仅客户端
csharp
public override string ToString()operator != 仅客户端
csharp
public static bool operator !=(ProtoConversationChoiceItem left, ProtoConversationChoiceItem right)operator == 仅客户端
csharp
public static bool operator ==(ProtoConversationChoiceItem left, ProtoConversationChoiceItem right)GetHashCode 仅客户端
csharp
public override int GetHashCode()Equals 仅客户端
csharp
public override bool Equals(object obj)Equals 仅客户端
csharp
public bool Equals(ProtoConversationChoiceItem other)