Я пытаюсь начать использовать 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
. Почему так и как заставить это работать?
Поскольку 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 является ссылочным объектом, изменение в нем изменит все другие объекты, которые на него ссылаются.
Также, я пытаюсь реализовать это так: var so = new SerializedObject(((FloatReference)pl_orb_mode).variable_value);
и это не работает.
Дело не в С#, а в работе по сериализации единства. Я сказал property
означает SerializedProperty
.
У меня есть ошибка в моем ответе, и теперь я ее исправил, пожалуйста, проверьте еще раз.
Вы говорите о это свойство? Или, говоря свойство, вы имеете в виду член? А что такое ссылка члены в c#? Я не слышал о них.