对话框首先要制作好模板,包括提前设置好字体属性和图片位置,当然,理论上讲这些是可以用代码进行控制的。
对话框的触发
对话框的触发一般有两种方式,一种是鼠标点击触发,另一种是主角靠近时触发。这两种其实都是一种思路,利用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的制作,在这里的制作不是很复杂,有一个链接:unity制作动画。
做完之后挂在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('
');
}
}
接下来就是将读取的文本存入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。。。。如果有人看到这里,又想知道的话,私聊我补上吧。。。。。