zoukankan      html  css  js  c++  java
  • Unity Editor 工具开发 (三)——数据存储工具 -1

    Unity EditorTool Dev Tutorial(三)——数据存储工具

    最近,公司项目新开,要笔者写一些给策划用的工具,对Unity有了解的朋友肯定知道Unity的插件工具是十分丰富的,提供的API能让开发者自定义工具。于是作为小白的笔者,也一股脑扎进了工具开发的漩涡中。发现关于Editor的基础教程,在国内非常少,于是,笔者便有了记录学习Editor的想法。本文将持续记录笔者从零搭建工具的所见所闻。

    前言

    笔者也是在学习Editor中,写下的这篇记录,若有对该工具的感兴趣,笔者在Github上更新这个项目,一套正在开发的工具。Ps:没写Readme的

    章节介绍

    承接上一章,确立目标,是建立一个数据存储工具,一个类似数据库的工具。

    1. 完成品介绍

    样例图如下:

    1. 主界面

    1. 新建表单

    1. 数据字段增删改查

    1. 文件读取/保存

    实现这个工具主要涉及四个方面的Unity知识:
    a. GUI的界面布局
    b. Unity的Asset 可持久保存文件
    c. 数据的序列化与反序列化(自定义其方式)
    d. 一些Unity提供的控件功能接口(Utilities)

    这其中前两项最为基础,本篇主要介绍界面布局,其他的在后续章节中介绍。

    2. UI绘制元素

    在UGUI还没有集成的时候,Unity的原生UI是靠GUI/GUILayout 来实现的,这两个工具类,不像NGUI和UGUI一样,可视化较差。效果基本都是靠代码一行一行码出来的。虽然操作上比较繁琐,但是功能还是较为完善的。此外针对Editor编程,是无法UGUI和NGUI的。

    在原生UI的绘制类上,Unity提供了四种:GUI/GUILayout 和EditorGUI/EditorGUILayout。
    前两者,在UnityEngine库中,后两者在UnityEditor库中
    因此在游戏运行时,前两种可用于绘制游戏UI,而后两者只能在Unity编辑器中显示
    Editor的绘制类可看作是GUI的绘制类的引申,使得其更适合用于绘制工具,比如GUI上只有Text输入框的绘制,而Editor的绘制工具,具有IntField/FLoatField等,区分更加细致。
    因此推荐在GUI没有你想绘制的元素种类时,可以在EditorGUI上找找。
    Layout 与 不带Layout 之间的方法几乎是一致的,如EditorGUI和EditorGUILayout,可绘制的内容没有区别,但是Layout提供了简单的 位置/长宽/相对位置的处理方法,而GUI和EditorGUI,需要额外提供一个Rect 参数
    总结:Layout在位置没有特殊要求时,速度较快,因为另外的绘制要输入一个Rect描述元素的坐标和尺寸。

    3. 常用绘制函数

    只有函数名的默认四个类皆具备该函数。

    • Label -------- 显示标签

    • TextField/TextArea -------- 文本输入框,TextField为单行,TextArea为多行。但实际上通过修改GUIStyle,TextField也能多行,参数为文本框显示值,返回值为设置值。

    • Button -------- 按钮。该函数有返回值,当按钮按下时返回True,未按下返回False

    • GUILayout.Width(float x)/GUILayout.Height(float) -------- 设置UI元素的长宽。GUI的可变数目参数。如对默认的长宽不满意,或者想要固定大小,可使用。

    c#
    private string text //如要正常使用文本框,请切记不能使用局部变量保存文本。
    OnGUI(){
    text=GUILayout.TextField(text,GUILayout.width(80));
    }

    
    - GUILayout.BeginHorizontal/GUILayout.EndHorizontal 及GUILayout.BeginVertical/GUILayout.EndVertical -------- 控制UI元素在一行,或者在一列。(默认一个UI元素独占一行,使用Layout绘制的)
    ```c#```
    OnGUI(){
    	GUILayout.BeginHorizontal();	//在两者之间,及保持一行排版。切记有Begin 必须对应有End。否则会出错。也不要给这种函数加IF/ELse的逻辑
    	GUILayout.Label("1");
    	GUILayout.Label("2");
    	GUILayout.Label("3");
    	GUILayout.Label("4");
    	GUILayout.EndHorizontal();
    }
    

    TO Be Continue Soon!

  • 相关阅读:
    js Object.freeze()
    js Object.seal()
    js数字千分位,三种写法,,拿走。。。
    nodejs mongoose连接mongodb报错,command find requires authentication
    nodejs express 服务代理
    容器监控之cadvisor
    kubernetes 集群卸载清理
    解决目录太大-建立软链接
    与运算(&)、或运算(|)、异或运算(^)
    jpa中将查询的字段返回为Map键值对类型
  • 原文地址:https://www.cnblogs.com/EffectL/p/7783053.html
Copyright © 2011-2022 走看看