【发布时间】:2022-10-23 14:45:26
【问题描述】:
我如何编码,以便人们无法从检查器中添加/删除列表元素,但仍然能够看到元素?
就像是
[ReadOnlyField, NonReorderable]public List<CustomType> CustomTypeList = new();
【问题讨论】:
我如何编码,以便人们无法从检查器中添加/删除列表元素,但仍然能够看到元素?
就像是
[ReadOnlyField, NonReorderable]public List<CustomType> CustomTypeList = new();
【问题讨论】:
当然,您可以使用 OnValidate 破解解决方案,如 here 所述。一般流程是在启用对象时读取项目列表并将其存储在辅助数组中。当调用 OnValidate 时,如果 Inspector 中可见的列表与 peivate 列表不匹配,则用私有项覆盖可见列表中的元素。请注意,您不能只将一个 List 对象分配给另一个。这不会复制一个列表,它只会让两个变量指向同一个列表。所以,答案是肯定的,是可以做到的。
现在,问我这是不是个好主意。答案是,不,我看不出有什么好的理由。例如,如果您担心设计师会弄乱您的项目列表,那么要么将这些项目移动到设计师被告知不要触摸的其他地方,对项目进行硬编码,或者在需要时实例化它们。
【讨论】:
这是不可能的。也许您可以尝试创建一个自定义编辑器脚本只是为了在检查器中显示它们。
【讨论】:
您可以为此使用自定义编辑器,这是一个示例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class Example : MonoBehaviour
{
[System.Serializable]
public class Item
{
public int a;
public string b;
public Vector2 v;
}
public List<Item> listArrayA = new() { new Item(), new Item() };
public List<Item> listArrayB = new() { new Item(), new Item() };
public Item itemA;
#if UNITY_EDITOR
[CustomEditor(typeof(Example))]
public class ExampleEditor : Editor
{
private string[] disableProperties = new string[] { "listArrayB", "itemA" };
public override void OnInspectorGUI()
{
DrawPropertiesExcluding(serializedObject, this.disableProperties);
EditorGUI.BeginDisabledGroup(true);
for (var i = 0; i < this.disableProperties.Length; i++)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty(this.disableProperties[i]));
}
EditorGUI.EndDisabledGroup();
serializedObject.ApplyModifiedProperties();
}
}
#endif
}
如果您只是想防止其他人编辑您的字段,请将主题设为私有字段,然后创建公共属性以访问主题,可以通过将 Inspector 模式更改为 Debug 来查看它们的值 Change inspector view mode to debug
【讨论】: