Files
Scampz/Assets/Scripts/Dialogue/DialogueManager.cs
2022-08-20 15:38:13 -07:00

110 lines
2.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Scampz.GameJam.Assets.Scripts;
using Scampz.GameJam.Assets.Scripts.Audio;
using Scampz.GameJam.Assets.Scripts.Utilities;
using TMPro;
using UnityEngine;
namespace Scampz.GameJam
{
[RequireComponent(typeof(TextMeshProUGUI))]
public class DialogueManager : MonoBehaviour
{
[SerializeField]
private Animator _animator;
[SerializeField]
private TextMeshProUGUI _dialogueTextGUI;
private Queue<string> sentences;
public static DialogueManager Instance;
public bool IsTalking = false;
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(this);
return;
}
Instance = this;
}
public void Start()
{
sentences = new Queue<string>();
}
private void Update()
{
if (IsTalking && Input.GetButtonDown(InputOptions.Cancel))
EndDialogue();
}
public void StartDialogue(Dialogue dialogue)
{
_animator.SetBool("IsOpen", true);
IsTalking = true;
sentences.Clear();
foreach (var sentence in dialogue.Sentences)
sentences.Enqueue(sentence);
DisplayNextSentence(dialogue);
}
private IEnumerator PlayAudioCoroutine(SFXClip soundEffect)
{
yield return null;
SFXManager.Instance.PlaySoundEffect(soundEffect.audioClip.name);
yield return null;
}
public void DisplayNextSentence(Dialogue dialogue)
{
if (!sentences.Any())
{
EndDialogue();
StopAllCoroutines();
return;
}
var sentence = sentences.Dequeue();
StopAllCoroutines();
StartCoroutine(TypeSentence(sentence, dialogue));
StartCoroutine(nameof(PlayAudioCoroutine), dialogue.SoundEffect);
}
private IEnumerator TypeSentence(string sentence, Dialogue dialogue)
{
_dialogueTextGUI.text = string.Empty;
foreach (var letter in sentence.ToCharArray())
{
_dialogueTextGUI.text += letter;
yield return null;
yield return new WaitForSeconds(dialogue.TextSpeed);
}
yield return null;
SFXManager.Instance.StopSoundEffect();
yield return new WaitForSeconds(0.3f);
yield return new WaitForKeyDown(InputOptions.Submit);
SFXManager.Instance.PlaySoundEffect(SoundEffectName.Ok);
DisplayNextSentence(dialogue);
}
private void EndDialogue()
{
StopAllCoroutines();
_animator.SetBool("IsOpen", false);
_dialogueTextGUI.text = string.Empty;
IsTalking = false;
SFXManager.Instance.StopSoundEffect();
}
}
}