Unity-如何创建自定义编辑器以动态更改另一个具有自定义大小的列表中列表的大小?

Wyrncael

我想为Unity创建一个自定义编辑器,并在列表内创建一个列表,并允许动态编辑大小,并在第二个列表内创建一个弹出窗口。

这是我想要的几个例子:

例子1

例子2

问题是我无法更改第二个列表的大小,因为它更改了第二个列表中所有元素的大小,因此我无法为列表中的每个元素设置不同的大小。

同样,我对弹出窗口也有同样的问题,所有弹出窗口都选择相同的项目(如您在第二张图片中所见)。

如何保存选择的每个项目的每个尺寸或弹出窗口而不更改其他项目?

这是我的代码:

ScriptableObject类

public class MyClass : ScriptableObject {

public class MyInsideClass
{
    public List<string> data;

    public MyInsideClass()
    {
        data = new List<string>();
    }
}

public List<MyInsideClass> allData;
}

自定义编辑器(数据库仅具有弹出列表名称)

[CustomEditor(typeof(MyClass))]
public class TempEdior : Editor
{
    int numberOfCombinations = 0;
    int numberOfDataForCombination = 0;
    int selected = 0;

    public override void OnInspectorGUI()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label("Number of combinations:");
        numberOfCombinations =         EditorGUILayout.IntField(numberOfCombinations);
        GUILayout.EndHorizontal();

        for (int i = 0; i < numberOfCombinations; i++)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label("Combination " + (i + 1) + " - number of data:");
            numberOfDataForCombination =     EditorGUILayout.IntField(numberOfDataForCombination);
            GUILayout.EndHorizontal();

            for (int j = 0; j < numberOfDataForCombination; j++)
            {
                Rect rect = EditorGUILayout.GetControlRect();
                selected = EditorGUI.Popup(new Rect(rect.x + 63, rect.y, 100, EditorGUIUtility.singleLineHeight), selected,     Database.Instance.slotTypes.ToArray());
            }
        }
    }
}
本布鲁

海事组织,您正在以错误的方式来处理这个问题。容易永远浪费编写检查器代码的方式,以令人费解的方式破坏了Unity的范例,却收效甚微。尽可能多地依赖SerializedProperties,因为它将处理撤消,多编辑等操作。

基本上,您只需要使用弹出窗口来编辑字符串,对吗?然后,只需为此使用PropertyDrawer,其余的只需让Unity的数组检查器发挥作用即可:在此处输入图片说明

using System;
using UnityEditor;
using UnityEngine;

public class TestArrayOfArray : MonoBehaviour
{
    [Serializable]
    public struct ComboItem
    {
        public string value;
    }

    [Serializable]
    public struct Combo
    {
        public ComboItem[] items;
    }

    public Combo[] combos;
}

[CustomPropertyDrawer(typeof(TestArrayOfArray.ComboItem))]
public class ComboItemDrawer : PropertyDrawer
{
    static readonly string[] comboItemDatabase = { "Bla", "Bli", "Blu" };
    static readonly GUIContent[] comboItemDatabaseGUIContents = Array.ConvertAll(comboItemDatabase, i => new GUIContent(i));

    public override void OnGUI( Rect position, SerializedProperty property, GUIContent label )
    {
        property = property.FindPropertyRelative("value");

        EditorGUI.BeginChangeCheck();
        int selectedIndex = Array.IndexOf(comboItemDatabase, property.stringValue);
        selectedIndex = EditorGUI.Popup(position, label, selectedIndex, comboItemDatabaseGUIContents);
        if (EditorGUI.EndChangeCheck())
        {
            property.stringValue = comboItemDatabase[selectedIndex];
        }
    }
}

这是非常粗糙的,在单个文件中的运行时+检查程序代码,硬编码为静态数组的伪造“数据库”,在进行多次编辑的情况下不处理混合值等,但这应该可以帮助您入门。

-

一般建议:如果可以的话,最好使用数组而不是列表,例如,在这种情况下,组合是静态序列化数据,您永远不会在运行时调整大小,因此数组效率更高。

内联字段声明(可能的话),以提高可读性public List<string> data = new List<string>();

不要初始化序列化的数组/列表,因为它们的默认值会被反序列化覆盖,从而导致分配浪费。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用自定义检查器扩展Unity UI组件

将动态创建的下拉列表的自定义属性值添加到另一个元素

Unity:如何将未知脚本动态附加到GameObject(自定义编辑器)

Unity自定义编辑器GUI

在Unity中自动添加脚本自定义编辑器的快捷方式

如何创建可折叠的汉堡菜单图标自定义检查器/编辑器Unity

Unity自定义检查器,允许选择的子对象

开始游戏时,Unity3D值从自定义编辑器中消失

创建自定义Unity Inspector布局

Unity中的自定义编辑器继承

Unity-检查器中结构的自定义绘图

创建类似Game Creator的工具| Unity编辑器自定义

Unity:ScriptableObject的自定义检查器不起作用

具有动态枚举字段的自定义Unity C#脚本编辑器

Unity中的自定义日期和时间

Android自定义编辑文本值被另一个自定义编辑文本更改

如何在Unity3d自定义编辑器窗口中为垂直GUILayout添加背景图像

创建自定义地形编辑器(Unity C#)时出错

如何在具有碰撞检测功能的Unity中制作自定义2D多边形?

Unity vs自定义依赖注入?

Unity在自定义编辑器面板中动态限制滑块

为Unity制作一个自定义的Skybox

在Unity自定义检查器中设置枚举控件

无法在Unity中的自定义着色器中设置动画或更改颜色?

自定义形状按钮 Unity UI

Unity 自定义编辑器预制件显示修改后的值

Unity - 自定义编辑器 - 数据刷新

Unity 自定义编辑器 Raycast 在实例化对象后无法立即工作

在Unity中,通过编辑器删除另一个组件时如何通过脚本删除一个组件?