Unity Convert SerializedProperty в универсальный - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь создать функцию, которая получает SerializedProperty через строковый путь, а затем преобразует его в универсальный тип и возвращает его.Я перепробовал много решений, и они либо дают исключение нулевого референса или неверного приведения.Я просто понятия не имею, что делать.Так может кто-то быть добрым и помочь мне?Спасибо!Кстати, это функция пока:

T GetObjectProperty<T>(string propertyPath)
{
    SerializedProperty property = serializedObject.FindProperty(propertyPath);



}

1 Ответ

0 голосов
/ 26 мая 2018

К сожалению, не все так просто: Unity - SerializedProperty имеет множество различных свойств, например, intValue, floatValue, boolValue.

Если вы ищете объектссылаясь на то, что название вашей функции звучит для меня, вы, вероятно, после objectReferenceValue.


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

object GetValueByName(Type type, string name)
{
    SerializedProperty property = serializedObject.FindProperty(name);

    if(type == typeof(int))
    {
        return property.intValue;
    } 
    else if(type == typeof(float))
    {
        return property.floatValue;
    }
    //... and so on

}

Когда мне приходилось использовать метод, мне приходилось только анализировать, например,

int someValue = (int)GetValueByName(typeof(int), "XY");

Если вы хотитепридерживайтесь родового метода вместо возврата object и разбора, вы также можете проверить typeof(T) вместо того, чтобы передать его в качестве параметра:

T GetValueByName<T>(string name)
{
    SerializedProperty property = serializedObject.FindProperty(name);

    Type type = typeof(T);
    if(type == typeof(int))
    {
        return property.intValue;
    } 
    else if(type == typeof(float))
    {
        return property.floatValue;
    }
    //... and so on

}

надеюсь, это поможет вам


(пс: если вы предпочитаете использовать switch - case вместо кратного if - else, см. этот ответ )

...