Files
aibis-dream/Assets/Scripts/UI/DialogUiViewer.cs
T
2024-08-12 19:42:43 +08:00

97 lines
3.2 KiB
C#

using Febucci.UI;
using Febucci.UI.Core;
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Yarn.Unity;
namespace AibisDream
{
public class DialogUiViewer : Singleton<DialogUiViewer>
{
#region 对话框UI
private GameObject dialogBox;
private TypewriterByCharacter dialogText;
private TextMeshProUGUI actorName;
private Button nextButton;
private GameObject choiceBox;
private GameObject choiceButtonPrefab;
#endregion
private void Start()
{
// 获取预制体
choiceButtonPrefab = Resources.Load<GameObject>("Perfabs/UI/Choice Button");
// 获取子物体
dialogBox = transform.GetChild(0).gameObject;
GetDialogComponentInBox(dialogBox);
}
/// <summary>
/// 显示文字
/// </summary>
/// <param name="dialogLine">对话内容</param>
/// <param name="actor">名称</param>
/// <param name="nextStep">下一步</param>
public void ShowLine(string dialogLine, string actor, Action nextStep)
{
dialogBox.SetActive(true);
dialogText.gameObject.SetActive(true);
choiceBox.SetActive(false);
actorName.text = actor;
dialogText.ShowText(dialogLine);
nextButton.onClick.RemoveAllListeners();
nextButton.onClick.AddListener(() => {
Debug.Log("Next");
nextStep.Invoke();
nextButton.gameObject.SetActive(false);
});
}
/// <summary>
/// 显示选项
/// </summary>
/// <param name="dialogueOptions">选项</param>
/// <param name="onOptionSelected"></param>
public void ShowOptions(DialogueOption[] dialogueOptions, Action<int> onOptionSelected)
{
dialogBox.SetActive(true);
choiceBox.SetActive(true);
dialogText.gameObject.SetActive(false);
foreach (DialogueOption option in dialogueOptions)
{
var choiceInstance = Instantiate(choiceButtonPrefab, Vector3.zero, Quaternion.identity);
choiceInstance.transform.SetParent(choiceBox.transform);
choiceInstance.GetComponentInChildren<TextMeshProUGUI>().text = option.Line.TextWithoutCharacterName.Text;
choiceInstance.GetComponent<Button>().onClick.AddListener(() => onOptionSelected.Invoke(option.DialogueOptionID));
}
}
public void ShowNextButton()
{
nextButton.gameObject.SetActive(true);
}
private void GetDialogComponentInBox(GameObject box)
{
actorName = box.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>();
dialogText = box.transform.GetChild(1).gameObject.GetComponent<TypewriterByCharacter>();
nextButton = box.transform.GetChild(2).GetComponent<Button>();
choiceBox = box.transform.GetChild(3).gameObject;
dialogText.onTextShowed.AddListener(ShowNextButton);
}
public void HideDialog()
{
dialogBox?.SetActive(false);
}
}
}