unity3D 对话系统的制作

摘要:
准备两个C#代码+一个txt文本。报告大多数错误是因为未获取代码的公共变量,导致引用为空!B你好,爷爷。A欢迎来到帕里镇。我是这里的村长,萨洛特。B哦,是村长。你好

准备两个C#代码+1个txt文本

多数报错都是代码的公开变量没有获取到,导致空引用!

1:对话框内容文本文件.txt

自行准备文本信息(如果显示的是乱码,请更改编码格式为UTF-8)

A
你好啊,勇士!
B
你好,老爷爷.
A
欢迎来到帕利镇,我是这的村长,萨罗特.
B
喔,原来是村长啊,您好!

2:NPC代码,挂在到要对话的物体对象身上

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class Sensei : MonoBehaviour
 6 {
 7     public GameObject talkUI;//对话框面板
 8     public bool talkUIState;//对话框状态
 9     public GameObject buttonR;//显示在NPC头上的按键图片
10 
11     void Update()
12     {
13         if (buttonR.activeSelf && Input.GetKeyDown(KeyCode.R)) {
14             talkUIState = !talkUIState;
15             talkUI.SetActive(talkUIState);
16         }
17     }
18 
19     private void OnTriggerEnter2D(Collider2D c) {
20         if (c.gameObject.CompareTag("Player")) {
21             print("触碰了村长的触发器");
22             buttonR.SetActive(true);
23         }
24     }
25 
26     private void OnTriggerExit2D(Collider2D c) {
27         if (c.gameObject.CompareTag("Player")) {
28             print("离开村长触发器");
29             buttonR.SetActive(false);
30         }
31     }
32 }

3:对话系统(核心)

  1 using System.Collections;
  2 using System.Collections.Generic;
  3 using UnityEngine;
  4 using UnityEngine.UI;
  5 public class TalkSystem : MonoBehaviour {
  6     [Header("UI组件")]
  7     public Text textLabel;//要更改的文字
  8     public Image talkImage;//说话的头像
  9     public GameObject talkPanel;//对话面板
 10 
 11     [Header("对话文本文件")]
 12     public TextAsset textFile;//对话文本文件
 13     public int index;
 14     List<string> textList = new List<string>();//存储文字的集合
 15     public float textSpeed;//文本显示速度
 16     public bool textIsOver;//文本是否显示完毕
 17 
 18     [Header("头像")]
 19     public Sprite face1, face2;//头像1,2
 20 
 21     private void Awake() {
 22         //读取文件
 23         GetTextFormFile(textFile);
 24     }
 25 
 26     void Update() {
 27         PrintTlakText();
 28     }
 29 
 30     /// <summary>
 31     /// 当物体会被激活显示时触发,生命周期速度比start块
 32     /// </summary>
 33     private void OnEnable() {
 34         //就显示文字
 35         //textLabel.text = textList[index];
 36         //index++;
 37         textIsOver = true;
 38         //开启协程
 39         StartCoroutine(SetTextUI());
 40     }
 41     /// <summary>
 42     /// 从文件读取文本
 43     /// </summary>
 44     /// <param name="f"></param>
 45     void GetTextFormFile(TextAsset f) {
 46         textList.Clear();
 47         index = 0;
 48 
 49         //将文本按行切割,变成数组
 50         var lineDate = f.text.Split('
');
 51 
 52         //循环将数组中的字符添加到 集合中
 53         foreach (var l in lineDate) {
 54             textList.Add(l);
 55         }
 56     }
 57 
 58     /// <summary>
 59     /// 输出对话文本
 60     /// </summary>
 61     void PrintTlakText() {
 62         //判断达到了最后一句话
 63         if (Input.GetKeyDown(KeyCode.T) && index == textList.Count) {
 64             //隐藏对话框
 65             talkPanel.SetActive(false);
 66             //下标归0
 67             index = 0;
 68             return;
 69         }
 70         //如果按下按键 并且 这行显示完成了,才能开始执行协程
 71         if (Input.GetKeyDown(KeyCode.T) && textIsOver) {
 72             //开启协程
 73             StartCoroutine(SetTextUI());
 74         }
 75     }
 76 
 77     /// <summary>
 78     /// 创建协程
 79     /// </summary>
 80     /// <returns></returns>
 81     IEnumerator SetTextUI() {
 82         //一开始设置为false
 83         textIsOver = false;
 84         //清空显示的文本
 85         textLabel.text = "";
 86 
 87         //判断当前行文字为A or B时,改变对应的头像
 88         //Trim()删除字符串头部及尾部出现的空格,
 89         switch (textList[index].Trim()) {
 90             case "A":
 91                 print("当前是A");
 92                 talkImage.sprite = face1;//切换头像
 93                 index++;//跳过显示
 94                 break;
 95             case "B":
 96                 print("当前是B");
 97                 talkImage.sprite = face2;
 98                 index++;
 99                 break;
100         }
101 
102         //循环获取当前下标的文本长度
103         for (int i = 0; i < textList[index].Length; i++) {
104             //累加当前行的所以有符串
105             textLabel.text += textList[index][i];
106             //等待时间(变量)并返回
107             yield return new WaitForSeconds(textSpeed);
108         }
109         //执行完成后将文本输入完毕设置为true
110         textIsOver = true;
111         //下标自增
112         index++;
113     }
114 
115 }

效果GIF(请忽视移动动画...)

原教程地址:Unity教程:<对话系统>#01:简介&UI制作_哔哩哔哩_bilibili

unity3D 对话系统的制作第1张

免责声明:文章转载自《unity3D 对话系统的制作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Struts2升级出现的问题h5 float布局下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity2018安装

1. 直接安装 2.  先安装Unity 2018.2.14f1 若有C:ProgramDataUnity文件夹,删除这个文件夹下的所有文件 3. 解压 unity2018破解.zip 将最后一个exe复制到unity安装文件夹下(UnityEditor) 以管理员身份运行   4. 打开unity 点击 Manual Activation ->...

【整理】unity3d优化总结篇

对项目优化有很多,如:mesh合并 ,减少DrawCall和模型骨骼以及物理计算,合并材质球,优化代码等等,现在继续补上,该内容为本人经验以及网上收集整理,希望大家有更好的优化方法,能够继续跟帖,一起探讨,共同进步。优化:1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他们都...

【Unity】透明物体显示问题

总结一下Shader开启透明渲染后的一些显示问题的解决方案,考虑Zwrite,Ztest,Queue这三个属性的设置问题。 首先需要记住的是: 对于不透明物体,渲染的正确顺序是从前往后; 对于半透明物体。渲染的顺序是从后往前。 这样才能实现正确的渲染输出。 注意:Alpha Test,Alphato Coverage不在讨论之列。这里涉及到的是使用Alph...

unity 在移动平台中,文件操作路径详解

今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够更好、更快的掌握,当然,如有不足的地方 欢迎指正!!!相信大家在开发过程中,难免会保存一些文件在客户端进行本地化操作。如:配置文件,状态文件,Assetbundle文件等等...最近总有人问我:1.保存了一个xml在客户端,能读取里面的数据,可是不能修改,...

将Flash的Sprite导入Unity(解释说明版)

usingUnityEngine; usingUnityEditor; usingSystem.IO; usingSystem.Xml; usingSystem.Reflection; public classAutoSliceSpriteSheetWithXML : AssetPostprocessor { private voidOnPr...

【Unity】Compute Shader粒子效果模拟

在UE4引擎中,已经实现了GPU的粒子系统,可以快速计算数百万的粒子及其碰撞。在Unity中,可以简单的使用Compute Shader,来尝试实现GPU粒子的效果。 实现一个简单的立方体粒子效果,图片压缩的很厉害……粒子数量在6w+ 第一步,我们实现一个脚本,挂在在摄像机组件上,这个脚本我们用来控制粒子的渲染。 1 usingSystem.Colle...