Skip to content

Instantly share code, notes, and snippets.

@GuyInGrey
Created September 5, 2020 01:26
Show Gist options
  • Save GuyInGrey/45ae1faad871323777e05b4d71d2a3df to your computer and use it in GitHub Desktop.
Save GuyInGrey/45ae1faad871323777e05b4d71d2a3df to your computer and use it in GitHub Desktop.
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace MorganSS
{
public class DialogueBox : MonoBehaviour
{
public static Message CurrentMessage;
public static List<Message> MessageQueue = new List<Message>();
public bool Showing => !(CurrentMessage is null);
[SerializeField]
private Sprite[] CharacterExpressions;
[SerializeField]
private Image Background;
[SerializeField]
private Image CharacterDisplay;
[SerializeField]
private TMP_Text TextField;
[SerializeField]
private int CharactersPerSecond = 20;
private float TimeSinceTextStart;
// Update is called once per frame
void Update()
{
CharacterDisplay.enabled = Showing;
Background.enabled = Showing;
TextField.enabled = Showing;
MessageQueue.RemoveAll(m => m is null);
if (!Showing && MessageQueue.Count > 0)
{
CurrentMessage = MessageQueue[0];
MessageQueue.RemoveAt(0);
}
if (!Showing) { return; }
CharacterDisplay.sprite = CharacterExpressions.Where(
s => s.name == (CurrentMessage.CharacterSpeaking + "_" + CurrentMessage.Expression).ToLower()).FirstOrDefault();
CharacterDisplay.GetComponent<RectTransform>().sizeDelta = new Vector2(
4.4f * CharacterDisplay.sprite.rect.width,
4.4f * CharacterDisplay.sprite.rect.height);
TimeSinceTextStart += Time.deltaTime;
var charactersShouldShow = (int)(TimeSinceTextStart * CharactersPerSecond);
charactersShouldShow = charactersShouldShow >= CurrentMessage.Text.Length ? CurrentMessage.Text.Length : charactersShouldShow;
TextField.text = CurrentMessage.Text.Substring(0,charactersShouldShow);
if (Input.GetKeyDown(KeyCode.C))
{
if (charactersShouldShow < CurrentMessage.Text.Length)
{
TimeSinceTextStart = 1000f; // Longer time than any message would take to display
}
else
{
CurrentMessage = null;
if (MessageQueue.Count > 0)
{
CurrentMessage = MessageQueue[0];
MessageQueue.RemoveAt(0);
}
TimeSinceTextStart = 0f;
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment