雪千渔Blog

  • 首页
  • 写写代码
    • dotNet
    • C++
    • Lua
    • Visual Basic
    • Java
    • Android
    • Web
  • DCC
    • Maya
    • Maya-Plug
    • AfterEffect
    • AfterEffect-Plug
    • PhotoShop-Plug
  • 游戏制作
    • Unity3D
    • UnrealEngine
    • 经验杂谈
    • 游戏设计
    • 自研引擎
    • 效果实现
  • 其他
    • 乱七八糟
    • 软件工具
    • 留言板
    • 自制素材
    • 关于我
雪千渔blog
唯有热爱,能抵漫长岁月
  1. 首页
  2. GameDev
  3. Unity3D
  4. 正文

在EditorWindow上显示自定义类型列表

2019年8月13日 16056点热度 16人点赞 0条评论

在inspector中我们很容易就可以对字段进行显示,只需要把字段修饰为public即可,而private的只需要在字段前加一个[SerializeField]就可以在面板显示,自定义类型则需要在类上添加[System.Serializable]属性进行序列化也可以在面板上进行显示。

在EditorWindow中,EditorGuiLayout没有可以显示List的方法,可以使用foreach循环使用EditorGUILayout.ObjectField来显示,不过这样就没办法显示自定义类型了,这里还是使用对List进行序列化显示。

EditorGUILayout.PropertyField可以显示序列化字段

这个序列化字段(SerializedProperty)由SerializedObject.FindProperty获取

在OnGUI事件中使用EditorGUILayout.PropertyField(SerializedProperty property,  bool includeChildren); 来显示自定义类tObj,同时tObj类也需要标记属性为[Serializable]

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System;


public class TestEditor : EditorWindow
{
    [MenuItem("Tools/test")]
    public static void ShowWindow()
    {
        TestEditor win = GetWindow<TestEditor>("TestWindow");
        win.Show();
    }

    [SerializeField]
    private List<tObj> tObjList = new List<tObj>();

    private SerializedObject serObj;
    private SerializedProperty serPty;


    private void OnEnable()
    {
        serObj = new SerializedObject(this);
        serPty = serObj.FindProperty("tObjList");
        tObjList.Add(new tObj("asd", null));
    }

    private void OnGUI()
    {
        serObj.Update();
        EditorGUI.BeginChangeCheck();
        EditorGUILayout.PropertyField(serPty, true);
        if (EditorGUI.EndChangeCheck())
        {
            serObj.ApplyModifiedProperties();
        }
    }

    [Serializable]
    public class tObj
    {
        public string str;
        public UnityEngine.Object obj;
        public tObj(string str, UnityEngine.Object obj)
        {
            this.str = str;
            this.obj = obj;
        }
    }
}

同时这个tObj中,如果第一个字段为string类型的话,那么这个字段同时也会显示在列表元素名称上,列表元素原名为Element index
    [Serializable]
    public class tObj
    {
        public string str;
        public UnityEngine.Object obj;
        public tObj(string str, UnityEngine.Object obj)
        {
            this.str = str;
            this.obj = obj;
        }
    }

效果图

ueditor-clst.jpg

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: EditorWindow Unity UnityEditor
最后更新:2021年8月17日

JomiXedYu

IndieGame Developer & Netease Games TechArt

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

JomiXedYu

IndieGame Developer & Netease Games TechArt

最新 热点 随机
最新 热点 随机
UE材质Custom节点与HLSL的HACK操作 UE5出现D3D12崩溃报错解决方案 游戏引擎脚本绑定的三种写法与利弊 一种解决不支持中文与空格文件名的编码 Vulkan坐标系通用方案以及反转viewport UE编辑器开发之蓝图篇
一种解决不支持中文与空格文件名的编码游戏引擎脚本绑定的三种写法与利弊UE5出现D3D12崩溃报错解决方案UE材质Custom节点与HLSL的HACK操作
[程序开发文档]ColorUpdate自动更新组件 C++字符串编码与编译器实现 在Unity中多个脚本的Awake、OnEnable的执行顺序问题。 UE材质Custom节点与HLSL的HACK操作 Visual Basic6 网游登录器样式窗体 C++轻量级对象系统、托管指针、反射库
友情链接
  • DorinXL
  • 小博博客
  • 秋橘斋

COPYRIGHT © 2014-2023 雪千渔Blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

辽ICP备20006894号-1