利用EditorWindow配制序列化数据表格

简介:

程序开发中需要连接网络或在程序外部进行配制的数据,一般不保存在unity自身序列化的文件中。但一些固定的数据类型,利用unity3d自身的序列化功能,配合Editor编程可以方便快速的制作可扩展的数据加载模块,需要更换数据源也变得十分便利。本文就一个比较复杂的可序列化类,利用Editor窗口编程,实现数据的快速配制。

一、数据模型

1、准备一个数据类DataItem,需要为类添加Serializable属性,这样可以利用unity3d的序列化功能记录到文件中
[Serializable]
public class DataItem
{
    public string name;
    public List<float> values;
    public string unitName;

    #region graph
    public bool graph = true;
    public string graphName;
    public float axisMin;
    public float axisMax;
    public float axisSize;
    #endregion
}

2、还是使用一个更加复杂的类,上面的一个类直接在面版上进行编辑就好了,没有必要使用EditorWindow到重新写一遍显示(其实也是因为实际项目用到这样一个复杂的类,顺便不用重新写一个新的)

[Serializable]
public class DataList
{
    public string name;
    public DataItem key;
    public List<DataItem> values;
}

3、写一个可序列化的对象,并且添加创建菜单(同时这个对象创建出来后在Inspactor面版上所显示的数据变得异常复杂)
[CreateAssetMenu(fileName = "LoadForceDataObject.asset", menuName = "生成/加载数据")]
public class LoadForceDataObject : ScriptableObject {
    public List<DataList> dataList;
}
4、在Inspactor面版上的显示效果如下,显然在这样的面版中进行数据配制十分困难(还只设置了一个DataList和其中一个Key,,,)

二、设计人性化的配制面版

1、分析数据类型

     在窗口界面中应该有一个放置数据源的输入框,在有数据的情况下可以显示一个大的可缩放的可视化区域,这其中每一个DataList对象显示为一个小的固定大小的区域,在其中至少有一个固定的DataItem作为Key,DataItem中其中的Values不想一个一个填写,要求可以进行对一个串以符号分割的字符串进行split,自动加载到其中去。

2、绘制草图

    按以上的思路进行设计,可以做出以下的草图

三、实现细节

1、建立窗口类,并实现窗口打开。按如下脚本可以实现一个editor模式下的指定大小的小窗口
public class DataTableWindow : EditorWindow
{

    [MenuItem("Window/DataTable")]
    static void CreateWindow()
    {
        EditorWindow window = EditorWindow.GetWindow<DataTableWindow>("数据配制", true);
        window.position = new Rect(200, 300, 600, 400);
        window.maxSize = new Vector2(600, 400);
    }
}

2、绘制数据源,实现效果如下图所示

  void DrawHead()
    {
        using (var scope = new EditorGUILayout.HorizontalScope())
        {
            GUI.Box(scope.rect, new GUIContent());
            EditorGUILayout.SelectableLabel("数据源", LayoutOption.shortWidth);
            dataObj = EditorGUILayout.ObjectField(dataObj, typeof(LoadForceDataObject), false, LayoutOption.longWidth) as LoadForceDataObject;
        }
    }

3、绘制一个List添加功能按扭, 输入框内放入创建的asset格式的数据源后,开始是没有数据的,因此需要一个按扭来创建一个DataList是没有数据的,因此需要一个按扭来创建一个DataList 并加入到这个对象中,效果如下图所示。使用HorizontalScope这不必要,主要是考虑到还有一些其他的操作功能也可以加入到其中

  void DrawListsTools()
    {
        using (var scope = new EditorGUILayout.HorizontalScope())
        {
            GUI.backgroundColor = Color.blue;
            if (GUILayout.Button("+", LayoutOption.shortWidth))
            {
                dataLists.Add(new DataList());
            }
            GUI.backgroundColor = Color.white;

        }
    }

4、绘制可滑动的实体区域,bodyScorll 是一个全局变量,用来保存当前的滑动所处的状态。dataLists是数据源对象所包含的所有DataList,在这其中将绘制的功能再次分为绘制DataList的标题头和数据体。

  void DrawBody()
    {
        using (var scope = new EditorGUILayout.ScrollViewScope(bodyScorll))
        {
            bodyScorll = scope.scrollPosition;
            foreach (var item in dataLists)
            {
                using (var vscope = new EditorGUILayout.VerticalScope())
                {
                    GUI.Box(vscope.rect, new GUIContent());
                    if (DrawListHeader(item))
                    {
                        DrawListBody(item);
                        GUILayout.Space(EditorGUIUtility.singleLineHeight);
                    }
                    else
                    {
                        continue;
                    }
                }
            }
            if (waitDeleteList != null)
            {
                dataLists.Remove(waitDeleteList);
            }
        }
    }

带有返回值的LitstHeader绘制可以实现数据体的展开和隐藏

 bool DrawListHeader(DataList list)
    {
        using (var scope = new EditorGUILayout.HorizontalScope())
        {
            if (!viewDic.ContainsKey(list))
            {
                viewDic.Add(list, true);
            }
            if (viewDic[list] = GUILayout.Toggle(viewDic[list], list.name,LayoutOption.mediaHigh))
            {
                GUI.backgroundColor = Color.green;
                GUI.Box(scope.rect, "");
                GUI.backgroundColor = Color.white;
                EditorGUILayout.LabelField("ListName", LayoutOption.longWidth);
                list.name = EditorGUILayout.TextField(list.name, LayoutOption.longWidth);
                list.values = list.values ?? new List<DataItem>();

                GUI.backgroundColor = Color.blue;
                if (GUILayout.Button("+", LayoutOption.minWidth))
                {
                    list.values.Add(new DataItem());
                }
               
                GUI.backgroundColor = Color.white;
                return true;
            }
            else
            {
                GUI.backgroundColor = Color.red;
                if (GUILayout.Button("-", LayoutOption.minWidth))
                {
                    waitDeleteList = list;
                }
                GUI.backgroundColor = Color.white;
                return false;
            }
        }
    }

5、其他细节就没有太多了,github地址为:https://github.com/zouhunter/Editor_Extends(后续有相关的编辑器学习使用的脚本会同步到其中)

四、最终截图:(在这样的环境进行配制貌似省心了不少吧)


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop是一个开源的分布式计算系统,用于处理大规模数据集的分布式存储和处理。下面是Hadoop的安装步骤: 1. 下载Hadoop:你可以从Apache官方网站上下载Hadoop的最新版本。选择合适的版本和文件类型进行下载。 2. 解压Hadoop压缩包:将下载的压缩包解压到你想要安装Hadoop的路径下。 3. 配置环境变量:编辑你的环境变量文件(如.bashrc或.profile),将Hadoop的bin目录添加到PATH变量中。例如,在.bashrc文件中添加以下行: export HADOOP_HOME=/path/to/hadoop export PATH=$PATH:$HADOOP_HOME/bin 保存文件后,运行以下命令使其生效: source ~/.bashrc 4. 配置Hadoop:进入Hadoop的安装目录,在conf目录下找到core-site.xml、hdfs-site.xml、mapred-site.xml和yarn-site.xml这四个配置文件,进行必要的配置。主要配置项包括文件系统的URI、数据存储路径、任务调度器等。 5. 设置SSH无密码登录:Hadoop使用SSH来管理集群节点之间的通信,因此需要设置SSH无密码登录。确保你可以通过SSH无密码登录到本地和所有集群节点。 6. 格式化HDFS文件系统:在Hadoop安装目录下执行以下命令,格式化HDFS文件系统: hdfs namenode -format 7. 启动Hadoop集群:执行以下命令启动Hadoop集群: start-dfs.sh # 启动HDFS start-yarn.sh # 启动YARN 执行以上命令后,你可以通过Web界面访问Hadoop的各个组件。 以上是基本的Hadoop安装步骤,请根据自己的需求进行相应的配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值