Получить поплавок из класса в SerializedProperty

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

Вот мой 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;, я получаю сообщение об ошибке:

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. Почему так и как заставить это работать?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
687
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку FloatVariable наследуется от ScriptableObject, значение variable_value становится ссылкой, а не свойством в 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 является ссылочным объектом, изменение в нем изменит все другие объекты, которые на него ссылаются.

Вы говорите о это свойство? Или, говоря свойство, вы имеете в виду член? А что такое ссылка члены в c#? Я не слышал о них.

Ruslan Plastun 07.04.2019 14:30

Также, я пытаюсь реализовать это так: var so = new SerializedObject(((FloatReference)pl_orb_mode).variable_valu‌​e); и это не работает.

Ruslan Plastun 07.04.2019 14:34

Дело не в С#, а в работе по сериализации единства. Я сказал property означает SerializedProperty.

shingo 07.04.2019 16:28

У меня есть ошибка в моем ответе, и теперь я ее исправил, пожалуйста, проверьте еще раз.

shingo 07.04.2019 16:32

Другие вопросы по теме