Создать новый объект по умолчанию для пользовательского PropertyDrawer - PullRequest
0 голосов
/ 12 февраля 2020

Когда вы создаете новый класс и помечаете его как [System.Serializable], ваш инспектор создаст и покажет свой объект по умолчанию для свойства типа нового класса в компоненте MonoBehaviour.

При создании пользовательского PropertyDrawer, хотя вам необходимо создайте этот объект по умолчанию самостоятельно и поместите его ссылку в SerializedProperty.objectReferenceValue (насколько я понимаю).

Но это поле имеет тип UnityEngine.Object, и мой новый класс не может быть назначен там. Как это побороть? Наследование вашего класса от UnityEngine.Object не помогает, так как SerializedProperty.objectReferenceValue по-прежнему имеет значение null, даже после назначения туда только что созданного объекта (который на самом деле того же типа - UnityEngine.Object).

1 Ответ

1 голос
/ 12 февраля 2020

Надеюсь, я правильно понял ваш вопрос, взятый из документации Unity :

using UnityEngine;

public enum IngredientUnit { Spoon, Cup, Bowl, Piece }

// Custom serializable class
[Serializable]
public class Ingredient
{
    public string name;
    public int amount = 1;
    public IngredientUnit unit;
}

public class Recipe : MonoBehaviour
{
    public Ingredient potionResult;
    public Ingredient[] potionIngredients;
}

[CustomPropertyDrawer(typeof(Ingredient))]
public class IngredientDrawerUIE : PropertyDrawer
{
    public override VisualElement CreatePropertyGUI(SerializedProperty property)
    {
        // Create property container element.
        var container = new VisualElement();

        // Create property fields.
        var amountField = new PropertyField(property.FindPropertyRelative("amount"));
        var unitField = new PropertyField(property.FindPropertyRelative("unit"));
        var nameField = new PropertyField(property.FindPropertyRelative("name"), "Fancy Name");

        // Add fields to the container.
        container.Add(amountField);
        container.Add(unitField);
        container.Add(nameField);

        return container;
    }
}

Так что при просмотре GameObject с компонентом Recipe инспектор Unity будет покажите что-то вроде этого: enter image description here

Так что вам не нужно наследовать от чего-либо, просто пометьте класс, для которого вы хотите создать ящик свойств, как Serializable, и создайте свойство класс выдвижного ящика для него (не забудьте поместить его в папку Editor или создать файл определения сборки, который предназначен для редактора, только если вы работаете с файлами определения сборки).

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