文档章节

Unity Editor编辑数据-XYGame

梦想游戏人
 梦想游戏人
发布于 2017/04/10 20:33
字数 742
阅读 22
收藏 0
点赞 0
评论 0

目标:实现一个数据编辑器,编辑敌人属性 波数等

该应用在XYGame 里面应用  http://www.dreamyouxi.com/xygame.html

项目中的相关文件有

EnemyPrototype.cs 

OneEnemyBornData.cs

TerrainObjectEnemyBornPointData.cs

EnemyBornEdit.cs

EnemyPrototypeEdit.cs

EnemyPrototypeEditor.cs

1.怪物种类原型编辑器

EnemyPrototypeEdit.cs

/*
* Author:  caoshanshan
* Email:   me@dreamyouxi.com
怪物原型 编辑器
 */
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR

using UnityEditor;

//[RequireComponent(typeof(EnemyPrototypeEditor))]
[CustomEditor(typeof(EnemyPrototypeEditor))]
public class EnemyPrototypeEdit : Editor
{
    static int damage = 200;
    static int exp = 100;
    static int hp = 100;
    static string code="202001";
    static EnemyProtoType type = EnemyProtoType.小怪1;

    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        DrawDefaultInspector();

        EnemyPrototypeEditor obj = target as EnemyPrototypeEditor;
        if (obj == null) return;

        {
            EnemyPrototype[] comps = obj.gameObject.GetComponents<EnemyPrototype>();

            GUILayout.Label("--------怪物原型编辑器---------");
            GUILayout.Label("--------生成设置---------");

            GUILayout.BeginHorizontal();
            GUILayout.Label("怪物Code");
            code = EditorGUILayout.TextField(code, GUILayout.Width(100));
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("血量hp");
            hp = EditorGUILayout.IntField(hp, GUILayout.Width(100));
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("经验exp");
            exp = EditorGUILayout.IntField(exp, GUILayout.Width(100));
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("基础伤害damage");
            damage = EditorGUILayout.IntField(damage, GUILayout.Width(100));
            GUILayout.EndHorizontal();


            GUILayout.BeginHorizontal();
            GUILayout.Label("类型type");
            type = (EnemyProtoType)EditorGUILayout.EnumPopup("", type, GUILayout.Width(100)); // 单选
            GUILayout.EndHorizontal();
      
        }

        GUILayout.BeginHorizontal();

        if (GUILayout.Button("添加一个原型"))
        {
            EnemyPrototype data = obj.gameObject.AddComponent<EnemyPrototype>();
            data.hp = hp;
            data.type = type;
            data.damage = damage;
            data.exp = exp;
            data.code = code;
            serializedObject.ApplyModifiedProperties();
        }


        if (GUILayout.Button("倒序删除一个原型"))
        {
            Component[] comp = obj.gameObject.GetComponents<EnemyPrototype>();
            if (comp != null && comp.Length >= 1)
            {
                if (comp[comp.Length - 1] != null)
                {
                    GameObject.DestroyImmediate(comp[comp.Length - 1]);

                    serializedObject.ApplyModifiedProperties();
                }
            }
        }

        if (GUILayout.Button("清空"))
        {
            Component[] comp = obj.gameObject.GetComponents<EnemyPrototype>();
            foreach (Component cm in comp)
            {
                GameObject.DestroyImmediate(cm);
            }
            serializedObject.ApplyModifiedProperties();
        }

        GUILayout.EndHorizontal();

        serializedObject.Update();

    }
}


#else
public class EnemyPrototypeEdit : MonoBehaviour
{

}


#endif

 

2.怪物波数等 编辑器

EnemyBornEdit.cs

/*
* Author:  caoshanshan
* Email:   me@dreamyouxi.com
刷新点 编辑器
 */
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR

using UnityEditor;

//[RequireComponent(typeof(TerrainObjectEnemyBornPointData))]
[CustomEditor(typeof(TerrainObjectEnemyBornPointData))]
//[CanEditMultipleObjects]
public class EnemyBornEdit : Editor
{
    void OnEnable()
    {
    }
    static float time_add = 1;
    static string type = "202001";// 原型类型
    static int count = 10;//数量


    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        DrawDefaultInspector();

        TerrainObjectEnemyBornPointData obj = target as TerrainObjectEnemyBornPointData;
        if (obj == null) return;

        {
            OneEnemyBornData[] comps = obj.gameObject.GetComponents<OneEnemyBornData>();

            GUILayout.Label("--------该刷新点数据汇总---------");

            GUILayout.BeginHorizontal();
            GUILayout.Label("敌人总数:");
            GUILayout.Label(comps.Length.ToString(), GUILayout.Width(50));
            GUILayout.EndHorizontal();

            GUILayout.Label("-------批量生成设置---------");

            GUILayout.BeginHorizontal();
            GUILayout.Label("每个单位时间增量");
            time_add = EditorGUILayout.FloatField(time_add, GUILayout.Width(100));
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("怪物原型");
            type = EditorGUILayout.TextField(type, GUILayout.Width(100));
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("生成个数");
            count = EditorGUILayout.IntField(count, GUILayout.Width(100));
            GUILayout.EndHorizontal();

        }

        GUILayout.BeginHorizontal();

        if (GUILayout.Button("顺序批量添加"))
        {
            OneEnemyBornData[] comps = obj.gameObject.GetComponents<OneEnemyBornData>();
            float t = 0f;
            if (comps.Length > 0)
            {
                t = time_add + comps[comps.Length - 1].time;
            }
            for (int i = 0; i < count; i++)
            {
                OneEnemyBornData data = obj.gameObject.AddComponent<OneEnemyBornData>();
                data.time = t;
                data.enemy_code = type;
                t += time_add;
            }
            serializedObject.ApplyModifiedProperties();
        }
        if (GUILayout.Button("顺序添加一个"))
        {
            OneEnemyBornData[] comps = obj.gameObject.GetComponents<OneEnemyBornData>();
            OneEnemyBornData data = obj.gameObject.AddComponent<OneEnemyBornData>();
            if (comps.Length > 0)
            {
                data.time = time_add + comps[comps.Length - 1].time;
                data.enemy_code = type;
            }
            serializedObject.ApplyModifiedProperties();
        }

        if (GUILayout.Button("倒序删除"))
        {
            Component[] comp = obj.gameObject.GetComponents<OneEnemyBornData>();
            if (comp != null && comp.Length >= 1)
            {
                if (comp[comp.Length - 1] != null)
                {
                    GameObject.DestroyImmediate(comp[comp.Length - 1]);

                    serializedObject.ApplyModifiedProperties();
                }
            }
        }

        if (GUILayout.Button("清空"))
        {
            Component[] comp = obj.gameObject.GetComponents<OneEnemyBornData>();
            foreach (Component cm in comp)
            {
                GameObject.DestroyImmediate(cm);
            }
            serializedObject.ApplyModifiedProperties();
        }

        GUILayout.EndHorizontal();

        serializedObject.Update();

    }
}


#else
public class EnemyBornEdit : MonoBehaviour
{

}


#endif

3.以上数据准备好后 ,接入代码

CustomObjects.cs


/// <summary>
/// Enemy 启动器
/// </summary>
class EnemyLauncher : Model
{
    public OneEnemyBornData data = null;

    public static EnemyLauncher Create(OneEnemyBornData data)
    {
        EnemyLauncher ret = new EnemyLauncher();
        ret.Init();
        ret.data = data;
        return ret;
    }
    public override void UpdateMS()
    {
        if (tick.Tick())
        {
            return;
        }

        EnemyPrototype proto = EnemyPrototype.GetPrototype(data.enemy_code);
        if (proto != null)
        {
            Enemy enemy = EnemyMgr.Create(proto.GetClassType());
            // one enemy data  
            enemy.team = 333;
            enemy.x = data.gameObject.transform.localPosition.x;
            enemy.z = data.gameObject.transform.localPosition.y;
            enemy.y = 2;
            //prototype
            enemy.hp = proto.hp;
            enemy.current_hp = enemy.hp;
            enemy.damage = proto.damage;
            enemy.exp = proto.exp;
        }
        this.SetInValid();
    }
    public override void OnEnter()
    {
        tick.SetMax(Utils.ConvertToFPS(data.time));
    }

    Counter tick = Counter.Create();
}

/// <summary>
/// 刷新点
/// 只提供数据
/// </summary>
public class TerrainObjectEnemyBornPoint : CustomObject
{
    public override bool Init()
    {
        base.Init();

        return true;
    }
    public override void UpdateMS()
    {

    }
    public override void InitWithData(object obj)
    {
        TerrainObjectEnemyBornPointData data = obj as TerrainObjectEnemyBornPointData;
        this.x = data.gameObject.transform.localPosition.x;
        this.y = data.gameObject.transform.localPosition.y;
        this.z = data.gameObject.transform.localPosition.z;
        this.name = data.gameObject.name;
        OneEnemyBornData[] enemys = data.gameObject.GetComponents<OneEnemyBornData>();
        foreach (OneEnemyBornData enemy in enemys)
        {//初始化 启动器
            EnemyLauncher launch = EnemyLauncher.Create(enemy);  // ModelMgr.Create<EnemyLauncher>();
            ModelMgr.ins.Add(launch);
        }
        Debug.Log("TerrainObjectEnemyBornPoint  OK " + enemys.Length);
    }
}

 

TODO:由于目前数据是以预设方式提供,发行时 应该序列化为json 或xml

© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 34
博文 402
码字总数 115594
作品 0
成都
同一个Unity项目打开两个Unity Editor实例

coffeecato写在前面: 有时测试功能,需要多开unity3d进行,而unity3d无法同时打开同一个项目,找到了这个解决方案,亲测可用,方便简单,欢迎大家品尝! 在项目开发过程中,经常会遇到一个U...

u010832643 ⋅ 04/24 ⋅ 0

Unity如何同时打开多个项目

本文缘由 当我们研究一个Unity3d的项目,需要边看项目的边操作,这时候就需要同时打开两个项目,一个自己的demo,一个要研究的project。在网上找了一些解决方案,一些是Unity5.x以前的版本的...

NoDieThinking ⋅ 05/24 ⋅ 0

如何把UGUI当做一个插件使用(删除Unity中的UGUI,导入UGUI源码进入项目)

最近闲着没事,一直也都知道UGUI是开源的,所以就想着把UGUI的源代码放到Unity里面,看一看能不能用,经过一番调试,终于弄好了,有兴趣的同学可以看一下,欢迎交流沟通。 欲练神功,必先自宫...

qq826364410 ⋅ 05/09 ⋅ 0

Unity Memory 内存 官方文档笔记

本文档主要是对Unity官方教程的个人理解与总结(其实以翻译记录为主:>) 仅作为个人学习使用,不得作为商业用途,欢迎转载,并请注明出处。 文章中涉及到的操作都是基于 Unity2017.3版本 参...

cangod ⋅ 04/18 ⋅ 0

关于Unity3D Assets资源目录结构管理

u3d默认目录 ) (插件)不是C#语言写一些插件和库,比如javajsC++,u3d默认目录,u3d是C#编译器,其他语言只有这个目录才能识别 资源,需要动态加载的资源放在这里,打包时在这个文件夹里的所有文件...

lizhenxiqnmlgb ⋅ 05/23 ⋅ 0

Unity-UnityScript转换C#工具(js转c#)

如何使用 首先,从https://github.com/Unity-Technologies/unityscript2csharp/releases下载工具。 运行转换工具之前: 备份您的项目 请记住,如果您的UnityScripts将#pragma严格应用于它们,...

qq_21153225 ⋅ 05/09 ⋅ 0

【AR】在Unity中开始使用Vuforia(1)

原 目录 在Unity中开始使用Vuforia Vuforia在统一 关于Vuforia 安装Vuforia 创建一个新的Unity项目 Vuforia游戏对象 在您的项目中激活Vuforia 访问Unity中的Vuforia功能 将目标添加到您的场景...

lichong951 ⋅ 06/11 ⋅ 0

Unity3D利用Webservice读取数据库

相信大家从事Unity3D开发的,无论是做单机的还是做网游的,特别是稍微大点的项目,都会用到数据库,但是网络上关于Unity3D如何连接数据库的教程少之甚少,搜来搜去无非是那篇Unity3D如何连接...

qq_30279553 ⋅ 04/22 ⋅ 0

Rider 2018.1 发布,.NET 跨平台集成开发环境

Rider 2018.1 发布,新版本增加了许多新功能,改进和修复。 更新内容: Roslyn analyzers: in addition to Rider’s own 2400 code inspections to help you detect errors and code smells......

周其 ⋅ 04/20 ⋅ 0

Unity3D - 图片资源导入的一些基础知识

在上一篇文章里 Unity3D - 你导入的资源,并不是Unity使用的资源 介绍过,Unity使用的资源是你无法直接操作的,那么对于图片资源,我们应该如何去处理和优化工作流程呢? 图片资源的分类 在U...

qq_17758883 ⋅ 04/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 22分钟前 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 29分钟前 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 32分钟前 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 34分钟前 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 35分钟前 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 39分钟前 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 47分钟前 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 56分钟前 ⋅ 0

vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、一般模式下复制粘贴剪切

VIM Vim 是 UNIX 文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff),语法高亮,全面的帮助系统,本地脚本(Vimscript),和便于选择的...

蛋黄Yolks ⋅ 今天 ⋅ 0

springboot+mockito测试controller层遇到的问题

使用MockitoJUnitRunner测试的一个例子,原来报错无法找到bean, 类似的异常如下:createBeanError..... 原因:是因为@Runwith使用了SpringRunner,应该修改为MockitoJUnitRunner 代码如下: ...

writeademo ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部