Как скрыть унаследованные публичные переменные в инспекторе? - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть 2 класса A и B, класс B наследуется от класса A.

Допустим, у класса A есть открытая переменная int, называемая Lives, а поскольку класс B наследует от класса A эту переменную (Lives)покажет в инспекторе.

Я хочу скрыть переменную (Lives) из класса B в инспекторе. Многие люди говорили мне просто сделать переменную (Lives) приватной с атрибутом [SerializeField], но это не работает для меня, так как во многих случаях я все еще хочу получить доступ к этой переменной из различных сценариев, таких как GameManagerсценарий, когда я использую класс А.

Могу ли я в любом случае сделать это? ближайший ответ, который я вижу, находится по этой ссылке Скрыть публичные переменные . «Ищите последний комментарий».

1 Ответ

1 голос
/ 11 ноября 2019

Я не верю, что вы можете скрыть переменную, унаследованную от базового класса, любым простым способом. Если вы действительно хотите, чтобы свойство отображалось только в базовом инспекторе, но было скрыто в унаследованном инспекторе классов, вам, вероятно, нужно написать собственный инспектор. Я позволил себе написать сценарий редактора, который позволяет скрывать свойства в инспекторе по имени.

Чтобы применить его к своей собственной панели инспектора, вы можете использовать созданный мной вспомогательный класс.

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;
    }
}

Затем в вашем проекте Unity создайте папку с именем «Editor» и поместите в нее этот скрипт. Единственные изменения, которые вам нужно сделать, - это изменить «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();
    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...