Degulleo3D/Assets/ChatWindowController.cs
Lim0_C ffdc2a8cf9 DEG-84 [Feat] 대화창 구현
상호작용이나 이벤트에 필요한 대화창 구현
2025-04-22 15:34:00 +09:00

114 lines
3.3 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ChatWindowController : MonoBehaviour, IPointerClickHandler
{
[SerializeField] private TMP_Text chatText;
[SerializeField] private Image clickIndicator;
private Coroutine _typingCoroutine;
private Coroutine _clickCoroutine;
private string _inputText;
private Queue<string> _inputQueue;
public delegate void OnComplete();
public OnComplete onComplete;
private void Start()
{
Init("마무리", () =>
{
Debug.Log("대화 끝.");
});
ShowText(_inputQueue.Dequeue());
}
public void Init(string text, OnComplete onComplete)
{
_inputQueue = new Queue<string>();
_inputQueue.Enqueue("아 망했어 오늘도 지각이다!!!! 이러면 진짜 해고당할 수도 있어!!!\n어떡하지 큰일이다!!!");
_inputQueue.Enqueue("톼사하셈 ㅋ");
_inputQueue.Enqueue("톼사하셈 ㅋ");
_inputQueue.Enqueue("스킵도 가능 톼사하셈 ㅋ톼사하셈 ㅋ톼사하셈 ㅋ톼사하셈 ㅋ톼사하셈 ㅋ");
_inputQueue.Enqueue(text);
this.onComplete = onComplete;
}
//화면에 표시할 텍스트 삽입 함수
private void ShowText(string text)
{
var clickIndicatorColor = clickIndicator.color;
clickIndicatorColor.a = 1;
clickIndicator.color = clickIndicatorColor;
_inputText = text;
if (_typingCoroutine != null)
{
StopCoroutine(_typingCoroutine);
}
_typingCoroutine = StartCoroutine(TypingEffectCoroutine(_inputText));
}
//텍스트 타이핑효과 코루틴
private IEnumerator TypingEffectCoroutine(string text)
{
StringBuilder strText = new StringBuilder();
for (int i = 0; i < text.Length; i++)
{
strText.Append(text[i]);
chatText.text = strText.ToString();
yield return new WaitForSeconds(0.1f);
}
_clickCoroutine = StartCoroutine(ClickIndicatorCoroutine());
_typingCoroutine = null;
}
private IEnumerator ClickIndicatorCoroutine()
{
bool flag = true;
var clickIndicatorColor = clickIndicator.color;
while (true)
{
clickIndicatorColor.a = flag? 0:1;
flag = !flag;
clickIndicator.color = clickIndicatorColor;
yield return new WaitForSeconds(0.5f);
}
}
//대화창 클릭 시 호출 함수
public void OnPointerClick(PointerEventData eventData)
{
if (_typingCoroutine != null)
{
StopCoroutine(_typingCoroutine);
_typingCoroutine = null;
chatText.text = _inputText;
_clickCoroutine = StartCoroutine(ClickIndicatorCoroutine());
}
else
{
if (_clickCoroutine != null)
{
StopCoroutine(_clickCoroutine);
_clickCoroutine = null;
}
if (_inputQueue.Count > 0)
{
ShowText(_inputQueue.Dequeue());
}
else
{
onComplete?.Invoke();
}
}
}
}