文档章节

Unity Editor编辑数据-XYGame

梦想游戏人
 梦想游戏人
发布于 2017/04/10 20:33
字数 742
阅读 26
收藏 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

© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 35
博文 435
码字总数 123998
作品 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
Unity3D平台依赖编译

Platform Defines The platform defines that Unity supports for your scripts are: Property: Function: UNITY_EDITOR Define for calling Unity Editor scripts from your game code. UNI......

xxx111ooo
2015/11/12
1
0
同一个Unity项目打开两个Unity Editor实例

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

u010832643
04/24
0
0
Egret3D 1.2 发布,编辑器内测版同步上线

10月8日,Egret3D 版本更新至 1.2 版本,本次更新重点解决以下问题:1、通过模块化分离,降低引擎体积和内部耦合性;2、动画系统支持更多高级特性;3、通过 Egret3D Inspector 和 Egret3D Ed...

白鹭科技
10/09
730
0
Unity如何同时打开多个项目

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

NoDieThinking
05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【转载】缓存穿透,缓存击穿,缓存雪崩解决方案分析

前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑...

xiaomin0322
7分钟前
0
0
Maven: Non-resolvable import POM:Failure to find *** in *** was cached in the local repository.

clean or package spring cloud 项目时,IDE 打印如下报错: Non-resolvable import POM: Failure to find org.springframework.cloud:spring-cloud-dependencies:pom:Greenwich.M3 in https......

AmosWang
11分钟前
0
0
性能优化(性能优化概述)

软件系统质量特性 安全性 同时兼顾向合法用户提供服务,以及阻止非授权使用软件及资源的能力。 健壮、可靠 软件系统在一定的时间内无故障运行的能力、容错能力、恢复能力 。 可用性、易用性、...

这很耳东先生
15分钟前
0
0
ZooKeeper命令大全

创建节点 # 创建节点,-s表示顺序节点,-e表示临时节点,默认是持久节点create [-s] [-e] path data acl # 示例create /zk-book 123 查看节点 ls path [watch] # 示例ls /zk-book 获取...

爱宝贝丶
25分钟前
2
0
Elasticsearch节点角色类型node.master和node.data说明s

一般地,ElasticSearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。这些功能是由两个属性控制的(node.master和node.data)。默认情况下这两个属性的值都是tru...

傲娇字符
41分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部