[Unity实战]剧情对话(二)

上一篇文章中,我们在CommandManager中直接写入一个个的指令,实际上这样是很不好的,因为一个游戏可能会出现很多的剧情动画,那么不就是要写n个类吗?而且修改起来也不是很好的。所以一个比较好的方法就是写一个编辑器类。

以下是本人写的一个编辑器类,功能还不是很完善,例如可以加入"插入命令","从文本中读取命令"等等等的功能,不过,先将就用了。。

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

public enum Option
{
    CommandDestory,
    CommandDialogue,
    CommandDialogueModeEnter,
    CommandDialogueModeExit,
    CommandGenerate,
    CommandMove,
    CommandMusic,
    CommandPlayAnim,
    CommandRotate,
    CommandWait
}

public class Window : EditorWindow
{
    List<Option> options = new List<Option>();
    List<string[]> strings = new List<string[]>();
    List<int[]> ints = new List<int[]>();
    List<float[]> floats = new List<float[]>();
    List<Vector3[]> vector3s = new List<Vector3[]>();

    Vector2 v2 = new Vector2(0, 0);//滚动条参数

    [MenuItem("Window/My Window")]
    static void Init()
    {
        EditorWindow.GetWindow(typeof(Window));
    }

    void OnGUI()
    {
        if (GUILayout.Button("保存命令"))
        {
        }

        if (GUILayout.Button("添加命令"))
        {
            Option x = Option.CommandDialogueModeEnter;
            options.Add(x);
            string[] a = new string[5];
            strings.Add(a);
            int[] b = new int[5];
            ints.Add(b);
            float[] c = new float[5];
            floats.Add(c);
            Vector3[] d = new Vector3[5];
            vector3s.Add(d);
        }

        if (GUILayout.Button("删除命令"))
        {
            options.RemoveAt(options.Count - 1);
            strings.RemoveAt(options.Count - 1);
            ints.RemoveAt(options.Count - 1);
            floats.RemoveAt(options.Count - 1);
            vector3s.RemoveAt(options.Count - 1);
        }

        v2 = EditorGUILayout.BeginScrollView(v2,false,true,null);
        for (int i = 0; i < options.Count; i++)
        {
            options[i] = (Option)EditorGUILayout.EnumPopup("选项" + i, options[i]);
            switch (options[i])
            {
                case Option.CommandDestory:
                    strings[i][0] = EditorGUILayout.TextField("物体名字", strings[i][0]);
                    break;
                case Option.CommandDialogue:
                    strings[i][0] = EditorGUILayout.TextField("xml文本名字", strings[i][0]);
                    ints[i][0] = EditorGUILayout.IntField("开始序号", ints[i][0]);
                    ints[i][1] = EditorGUILayout.IntField("结束序号", ints[i][1]);
                    ints[i][2] = EditorGUILayout.IntField("点击后执行的步骤数", ints[i][2]);
                    break;
                case Option.CommandDialogueModeEnter:
                    break;
                case Option.CommandDialogueModeExit:
                    break;
                case Option.CommandGenerate:
                    strings[i][0] = EditorGUILayout.TextField("物体名字", strings[i][0]);
                    vector3s[i][0] = EditorGUILayout.Vector3Field("生成位置", vector3s[i][0]);
                    vector3s[i][1] = EditorGUILayout.Vector3Field("生成角度", vector3s[i][1]);
                    break;
                case Option.CommandMove:
                    strings[i][0] = EditorGUILayout.TextField("物体名字", strings[i][0]);
                    vector3s[i][0] = EditorGUILayout.Vector3Field("终点位置", vector3s[i][0]);
                    floats[i][0] = EditorGUILayout.FloatField("所用时间", floats[i][0]);
                    break;
                case Option.CommandMusic:
                    strings[i][0] = EditorGUILayout.TextField("音乐名字", strings[i][0]);
                    break;
                case Option.CommandPlayAnim:
                    strings[i][0] = EditorGUILayout.TextField("物体名字", strings[i][0]);
                    ints[i][0] = EditorGUILayout.IntField("动画状态", ints[i][0]);
                    break;
                case Option.CommandRotate:
                    strings[i][0] = EditorGUILayout.TextField("物体名字", strings[i][0]);
                    vector3s[i][0] = EditorGUILayout.Vector3Field("终点角度", vector3s[i][0]);
                    floats[i][0] = EditorGUILayout.FloatField("所用时间", floats[i][0]);
                    break;
                case Option.CommandWait:
                    floats[i][0] = EditorGUILayout.FloatField("等待时间", floats[i][0]);
                    break;
                default:
                    break;
            }
        }
        EditorGUILayout.EndScrollView();
    }
}

时间: 2024-10-26 08:05:38

[Unity实战]剧情对话(二)的相关文章

[Unity实战]剧情对话

在网上看到了一篇不错的文章,讲的是游戏中的剧情动画,感觉去做一做也是挺好玩的事,于是就有了这篇文章.游戏中的剧情(非CG动画)主要有两种,一种是自动播放的,另一种是含有对话的.可以把剧情中的一个个动画(这里的动画不仅仅包含角色动画,还包含位移,旋转,时间等待等等)当成一种种状态(有点像状态机),放到一个链表或者队列中,每当一个状态完成时便跳到下一个状态,于是就会形成连环的剧情动画了. 要注意的是,在普通状态下,一个动作完成会跳到下一个动作,但是在对话状态下,一个动作完成时不会自动跳到下一个动作,

[Unity实战]剧情对话(三)

在这里,我们使用xml来实现保存与读取功能. 首先,是头文件的引用: using System.Xml; 保存到xml文件: void Save() { string filePath = Application.dataPath + @"/my.xml"; XmlDocument xmlDoc = new XmlDocument(); XmlElement root = xmlDoc.CreateElement("root"); for (int i = 0; i

SCCM 2012 R2实战系列之二:前提工作准备

在上一篇中,我们完成了SQL Server 2012的安装和配置.现在跟大家分享SCCM安装前的准备工作. 2.1 SCCM 2012 R2 准备工作 2.1.1 创建并分配System Management容器权限 打开ADSI编辑器,连接到"默认命名上下文"---右击"system"新建对象---选择"container"-下一步---填写值"system management"---下一步---完成 分配System M

AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码

AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码 开篇唠嗑 本篇内容写在5.1假期前夕,主要是让大家能在节假日休息充点的时候能有好的干货例子,到目前为止netcore方面的实战例子分享即将进入正轨,谢谢各位朋友多多支持:最近工作安排的新项目即将开始,项目前期就我一人搭建,让我犹豫的是对于公司这个内部系统并且是初建的项目用什么开

(转载)Fiddler实战深入研究(二)

原文来源于:http://www.cnblogs.com/tugenhua0707/p/4637771.html,作者:涂根华 !个人觉得文章写的特别好,故收藏于此,感谢原作者的分享 Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选项卡断点调式 Fiddler 中的Stave插件 回到顶部 Fiddler不能捕获chrome的session的设置

基于PHP实战ThinkSNS V3二次开发

基于PHP实战ThinkSNS V3二次开发(系统架构.网站定制化开发.问答系统开发) 课程分类:PHP 适合人群:中级 课时数量:25课时 服务类型:C类(普通服务类课程) 用到技术:PHP.ThinkSNS V3二次开发 涉及项目:ThinkSNS V3二次开发.问答系统 咨询QQ:1840215592 课程内容简介: 由于ThinkSNS产品提供了完整的微博及系统功能,并提供了非常友好的二次开发规范.越多越多的企业和开发人员选择使用ThinkSNS构建成熟的SNS企业网站和商业项目.本课程

UEditor实战分享(二)定制

UEditor提供了三种版本:开发板.Mini版.UBuilder版,其中UBuilder版是支持用户定制功能,UBuilder主要为开发者定制一个最精简的编辑器,故在下载包中不包含开发源码.代码示例,开发合并工具等.详情请关注UBuilder版本. UEditor实战分享(二)定制

jquery Mobile应用第2课《构建跨平台APP:jQuery Mobile移动应用实战》连载二(简单的QWER键盘)

在jQuery Mobile的布局中,控件大多都是单独占据页面中的一行,按钮自然也不例外,但是仍然有一些方法能够让多个按钮组成一行,比如说在范例6-5中就利用按钮分组的方法使4个按钮并列在一行中,如图6-24和图6-25所示. 图6-24 实现按钮分组的方法 图6-25 分组的按钮 而在上一节中也许有读者已经注意到,头部栏中的按钮并没有占据一整行,也没有与多个按钮一起成组存在,那么在页面的其他部分是否也可以让按钮以这样的形式出现呢? [范例6-9 简单的QWER键盘] 01 <!DOCTYPE

XenApp_XenDesktop_7.6实战篇之二:基础架构准备

根据上一章节的架构图和服务器配置清单,今天我们需要完成整个基础架构的准备,包括XenServer 6.5 部署.管理服务器VM创建和安装.配置管理服务器IP和Hostname等.由于XenServer的部署.存储.网络和VM等方面的内容在之前的博文已经介绍了,本章节就稍微带过. 1.  XenServer 6.5管理和配置 1.1 XenServer 6.5的部署.配置和管理请参考XenServer 6.5实战系列博文,如下: XenServer 6.5实战系列之一:Citrix, I am C