Unity 将序列化属性转换为泛型
Unity Convert SerializedProperty To Generic
我正在尝试创建一个函数,该函数通过字符串路径获取 SerializedProperty,然后将其转换为通用类型,然后 returns。我尝试了很多解决方案,它们要么给出空引用异常,要么给出无效转换。我根本不知道该怎么做。那么有人可以帮助我吗?谢谢!
顺便说一句,这是到目前为止的功能:
T GetObjectProperty<T>(string propertyPath)
{
SerializedProperty property = serializedObject.FindProperty(propertyPath);
}
不幸的是,它并没有那么简单: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)
而不是 ps 将其作为参数:
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
}
希望这个帮助ps你
(ps:如果您更喜欢使用 switch
-case
而不是多个 if
-else
,请参考 this answer )
我正在尝试创建一个函数,该函数通过字符串路径获取 SerializedProperty,然后将其转换为通用类型,然后 returns。我尝试了很多解决方案,它们要么给出空引用异常,要么给出无效转换。我根本不知道该怎么做。那么有人可以帮助我吗?谢谢! 顺便说一句,这是到目前为止的功能:
T GetObjectProperty<T>(string propertyPath)
{
SerializedProperty property = serializedObject.FindProperty(propertyPath);
}
不幸的是,它并没有那么简单: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)
而不是 ps 将其作为参数:
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
}
希望这个帮助ps你
(ps:如果您更喜欢使用 switch
-case
而不是多个 if
-else
,请参考 this answer )