目录
对话框首先要制作好模板,包括提前设置好字体属性和图片位置,当然,理论上讲这些是可以用代码进行控制的。
对话框的触发
对话框的触发一般有两种方式,一种是鼠标点击触发,另一种是主角靠近时触发。这两种其实都是一种思路,利用Unity封装好的事件机制就可以制作。
Unity还帮我们把其中鼠标点击的事件机制封装成UIButton
,可以直接添加该Component来绑定OnButtonClick
事件。但是OnTriggerEnter
等这些事件还是需要自己代码绑定,所以我们可以把Unity中的事件机制统一做一层封装,需要用时继承一下就好。
下面是自己封装好的OnTrigger2D
代码:
using UnityEngine;using UnityEngine.Events;namespace Assets{ [RequireComponent(typeof(Collider2D))] public class OnTrigger2D : MonoBehaviour { public LayerMask layers; public UnityEvent OnEnter, OnExit; private void Reset() { layers = LayerMask.NameToLayer("Everything"); } private void OnTriggerEnter2D(Collider2D collision) { if (!enabled) return; if (layers.Contains(collision.gameObject)) { OnExcuteEnter(); } } private void OnTriggerExit2D(Collider2D collision) { if (!enabled) return; if (layers.Contains(collision.gameObject)) { OnExcuteExit(); } } protected virtual void OnExcuteEnter() { OnEnter.Invoke(); } protected virtual void OnExcuteExit() { OnExit.Invoke(); } }}
状态机制作动图
有时候对话框里面的图片要想实现简单的动画,可以借用状态机来实现。这一部分涉及到AnimationClip的制作,在这里的制作不是很复杂,有一个链接:。
做完之后挂在Animator上就可以实现Sprite的高速切换,避免复杂的脚本。脚本自动生成对话内容
主要是使用Dict< key,value >来存储所有的对话内容和索引。至于如何制作文本内容,这里有两种方式:
一种是将文本集中到.txt或.xml等文件中,脚本逐行或逐条读取内容。另一种是通过SerializedProperty
序列化,直接在编辑器里编辑。从策划的角度看,第一种虽然省事但是要比较多的代码量,第二种更有针对性一些。 方式一
第一种方法很简单,主要的功夫在文本的读取上。写之前我罗列了要解决的几个步骤:
- 导入文件并进行读取
- 将读取文件存入字典中
- 对外提供索引
代码如下:
public static string[] ReadTxt(string pathName){ if (pathName.Split(':').Length > 1) { return File.ReadAllLines(pathName); } else { string context = ((TextAsset)Resources.Load(pathName)).text; return context.Split('\n'); }}
接下来就是将读取的文本存入Dict中:
string[] texts = ReadPhrase.ReadTxt("Phrase");for (int i = 1; i <= texts.Length; i++){ string key = "INFOPOST" + i.ToString(); PhraseDict.Add(key, texts[i - 1]);}
代码写得随心所欲,主要是出于学习的目的。如果要改进的话,有以下思路:
- .txt文件的内容可以添加一些关键词,方便切割;
- Dict所在的脚本最好做成单例形式;
- Dict对内存占用较大,如果对话内容比较多的时候不考虑用这种方式
针对第三点,第二种方式无疑是一种比较好的解决方式。
方式二
没写2333。。。。如果有人看到这里,又想知道的话,私聊我补上吧。。。。。