Implement dialog.

This commit is contained in:
2023-06-22 13:15:25 +08:00
parent db07ace927
commit 22cb8f0cb4
3 changed files with 914 additions and 13 deletions

View File

@@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
namespace Cryville.Crtr {
public class Dialog : MonoBehaviour {
static Dialog _instance;
[SerializeField] CanvasGroup m_group;
[SerializeField] Text m_msgText;
[SerializeField] Text m_button0Text;
[SerializeField] Text m_button1Text;
[SerializeField] GameObject m_button1;
[SerializeField] AnimationCurve m_fadeCurve;
float _fadeDuration;
static readonly Queue<DialogEntry> _queue = new Queue<DialogEntry>();
struct DialogEntry {
public Action<int> callback;
public string message;
public string action0;
public string action1;
}
void Awake() {
_instance = this;
_fadeDuration = m_fadeCurve[m_fadeCurve.length - 1].time;
}
float _timer;
DialogEntry? _cur;
static bool _suppressed;
void Update() {
if (_cur == null) {
if (_timer > 0) {
_timer -= Time.deltaTime;
if (_timer < 0) {
_timer = 0;
m_group.gameObject.SetActive(false);
}
m_group.alpha = m_fadeCurve.Evaluate(_timer);
}
if (_queue.Count > 0 && !_suppressed) {
m_group.gameObject.SetActive(true);
_cur = _queue.Dequeue();
m_msgText.text = _cur.Value.message;
m_button0Text.text = _cur.Value.action0;
m_button1Text.text = _cur.Value.action1;
m_button1.SetActive(_cur.Value.action1 != null);
}
}
else {
if (_timer < _fadeDuration) {
_timer += Time.deltaTime;
if (_timer > _fadeDuration) _timer = _fadeDuration;
m_group.alpha = m_fadeCurve.Evaluate(_timer);
}
}
}
public void OnButton(int id) {
if (_cur == null) return;
var cb = _cur.Value.callback;
if (cb != null) cb(id);
_cur = null;
}
public static void Suppress() {
_suppressed = true;
if (_instance._cur != null) {
_queue.Enqueue(_instance._cur.Value);
_instance._cur = null;
}
}
public static void Release() {
_suppressed = false;
}
public static void Show(Action<int> callback, string message, string action0 = "OK", string action1 = null) {
_queue.Enqueue(new DialogEntry { callback = callback, message = message, action0 = action0, action1 = action1 });
}
public static int ShowAndWait(string message, string action0 = "OK", string action1 = null) {
using (var ev = new AutoResetEvent(false)) {
int result = 0;
_queue.Enqueue(new DialogEntry {
callback = r => { result = r; ev.Set(); },
message = message, action0 = action0, action1 = action1,
});
ev.WaitOne();
return result;
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f866af19f9d7e3147bd73fdae32f8525
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: