From 04e3cea5c966b8e41474c540b3e04835ed25b289 Mon Sep 17 00:00:00 2001 From: Jon Manning Date: Tue, 21 May 2024 14:56:35 +1000 Subject: [PATCH] Add OnDialogueStartedAsync; Dialogue Runner now waits for all views to report ready before delivering content --- Runtime/Async/AsyncDialogueViewBase.cs | 3 ++- Runtime/DialogueRunner.cs | 19 +++++++++++++++++-- Runtime/Views/DialogueViewBase.cs | 7 ++++++- .../DialogueRunnerMockUI.cs | 7 ++++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Runtime/Async/AsyncDialogueViewBase.cs b/Runtime/Async/AsyncDialogueViewBase.cs index a6f5a202..220829d0 100644 --- a/Runtime/Async/AsyncDialogueViewBase.cs +++ b/Runtime/Async/AsyncDialogueViewBase.cs @@ -25,7 +25,8 @@ public abstract class AsyncDialogueViewBase : MonoBehaviour { public abstract YarnTask RunLineAsync(LocalizedLine line, CancellationToken token); public abstract YarnOptionTask RunOptionsAsync(DialogueOption[] dialogueOptions, CancellationToken cancellationToken); - public abstract YarnTask DialogueCompleteAsync(); + public abstract YarnTask OnDialogueStartedAsync(); + public abstract YarnTask OnDialogueCompleteAsync(); public virtual bool EndLineWhenViewFinishes => false; } diff --git a/Runtime/DialogueRunner.cs b/Runtime/DialogueRunner.cs index d4ba0681..78872a8a 100644 --- a/Runtime/DialogueRunner.cs +++ b/Runtime/DialogueRunner.cs @@ -291,7 +291,7 @@ async YarnTask RunCompletion() { try { - await view.DialogueCompleteAsync(); + await view.OnDialogueCompleteAsync(); } catch (System.Exception e) { @@ -615,7 +615,22 @@ public void StartDialogue(string nodeName) onDialogueStart?.Invoke(); - Dialogue.Continue(); + StartDialogueAsync().Forget(); + + async YarnTask StartDialogueAsync() + { + var tasks = new List(); + foreach (var view in DialogueViews) + { + if (view == null) + { + continue; + } + tasks.Add(view.OnDialogueStartedAsync()); + } + await YarnTask.WhenAll(tasks); + Dialogue.Continue(); + } } public void CancelCurrentLine() diff --git a/Runtime/Views/DialogueViewBase.cs b/Runtime/Views/DialogueViewBase.cs index 5fea025d..81fd84de 100644 --- a/Runtime/Views/DialogueViewBase.cs +++ b/Runtime/Views/DialogueViewBase.cs @@ -380,7 +380,12 @@ public virtual void UserRequestedViewAdvancement() // default implementation does nothing } - public override YarnTask DialogueCompleteAsync() + public override YarnTask OnDialogueStartedAsync() + { + return YarnTask.CompletedTask; + } + + public override YarnTask OnDialogueCompleteAsync() { return YarnTask.CompletedTask; } diff --git a/Tests/Runtime/DialogueRunnerTests/DialogueRunnerMockUI.cs b/Tests/Runtime/DialogueRunnerTests/DialogueRunnerMockUI.cs index dd0c3db8..5a2cf701 100644 --- a/Tests/Runtime/DialogueRunnerTests/DialogueRunnerMockUI.cs +++ b/Tests/Runtime/DialogueRunnerTests/DialogueRunnerMockUI.cs @@ -163,7 +163,12 @@ public override async YarnOptionTask RunOptionsAsync(DialogueOption[] dialogueOp return dialogueOptions[selectedOption]; } - public override YarnTask DialogueCompleteAsync() + public override YarnTask OnDialogueStartedAsync() + { + return YarnTask.CompletedTask; + } + + public override YarnTask OnDialogueCompleteAsync() { return YarnTask.CompletedTask; }