Unity 实现简单的人物对话系统
博客中有两处语法错误 切割文本内容的时候和创建头像的时候
创建一个cube作为点击NPC的人物对象(挂载NPC脚本)
创建一个空物体 GameManager(挂载Dialog脚本)
场景中创建一个对话背景Image 对话文本1(人物名字) 对话文本2(对话内容) Image 人物头像 运行时点击Cube即可看见效果
对话文本内容如下,text文本保存格式一定是UTF-8 ,不然不会显示中文,创建好之后直接拖入Unity中即可使用
云天河%梦璃……是你吗?%0 云天河%是你回来了吗?%0 柳梦璃%云公子……是我……%1 柳梦璃%云公子……你还好吗……%1 云天河%梦璃……我很好,你终于回来了……%0 柳梦璃%云公子,你的眼睛怎么了……%1 云天河%不碍事……倒是你,香味老远就闻到了……%0 柳梦璃%(哭泣)云公子……%1 云天河%回来就好…%0
脚本代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NPC : MonoBehaviour { public TextAsset _mTextAsset; //文本资源 private void OnMouseDown() { Dialog.share.CreateDialogue(_mTextAsset); } void Start () { } void Update () { } }
空物体上的脚本:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; public class Dialog : MonoBehaviour { public static Dialog share; public List<string[]> List_diaContents = new List<string[]>(); //用来存储所有的对话内容 public Image dialogueBg; //对话款背景 public Text _textName; //对话人物的名字 public Text _textContent; //对话人物说的话 public Image _imageHead; //头像 public Sprite[] IconSprites;//所有头像集合 private bool isChat = false; //是否在对话 private int index; //对话内容的索引 private Tweener tweener; //对话框进入和离开屏幕的动画 private void Awake() { share = this; } void Start () { tweener = dialogueBg.rectTransform.DOLocalMoveY(-150, 0.5f).SetEase(Ease.InBack) .SetAutoKill(false); tweener.Pause(); //动画一开始设置为暂停 IconSprites = Resources.LoadAll<Sprite>("Icon"); //获取所有头像集合 } /// <summary> /// 创建一个对话框 /// </summary> /// <param name="_mTextAsset">文本资源</param> public void CreateDialogue(TextAsset _mTextAsset) { if (isChat) { Debug.Log("111"); return; } List_diaContents.Clear();//每次都清空对话 List isChat = true; //初始化文本资源里的对话内容 string[] textAll = _mTextAsset.text.Split( );//先根据换行符切割出每一行文字 for (int i = 0; i < textAll.Length; i++) { string[] contents = textAll[i].Split(%); //根据%切割出三个 0 名字 1说的话 2头像 List_diaContents.Add(contents); //把名字 对话 头像 存进List } Debug.Log("222"); tweener.PlayForward(); //播放对话框进入屏幕的动画 } void Update () { if (isChat) //当打开对话框时 { if (Input.GetMouseButtonDown(0)||Input.GetKeyDown(KeyCode.Space)) { Debug.Log("333");// if (index>=List_diaContents.Count) //当对话到了最后一步 { tweener.PlayBackwards(); //倒放对话框动画 index = 0; isChat = false;//关闭 } else { _textName.text = List_diaContents[index][0]; //显示对话人物的名称 _textContent.text = List_diaContents[index][1];//显示对话的内容 int i = int.Parse(List_diaContents[index][2]); _imageHead.sprite = IconSprites[i];//显示头像 index++; //当前对话内容的索引 } } } } }