unity3d 不允许在检查器中添加/删除列表元素

xj3cbfub  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(248)

我如何编写代码,使人们不能在检查器中添加/删除列表元素,但仍然能够看到这些元素?
比如

[ReadOnlyField, NonReorderable]public List<CustomType> CustomTypeList = new();
q8l4jmvw

q8l4jmvw1#

当然,您可以使用OnValidate来破解解决方案,如here所述。一般流程是在启用对象时读取项列表,并将其存储在辅助数组中。当调用OnValidate时,如果Inspector中可见的列表与pevate列表不匹配,则用私有项覆盖可见列表中的元素。注意,你不能把一个List对象赋给另一个,这不会复制一个列表,它只会让两个变量指向同一个列表,所以答案是肯定的,这是可以做到的.
现在,问我这是不是一个好主意。答案是,不,我看不出有什么好的理由这样做。如果你担心设计师,例如,搞乱你的项目列表,那么要么把这些项目移到设计师被告知不要接触的地方,硬编码这些项目,或者在需要的时候示例化它们。

v7pvogib

v7pvogib2#

您可以使用自定义编辑器进行此操作,下面是一个示例

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
    }

测试结果

如果您只想防止其他人编辑您的字段,则无需创建自定义编辑器,只需将主题设为私有字段,然后创建公共属性来访问主题,可以通过将检查器模式更改为调试来查看其值将检查器视图模式更改为调试

eaf3rand

eaf3rand3#

这是不可能的。也许你可以尝试创建一个自定编辑器脚本,只是为了在检查器中显示它们。

相关问题