using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using System; using System.Collections; using System.Collections.Generic; namespace Fungus.Script { public class Dialog : MonoBehaviour { public enum DialogSide { Left, Right }; public float writingSpeed; public AudioClip writingSound; public bool loopWritingSound = true; public Canvas dialogCanvas; public Text nameText; public Text storyText; public Image leftImage; public Image rightImage; public void ShowDialog(bool visible) { if (dialogCanvas != null) { dialogCanvas.gameObject.SetActive(visible); } } public void SetCharacter(Character character) { if (character == null) { if (leftImage != null) leftImage.enabled = false; if (rightImage != null) rightImage.enabled = false; if (nameText != null) nameText.text = ""; } else { SetCharacterImage(character.characterImage, character.dialogSide); SetCharacterName(character.name, character.characterColor); } } public void SetCharacterImage(Sprite image, DialogSide side) { if (leftImage != null) { if (image != null && side == DialogSide.Left) { leftImage.sprite = image; leftImage.enabled = true; } else { leftImage.enabled = false; } } if (rightImage != null) { if (image != null && side == DialogSide.Right) { rightImage.sprite = image; rightImage.enabled = true; } else { rightImage.enabled = false; } } } public void SetCharacterName(string name, Color color) { if (nameText != null) { nameText.text = name; nameText.color = color; } } protected IEnumerator WriteText(string text, Action onWritingComplete) { // Zero CPS means write instantly // Also write instantly if text contains markup tags if (writingSpeed == 0 || text.Contains("<")) { storyText.text = text; if (onWritingComplete != null) { onWritingComplete(); } yield break; } GameObject typingAudio = null; if (writingSound != null) { typingAudio = new GameObject("WritingSound"); typingAudio.AddComponent(); typingAudio.audio.clip = writingSound; typingAudio.audio.loop = loopWritingSound; typingAudio.audio.Play(); } storyText.text = ""; // Make one character visible at a time float writeDelay = (1f / (float)writingSpeed); float timeAccumulator = 0f; int i = 0; while (true) { timeAccumulator += Time.deltaTime; while (timeAccumulator > writeDelay) { i++; timeAccumulator -= writeDelay; } if (i >= text.Length) { storyText.text = text; break; } else { string left = text.Substring(0, i + 1); storyText.text = left; } yield return null; } if (typingAudio != null) { Destroy(typingAudio); } if (onWritingComplete != null) { onWritingComplete(); } yield break; } protected virtual void Clear() { ClearStoryText(); } void ClearStoryText() { if (storyText != null) { storyText.text = ""; } } } }