博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用状态机和Trigger制作对话框
阅读量:7106 次
发布时间:2019-06-28

本文共 2370 字,大约阅读时间需要 7 分钟。

目录

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

对话框的触发

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

方式一

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

  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。。。。如果有人看到这里,又想知道的话,私聊我补上吧。。。。。

转载于:https://www.cnblogs.com/ChanWunsam/p/10018330.html

你可能感兴趣的文章
WLS_Oracle Weblogic管理概述(概念)
查看>>
UML的基本关联
查看>>
没有找到MSVCR100.dll解决方法
查看>>
wordpress调用函数大全
查看>>
触发器四(学习笔记)
查看>>
[LeetCode] Excel Sheet Column Number 求Excel表列序号
查看>>
Javascript闭包简单理解
查看>>
Android ---paint类
查看>>
spin_lock &amp; mutex_lock的差别?
查看>>
curl命令具体解释
查看>>
【HDU】4336 Card Collector
查看>>
Linux进程间通信——使用命名管道
查看>>
TestLink学习四:TestLink1.9.13使用说明
查看>>
通用分页存储过程
查看>>
神秘代码让iPhone微信闪退的解决方法
查看>>
文章索引
查看>>
基于jquery结婚电子请柬特效素材
查看>>
Knockout应用开发指南 第九章:高级应用举例
查看>>
EDW on Hadoop(Hadoop上的数据仓库)技术选型和实践思考
查看>>
设计模式——责任链模式
查看>>