chrisgregan
10 years ago
12 changed files with 233 additions and 181 deletions
@ -0,0 +1,120 @@ |
|||||||
|
using UnityEngine; |
||||||
|
using UnityEngine.UI; |
||||||
|
using System; |
||||||
|
using System.Collections; |
||||||
|
using System.Collections.Generic; |
||||||
|
|
||||||
|
namespace Fungus.Script |
||||||
|
{ |
||||||
|
|
||||||
|
public class ChooseDialog : Dialog |
||||||
|
{ |
||||||
|
public class Option |
||||||
|
{ |
||||||
|
public string text; |
||||||
|
public Action onSelect; |
||||||
|
} |
||||||
|
|
||||||
|
public List<UnityEngine.UI.Button> optionButtons = new List<UnityEngine.UI.Button>(); |
||||||
|
|
||||||
|
List<Action> optionActions = new List<Action>(); |
||||||
|
|
||||||
|
public void Choose(string text, List<Option> options, float timeoutDuration, Action onTimeout) |
||||||
|
{ |
||||||
|
Clear(); |
||||||
|
|
||||||
|
StartCoroutine(WriteText(text, delegate { |
||||||
|
foreach (Option option in options) |
||||||
|
{ |
||||||
|
AddOption(option.text, option.onSelect); |
||||||
|
} |
||||||
|
|
||||||
|
if (timeoutDuration > 0) |
||||||
|
{ |
||||||
|
StartCoroutine(WaitForTimeout(timeoutDuration, onTimeout)); |
||||||
|
} |
||||||
|
})); |
||||||
|
} |
||||||
|
|
||||||
|
IEnumerator WaitForTimeout(float timeoutDuration, Action onTimeout) |
||||||
|
{ |
||||||
|
yield return new WaitForSeconds(timeoutDuration); |
||||||
|
|
||||||
|
Clear(); |
||||||
|
|
||||||
|
if (onTimeout != null) |
||||||
|
{ |
||||||
|
onTimeout(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected override void Clear() |
||||||
|
{ |
||||||
|
base.Clear(); |
||||||
|
ClearOptions(); |
||||||
|
} |
||||||
|
|
||||||
|
void ClearOptions() |
||||||
|
{ |
||||||
|
if (optionButtons == null) |
||||||
|
{ |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
optionActions.Clear(); |
||||||
|
|
||||||
|
foreach (UnityEngine.UI.Button button in optionButtons) |
||||||
|
{ |
||||||
|
if (button != null) |
||||||
|
{ |
||||||
|
button.gameObject.SetActive(false); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
bool AddOption(string text, Action action) |
||||||
|
{ |
||||||
|
if (optionButtons == null) |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool addedOption = false; |
||||||
|
foreach (UnityEngine.UI.Button button in optionButtons) |
||||||
|
{ |
||||||
|
if (!button.gameObject.activeSelf) |
||||||
|
{ |
||||||
|
button.gameObject.SetActive(true); |
||||||
|
|
||||||
|
Text textComponent = button.GetComponentInChildren<Text>(); |
||||||
|
if (textComponent != null) |
||||||
|
{ |
||||||
|
textComponent.text = text; |
||||||
|
} |
||||||
|
|
||||||
|
optionActions.Add(action); |
||||||
|
|
||||||
|
addedOption = true; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return addedOption; |
||||||
|
} |
||||||
|
|
||||||
|
public void SelectOption(int index) |
||||||
|
{ |
||||||
|
if (index < optionActions.Count) |
||||||
|
{ |
||||||
|
Action optionAction = optionActions[index]; |
||||||
|
if (optionAction != null) |
||||||
|
{ |
||||||
|
StopCoroutine("WaitForTimeout"); |
||||||
|
Clear(); |
||||||
|
optionAction(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: f7a657dd101e84d9da0a5ee5f934317d |
||||||
|
MonoImporter: |
||||||
|
serializedVersion: 2 |
||||||
|
defaultReferences: [] |
||||||
|
executionOrder: 0 |
||||||
|
icon: {instanceID: 0} |
||||||
|
userData: |
@ -0,0 +1,66 @@ |
|||||||
|
using UnityEngine; |
||||||
|
using UnityEngine.UI; |
||||||
|
using System; |
||||||
|
using System.Collections; |
||||||
|
|
||||||
|
namespace Fungus.Script |
||||||
|
{ |
||||||
|
|
||||||
|
public class SayDialog : Dialog |
||||||
|
{ |
||||||
|
public Image continueImage; |
||||||
|
|
||||||
|
public void Say(string text, Action onComplete) |
||||||
|
{ |
||||||
|
Clear(); |
||||||
|
|
||||||
|
if (storyText != null) |
||||||
|
{ |
||||||
|
storyText.text = text; |
||||||
|
} |
||||||
|
|
||||||
|
StartCoroutine(WriteText(text, delegate { |
||||||
|
ShowContinueIcon(true); |
||||||
|
|
||||||
|
StartCoroutine(WaitForInput(delegate { |
||||||
|
Clear(); |
||||||
|
|
||||||
|
if (onComplete != null) |
||||||
|
{ |
||||||
|
onComplete(); |
||||||
|
} |
||||||
|
})); |
||||||
|
|
||||||
|
})); |
||||||
|
} |
||||||
|
|
||||||
|
protected override void Clear() |
||||||
|
{ |
||||||
|
base.Clear(); |
||||||
|
ShowContinueIcon(false); |
||||||
|
} |
||||||
|
|
||||||
|
void ShowContinueIcon(bool visible) |
||||||
|
{ |
||||||
|
if (continueImage != null) |
||||||
|
{ |
||||||
|
continueImage.enabled = visible; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
IEnumerator WaitForInput(Action onInput) |
||||||
|
{ |
||||||
|
// TODO: Handle touch input |
||||||
|
while (!Input.GetMouseButtonDown(0)) |
||||||
|
{ |
||||||
|
yield return null; |
||||||
|
} |
||||||
|
|
||||||
|
if (onInput != null) |
||||||
|
{ |
||||||
|
onInput(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue