Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在检查器中隐藏继承的公共变量?_C#_Unity3d_Attributes - Fatal编程技术网

C# 如何在检查器中隐藏继承的公共变量?

C# 如何在检查器中隐藏继承的公共变量?,c#,unity3d,attributes,C#,Unity3d,Attributes,我有两个类A和B,类B继承自类A 假设类A有一个名为Lives的公共int变量,由于类B继承自类A,因此该变量(Lives)将显示在检查器中 我想在inspector中对B类隐藏变量(Lives)。很多人告诉我,只需使用[SerializeField]属性将变量(Lives)设为私有,但这对我来说不起作用,因为在很多情况下,当我使用Class A时,我仍然希望从不同的脚本(例如GameManager脚本)访问该变量 不管怎样,我能做到吗?我能看到的最接近的答案就是这个链接。“查找最后一条注释”。

我有两个类A和B,类B继承自类A

假设类A有一个名为Lives的公共int变量,由于类B继承自类A,因此该变量(Lives)将显示在检查器中

我想在inspector中对B类隐藏变量(Lives)。很多人告诉我,只需使用
[SerializeField]
属性将变量(Lives)设为私有,但这对我来说不起作用,因为在很多情况下,当我使用Class A时,我仍然希望从不同的脚本(例如
GameManager
脚本)访问该变量


不管怎样,我能做到吗?我能看到的最接近的答案就是这个链接。“查找最后一条注释”。

我不认为可以通过任何简单的方法隐藏从基类继承的变量。如果确实希望属性只显示在基本检查器中,而隐藏在继承的类检查器中,则可能需要编写自定义检查器。我冒昧地编写了一个编辑器脚本,允许您按名称隐藏inspector中的属性

要将其应用于您自己的检查器面板,您可以使用我创建的helper类

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System;

public static class EditorHelper
{
    public static List<SerializedProperty> GetExposedProperties(SerializedObject so, IEnumerable<string> namesToHide = null)
    {
        if (namesToHide == null) namesToHide = new string[] { };
        IEnumerable<FieldInfo> componentFields = so.targetObject.GetType().GetFields();
        List<SerializedProperty> exposedFields = new List<SerializedProperty>();

        foreach (FieldInfo info in componentFields)
        {
            bool displayInInspector = info.IsPublic && !Attribute.IsDefined(info, typeof(HideInInspector));
            displayInInspector = displayInInspector || (info.IsPrivate && Attribute.IsDefined(info, typeof(SerializeField)));
            displayInInspector = displayInInspector && !namesToHide.Contains(info.Name);

            if (displayInInspector){
                SerializedProperty prop = so.FindProperty(info.Name);
                if(prop != null)
                    exposedFields.Add(prop);
            }
        }

        return exposedFields;
    }
}
使用UnityEngine;
使用UnityEditor;
使用System.Collections.Generic;
使用System.Linq;
运用系统反思;
使用制度;
公共静态类EditorHelper
{
公共静态列表GetExposedProperties(SerializedObject so,IEnumerable namesToHide=null)
{
如果(namesToHide==null)namesToHide=newstring[]{};
IEnumerable componentFields=so.targetObject.GetType().GetFields();
List exposedFields=new List();
foreach(组件字段中的字段信息)
{
bool displayinspector=info.IsPublic&&!Attribute.IsDefined(info,typeof(hideininsect));
displayinspector=displayinspector | |(info.IsPrivate&&Attribute.IsDefined(info,typeof(SerializeField));
displayinspector=displayinspector&!namesToHide.Contains(info.Name);
如果(显示Inspector){
SerializedProperty prop=so.FindProperty(info.Name);
如果(prop!=null)
exposedFields.Add(prop);
}
}
返回暴露字段;
}
}
然后在unity项目中创建一个名为“编辑器”的文件夹,并将此脚本放在其中。您需要做的唯一更改是将“MyCustomScript”更改为类的名称。然后在OnEnable方法中修改隐藏属性列表,以包含所有要隐藏的属性的名称

using UnityEditor;
using System.Collections.Generic;


[CustomEditor(typeof(MyCustomScript))]
public class MyCustomScriptEditor : Editor
{
    private List<SerializedProperty> properties;

    private void OnEnable()
    {
        string[] hiddenProperties = new string[]{"SomeString2"}; //fields you do not want to show go here
        properties = EditorHelper.GetExposedProperties(this.serializedObject,hiddenProperties);
    }

    public override void OnInspectorGUI()
    {
        //base.OnInspectorGUI(); - (standard way to draw base inspector)

        //We draw only the properties we want to display here
        foreach (SerializedProperty property in properties)
        {
            EditorGUILayout.PropertyField(property,true);
        }
        serializedObject.ApplyModifiedProperties();
    }
}
使用UnityEditor;
使用System.Collections.Generic;
[CustomEditor(typeof(MyCustomScript))]
公共类MyCustomScriptEditor:编辑器
{
私有财产清单;
私有void OnEnable()
{
string[]hiddenProperties=newstring[]{“SomeString2”};//不想显示的字段转到此处
properties=EditorHelper.GetExposedProperties(this.serializedObject,hiddenProperties);
}
公共覆盖无效OnInspectorGUI()
{
//base.OnInspectorGUI();-(绘制基础检查器的标准方法)
//我们只绘制要在此处显示的属性
foreach(属性中的SerializedProperty属性)
{
EditorGUILayout.PropertyField(property,true);
}
serializedObject.ApplyModifiedProperties();
}
}

希望这有帮助。

如果装配结构支持这一点,那么您要找的机器人可能就是internal?或者你担心他们会覆盖/隐藏变量?如果是这样,密封它可以关闭它。现在还不清楚你为什么想要这个。听起来好像你遇到了XY问题,隐藏变量就是你的Y。你也可以将它更改为公共属性。据我记忆所及,公共属性并没有出现在InspectorBank you中,因为这个伟大的答案,但我从问题中的链接复制了代码,它工作得很好。我怎样才能学会这些东西?海关检查员?财产抽屉?我找不到关于这些话题的可靠来源!我真的很想学。很高兴听到。是的,编辑器脚本的文档有点分散。我通过在youtube上观看Unite的演示和阅读Unity手册学习了很长一段时间。如果您感兴趣的话,这里有一个连接到一个对话:作为一个替代方案,您可能需要考虑学习UIOnEngices,新的UI框架Unity正在切换到。很多功能都在预览中,但总体来说,构建自定义UI似乎更容易。它似乎简单得多,相同的UI可以在游戏中或inspector中使用。