我想为Unity创建一个自定义编辑器,并在列表内创建一个列表,并允许动态编辑大小,并在第二个列表内创建一个弹出窗口。
这是我想要的几个例子:
问题是我无法更改第二个列表的大小,因为它更改了第二个列表中所有元素的大小,因此我无法为列表中的每个元素设置不同的大小。
同样,我对弹出窗口也有同样的问题,所有弹出窗口都选择相同的项目(如您在第二张图片中所见)。
如何保存选择的每个项目的每个尺寸或弹出窗口而不更改其他项目?
这是我的代码:
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] 删除。
我来说两句