Получить поплавок из класса в SerializedProperty - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь начать использовать объекты, которые можно отсканировать, как описано в в этом выступлении .Вот мой код:

Вот мой FloatVariable:

using UnityEngine;

[CreateAssetMenu]
public class FloatVariable : ScriptableObject
{
    public float value;
}

Вот мой FloatReference:

using UnityEngine;
using System;

[Serializable]
public class FloatReference
{
    public bool use_constant = true;
    public float constant_value;
    public FloatVariable variable_value;

    public float v
    {
        get
        {
            return use_constant ? constant_value : variable_value.value;
        }
        set
        {
            if (use_constant) throw new Exception("Cannot assign constant_value");
            else variable_value.value = value;
        }
    }
}

Вот мой GameplayManager, где у меня есть один FloatReferenceзначение:

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEditor;
using System;


public class GameplayManager : MonoBehaviour
{
    public FloatReference pl_orb_mode;
}

Вот мой GameplayManagerEditor, где я пытаюсь получить float из FloatVariable класс:

using UnityEngine;
using UnityEditor;
using System;

[CustomEditor(typeof(GameplayManager))]
public class GameplayManagerEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        SerializedProperty pl_orb_mode = serializedObject.FindProperty("pl_orb_mode");
        SerializedProperty variable = pl_orb_mode.FindPropertyRelative("variable_value");
        SerializedProperty the_value = variable.FindPropertyRelative("value");

        float test = the_value.floatValue;
        Debug.Log(test);
    }

}

Когда я пытаюсь получить свой float test = the_value.floatValue; Iполучить ошибку:

NullReferenceException: Object reference not set to an instance of an object
GameplayManagerEditor.OnInspectorGUI () (at Assets/Shared/Scripts/Editor/GameplayManagerEditor.cs:18)

Таким образом, я могу получить класс FloatVariable variable как SerializedProperty, но не могу получить его свойство value. Почему это так и как заставить это работать?

1 Ответ

1 голос
/ 07 апреля 2019

Поскольку FloatVariable наследуется от ScriptableObject, переменная_значение становится ссылкой, а не свойством в SerializedObject.

У вас есть 2 варианта выбора.

Не используйте ScriptableObject:

[Serializable]
public class FloatVariable
{
    public float value;
}

Или отредактируйте ссылочный объект:

var so = new SerializedObject(((GameplayManager)target).pl_orb_mode.variable_value);
var the_value = so.FindPropertyRelative("value");
...
so.ApplyModifiedProperties();

Обратите внимание, что второй способ, поскольку FloatVariable является ссылочным объектом, изменение в нем изменит все другие объекты, которые на него ссылаются.

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