This commit is contained in:
CortexCore
2025-04-28 15:10:49 +08:00
parent 3f9d9f19ce
commit 4c2534a6e9
11 changed files with 72 additions and 5 deletions

View File

@@ -25,10 +25,21 @@ namespace Net.Project.B.Dialogue
/// </summary>
public event Func<IDialogueData, UniTask> OnDialogueStart;
public event Action<IDialogueData> OnDynamicDialogueStart;
/// <summary>
/// 动态对话
/// </summary>
public event Func<IDialogueData, UniTask<string>> OnDynamicDialogueStartAsync;
/// <summary>
/// 对话结束
/// </summary>
public event Action<IDialogueData> OnDialogueEnd;
/// <summary>
/// 动态对话结束
/// </summary>
public event Action<IDialogueData,string> OnDynamicDialogueEnd;
/// <summary>
/// 对话选择
@@ -48,6 +59,8 @@ namespace Net.Project.B.Dialogue
UniTask CreateDialogue(IDialogueData dialogueData);
UniTask<int> CreateDialogue(IDialogueData dialogueData, IReadOnlyCollection<IDialogueChoice> dialogueChoices);
UniTask<string> CreateDynamicDialogue(IDialogueData dialogueData);
}
public class DialogueService : IDialogueService
@@ -55,7 +68,10 @@ namespace Net.Project.B.Dialogue
public IReadOnlyDictionary<int, IDialogueData> Dialogues => _dialogues;
public event Func<IDialogueData, UniTask> OnDialogueStart;
public event Action<IDialogueData> OnDynamicDialogueStart;
public event Func<IDialogueData, UniTask<string>> OnDynamicDialogueStartAsync;
public event Action<IDialogueData> OnDialogueEnd;
public event Action<IDialogueData, string> OnDynamicDialogueEnd;
public event Func<IDialogueData, IReadOnlyCollection<IDialogueChoice>, UniTask<int>> OnDialogueChoose;
public event Action<IDialogueData, IDialogueChoice> OnDialogueChose;
public async UniTask CreateDialogue(IDialogueData dialogueData)
@@ -105,6 +121,19 @@ namespace Net.Project.B.Dialogue
return index;
}
public async UniTask<string> CreateDynamicDialogue(IDialogueData dialogueData)
{
if (OnDynamicDialogueStartAsync is null)throw new Exception("OnDynamicDialogueStartAsync is not null");
OnDialogueStart?.Invoke(dialogueData);
var result = await OnDynamicDialogueStartAsync.Invoke(dialogueData);
OnDynamicDialogueEnd?.Invoke(dialogueData,result);
return result;
}
private readonly ConcurrentDictionary<int, IDialogueData> _dialogues = new();
}
}