zoukankan      html  css  js  c++  java
  • 利用状态机和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('
    ');
        }
    }
    

    接下来就是将读取的文本存入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。。。。如果有人看到这里,又想知道的话,私聊我补上吧。。。。。

  • 相关阅读:
    用JavaScript+CSS实现Mootools竖排动画菜单
    如何对html:select下拉列表里的数据进行排序
    Work with Unicode, CCSID & DBCS
    学习笔记之搜索引擎—原理、技术与系统
    C#中如何创建文件夹
    学习笔记之Effective C++ 2nd Edition
    Global variables vs. Host variables vs. Parameter markers
    【ZZ】cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    freopen C/C++文件输入输出利器
    [ZZ]用Eclipse开发C/C++程序的图形化配置
  • 原文地址:https://www.cnblogs.com/ChanWunsam/p/10018330.html
Copyright © 2011-2022 走看看