Browse Source

Merge pull request #157 from FungusGames/156-concurrent-say-commands

Fixed: Concurrent Say calls cause Say Dialog to freeze up #156
master
Chris Gregan 10 years ago
parent
commit
2fb676ce1a
  1. 17
      Assets/Fungus/Narrative/Scripts/SayDialog.cs
  2. 13
      Assets/Fungus/UI/Scripts/Writer.cs
  3. 1609
      Assets/Tests/Narrative/NarrativeTests.unity

17
Assets/Fungus/Narrative/Scripts/SayDialog.cs

@ -131,6 +131,21 @@ namespace Fungus
public virtual void Say(string text, bool clearPrevious, bool waitForInput, bool fadeWhenDone, AudioClip audioClip, Action onComplete) public virtual void Say(string text, bool clearPrevious, bool waitForInput, bool fadeWhenDone, AudioClip audioClip, Action onComplete)
{ {
StartCoroutine(SayInternal(text, clearPrevious, waitForInput, fadeWhenDone, audioClip, onComplete));
}
protected virtual IEnumerator SayInternal(string text, bool clearPrevious, bool waitForInput, bool fadeWhenDone, AudioClip audioClip, Action onComplete)
{
Writer writer = GetWriter();
// Stop any existing Say Command and write this one instead
// This will probably take a frame or two to complete
while (writer.isWriting || writer.isWaitingForInput)
{
writer.Stop();
yield return null;
}
this.fadeWhenDone = fadeWhenDone; this.fadeWhenDone = fadeWhenDone;
// Look for a character sound effect if no voice over clip is specified // Look for a character sound effect if no voice over clip is specified
@ -141,7 +156,7 @@ namespace Fungus
clip = speakingCharacter.soundEffect; clip = speakingCharacter.soundEffect;
} }
GetWriter().Write(text, clearPrevious, waitForInput, clip, onComplete); writer.Write(text, clearPrevious, waitForInput, clip, onComplete);
} }
protected virtual void LateUpdate() protected virtual void LateUpdate()

13
Assets/Fungus/UI/Scripts/Writer.cs

@ -49,11 +49,15 @@ namespace Fungus
[Tooltip("Write one word at a time rather one character at a time")] [Tooltip("Write one word at a time rather one character at a time")]
public bool writeWholeWords = false; public bool writeWholeWords = false;
// This property is true when the writer is waiting for user input to continue /**
* This property is true when the writer is waiting for user input to continue
*/
[System.NonSerialized] [System.NonSerialized]
public bool isWaitingForInput; public bool isWaitingForInput;
// This property is true when the writer is writing text or waiting (i.e. still processing tokens) /**
* This property is true when the writer is writing text or waiting (i.e. still processing tokens)
*/
[System.NonSerialized] [System.NonSerialized]
public bool isWriting; public bool isWriting;
@ -453,6 +457,7 @@ namespace Fungus
inputFlag = false; inputFlag = false;
exitFlag = false; exitFlag = false;
isWaitingForInput = false;
isWriting = false; isWriting = false;
NotifyEnd(); NotifyEnd();
@ -587,7 +592,7 @@ namespace Fungus
NotifyPause(); NotifyPause();
float timeRemaining = duration; float timeRemaining = duration;
while (timeRemaining > 0f && !inputFlag) while (timeRemaining > 0f && !inputFlag && !exitFlag)
{ {
timeRemaining -= Time.deltaTime; timeRemaining -= Time.deltaTime;
yield return null; yield return null;
@ -603,7 +608,7 @@ namespace Fungus
inputFlag = false; inputFlag = false;
isWaitingForInput = true; isWaitingForInput = true;
while (!inputFlag) while (!inputFlag && !exitFlag)
{ {
yield return null; yield return null;
} }

1609
Assets/Tests/Narrative/NarrativeTests.unity

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save