105 lines
3.5 KiB
C#
105 lines
3.5 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
|
|
|
|
protected override void Awake()
|
|
{
|
|
base.Awake();
|
|
// 获取预制体
|
|
choiceButtonPrefab = Resources.Load<GameObject>("Perfabs/UI/Choice Button");
|
|
// 获取子物体
|
|
dialogBox = transform.GetChild(0).gameObject;
|
|
Debug.Log(dialogBox == null);
|
|
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(() => {
|
|
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 (Transform child in choiceBox.transform)
|
|
{
|
|
Destroy(child.gameObject);
|
|
}
|
|
|
|
// 生成新按钮
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|