因为默认
PropertyField
对于
ScriptableObject
就是你得到的那个:A
UnityEngine.Object
参考字段,如GameObject和Components以及其他资产;)
当然你
可以
实现你想要实现的目标,但这有点复杂
保养不是很好,我不推荐
.
我不知道你
ScriptableObject
所以这里有一个例子
public class ExampleSO : ScriptableObject
{
public int SomeInt;
[SerializeField] private string _someString;
}
和你的
MonoBehaviour
例如
public class Example : MonoBehaviour
{
public List<ExampleSO> _SOList;
}
然后编辑器可能看起来像例如。
using UnityEditor;
using UnityEngine;
using UnityEditorInternal;
[CustomEditor(typeof(Example))]
public class ExampleEditor : Editor
{
SerializedProperty _SOList;
Example _example;
MonoScript _script;
ReorderableList _list;
private void OnEnable()
{
_SOList = serializedObject.FindProperty("_SOList");
_example = (Example) target;
_script = MonoScript.FromMonoBehaviour(_example);
_list = new ReorderableList(serializedObject, _SOList, true, true, true, true)
{
drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, _SOList.displayName),
drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
{
var element = _SOList.GetArrayElementAtIndex(index);
EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, new GUIContent("Reference"));
if (!element.objectReferenceValue) return;
var elementSerializedObject = new SerializedObject(element.objectReferenceValue);
var someInt = elementSerializedObject.FindProperty("SomeInt");
var someString = elementSerializedObject.FindProperty("_someString");
elementSerializedObject.Update();
{
EditorGUI.indentLevel++;
{
rect = EditorGUI.IndentedRect(rect);
rect.y += EditorGUIUtility.singleLineHeight;
EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), someInt);
rect.y += EditorGUIUtility.singleLineHeight;
EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), someString);
}
EditorGUI.indentLevel--;
}
elementSerializedObject.ApplyModifiedProperties();
},
elementHeightCallback = (int index) =>
{
var element = _SOList.GetArrayElementAtIndex(index);
var lines = 1;
if (element.objectReferenceValue) lines += 2;
return lines * EditorGUIUtility.singleLineHeight;
}
};
}
public override void OnInspectorGUI()
{
DrawScriptField();
serializedObject.Update();
{
_list.DoLayoutList();
}
serializedObject.ApplyModifiedProperties();
}
private void DrawScriptField()
{
EditorGUI.BeginDisabledGroup(true);
{
EditorGUILayout.ObjectField("Script", _script, typeof(Example), false);
}
EditorGUI.EndDisabledGroup();
EditorGUILayout.Space();
}
}
这就产生了以下检查员。正如你所看到的,我打开了
MonoBehavior
和的两个实例
ExampleSO
显示如何将值转换为实际实例