利用状态机和Trigger制作对话框

对话框首先要制作好模板,包括提前设置好字体属性和图片位置,当然,理论上讲这些是可以用代码进行控制的。

对话框的触发

对话框的触发一般有两种方式,一种是鼠标点击触发,另一种是主角靠近时触发。这两种其实都是一种思路,利用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序列化,直接在编辑器里编辑。从策划的角度看,第一种虽然省事但是要比较多的代码量,第二种更有针对性一些。

方式一

第一种方法很简单,主要的功夫在文本的读取上。写之前我罗列了要解决的几个步骤:

  1. 导入文件并进行读取
  2. 将读取文件存入字典中
  3. 对外提供索引

代码如下:

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]);
}

代码写得随心所欲,主要是出于学习的目的。如果要改进的话,有以下思路:

  1. .txt文件的内容可以添加一些关键词,方便切割;
  2. Dict所在的脚本最好做成单例形式;
  3. Dict对内存占用较大,如果对话内容比较多的时候不考虑用这种方式

针对第三点,第二种方式无疑是一种比较好的解决方式。

方式二

没写2333。。。。如果有人看到这里,又想知道的话,私聊我补上吧。。。。。

posted @ 2018-11-26 01:09  Wunsam_Chan  阅读(387)  评论(0编辑  收藏  举报