Files
Scampz/Assets/Scripts/Dialogue/DialogueManager.cs

107 lines
2.3 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
{
public class DialogueManager : MonoBehaviour
{
[SerializeField]
private Animator _animator;
[SerializeField]
private TextMeshProUGUI dialogueTextGUI;
[SerializeField]
private float _defaultTextSpeed = 0.1f;
private float _currentTextSpeed;
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();
_currentTextSpeed = _defaultTextSpeed;
}
public void StartDialogue(Dialogue dialogue)
{
_animator.SetBool("IsOpen", true);
IsTalking = true;
sentences.Clear();
foreach (var sentence in dialogue.sentences)
sentences.Enqueue(sentence);
DisplayNextSentence();
}
public void DisplayNextSentence()
{
if (!sentences.Any())
{
EndDialogue();
StopAllCoroutines();
return;
}
SFXManager.Instance.PlaySoundEffect(SoundEffectName.Narration);
var sentence = sentences.Dequeue();
StopAllCoroutines();
StartCoroutine(TypeSentence(sentence));
}
private IEnumerator TypeSentence(string sentence)
{
dialogueTextGUI.text = string.Empty;
foreach (var letter in sentence.ToCharArray())
{
dialogueTextGUI.text += letter;
yield return null;
yield return new WaitForSeconds(_currentTextSpeed);
}
yield return new WaitForSeconds(1f);
SFXManager.Instance.StopSoundEffect();
yield return new WaitForKeyDown(InputOptions.Submit);
SFXManager.Instance.PlaySoundEffect(SoundEffectName.Ok);
DisplayNextSentence();
}
private void EndDialogue()
{
_animator.SetBool("IsOpen", false);
IsTalking = false;
SFXManager.Instance.StopSoundEffect();
}
}
}