【Unity教程】劇情對(duì)話(huà)系統(tǒng)

課代表來(lái)了,代碼再次,點(diǎn)贊關(guān)注拿走
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class DiaLogmanager : MonoBehaviour
{
??/// <summary>
??/// 對(duì)話(huà)內(nèi)容文本,csv格式
??/// </summary>?
??public TextAsset dialogDataFile;
??/// <summary>
??/// 左側(cè)角色圖像
??/// </summary>
??public SpriteRenderer spriteLeft;
??/// <summary>
??/// 右側(cè)角色圖像
??/// </summary>
??public SpriteRenderer spriteRight;
??/// <summary>
??/// 角色名字文本
??/// </summary>
??public TMP_Text nameText;
??/// <summary>
??/// 對(duì)話(huà)內(nèi)容文本
??/// </summary>
??public TMP_Text dialogText;
??/// <summary>
??/// 角色圖片列表
??/// </summary>
??public List<Sprite> sprites = new List<Sprite>();
??/// <summary>
??/// 角色名字對(duì)應(yīng)圖片的字典
??/// </summary>
??Dictionary<string, Sprite> imageDic = new Dictionary<string, Sprite>();
??/// <summary>
??/// 當(dāng)前對(duì)話(huà)索引值
??/// </summary>
??public int dialogIndex;
??/// <summary>
??/// 對(duì)話(huà)文本按行分割
??/// </summary>
??public string[] dialogRows;
??/// <summary>
??/// 繼續(xù)按鈕
??/// </summary>
??public Button next;
??/// <summary>
??/// 選項(xiàng)按鈕
??/// </summary>
??public GameObject optionButton;
??/// <summary>
??/// 選項(xiàng)按鈕父節(jié)點(diǎn)
??/// </summary>
??public Transform buttonGroup;
??// Start is called before the first frame update
??private void Awake()
??{
????imageDic["醫(yī)生"] = sprites[0];
????imageDic["弗蘭"] = sprites[1];
??}
??void Start()
??{
????ReadText(dialogDataFile);
????ShowDiaLogRow();
????// UpdateText("安吉麗娜", "即使引導(dǎo)早已破碎,也請(qǐng)您當(dāng)上艾爾登之王");
????//UpdateImage("僵尸", false);//不在左側(cè)
????// UpdateImage("安吉麗娜", true);//在左側(cè)
??}
??// Update is called once per frame
??void Update()
??{
??}
??//更新文本信息
??public void UpdateText(string _name, string _text)
??{
????nameText.text = _name;
????dialogText.text = _text;
??}
??//更新圖片信息
??public void UpdateImage(string _name, string _position)
??{
????if (_position == "左")
????{
??????spriteLeft.sprite = imageDic[_name];
????}
????else if (_position == "右")
????{
??????spriteRight.sprite = imageDic[_name];
????}
??}
??public void ReadText(TextAsset _textAsset)
??{
????dialogRows = _textAsset.text.Split('\n');//以換行來(lái)分割
?????????????????????????// foreach(var row in rows)
?????????????????????????//{
?????????????????????????//?string[] cell = row.Split(',');
?????????????????????????// }
????Debug.Log("讀取成果");
??}
??public void ShowDiaLogRow()
??{
????for(int i=0;i<dialogRows.Length;i++)
????{
??????string[] cells = dialogRows[i].Split(',');
??????if (cells[0] == "#" && int.Parse(cells[1]) == dialogIndex)
??????{
????????UpdateText(cells[2], cells[4]);
????????UpdateImage(cells[2], cells[3]);
????????dialogIndex = int.Parse(cells[5]);
????????next.gameObject.SetActive(true);
????????break;
??????}
??????else if (cells[0]== "@" && int.Parse(cells[1]) == dialogIndex)
??????{
????????next.gameObject.SetActive(false);//隱藏原來(lái)的按鈕
????????GenerateOption(i);
??????}
??????else if (cells[0] == "end" && int.Parse(cells[i]) == dialogIndex)
??????{
????????Debug.Log("劇情結(jié)束");//這里結(jié)束
??????}
????}
??}
??public void OnClickNext()
??{
????ShowDiaLogRow();
??}
??public void GenerateOption(int _index)//生成按鈕
??{
????string[] cells = dialogRows[_index].Split(',');
????if (cells[0] == "@")
????{
??????GameObject button = Instantiate(optionButton, buttonGroup);
??????//綁定按鈕事件
??????button.GetComponentInChildren<TMP_Text>().text = cells[4];
??????button.GetComponent<Button>().onClick.AddListener(delegate?
??????{?
????????OnOptionClick(int.Parse(cells[5]));
??????}
??????);
??????GenerateOption(_index + 1);
????}
????
??}
??public void OnOptionClick(int _id)
??{
????dialogIndex = _id;
????ShowDiaLogRow();
????for(int i=0;i < buttonGroup.childCount; i++)
????{
??????Destroy(buttonGroup.GetChild(i).gameObject);
????}
??}
}