文档章节

Unity Editor编辑数据-XYGame

梦想游戏人
 梦想游戏人
发布于 2017/04/10 20:33
字数 742
阅读 24
收藏 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
博文 423
码字总数 120460
作品 0
成都
unity3d环境安装指南: Unity 4.5.5 + Visual Studio 2010

UnitySetup-4.5.5.exe 官网下载最新版本4.X 安装exe文件 2. Unity 4.x Pro Patch.exe 复制exe到安装目录下 C:Program Files (x86)UnityEditor 运行exe 点击Browse,选择文件夹C:Program Fil...

润物互动技术团队博客
2014/10/28
0
1
同一个Unity项目打开两个Unity Editor实例

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

u010832643
04/24
0
0
Unity如何同时打开多个项目

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

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

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

qq826364410
05/09
0
0
不能直接获取?聊聊如何在Shader Graph中获取深度图

0x00 前言 在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享。主要涵盖了 StreamingAssets、Profiler、Playable、Par...

陈嘉栋
08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
10分钟前
0
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
35分钟前
1
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
1
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
今天
1
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部