103 lines
3.5 KiB
C#
103 lines
3.5 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEditor;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
public static class SerializedPropertyUtility
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取SerializedProperty的值(返回object类型)
|
|||
|
|
/// </summary>
|
|||
|
|
public static object GetPropertyValue(SerializedProperty property)
|
|||
|
|
{
|
|||
|
|
if (property == null) return null;
|
|||
|
|
|
|||
|
|
switch (property.propertyType)
|
|||
|
|
{
|
|||
|
|
case SerializedPropertyType.Integer:
|
|||
|
|
return property.intValue;
|
|||
|
|
case SerializedPropertyType.Boolean:
|
|||
|
|
return property.boolValue;
|
|||
|
|
case SerializedPropertyType.Float:
|
|||
|
|
return property.floatValue;
|
|||
|
|
case SerializedPropertyType.String:
|
|||
|
|
return property.stringValue;
|
|||
|
|
case SerializedPropertyType.Vector2:
|
|||
|
|
return property.vector2Value;
|
|||
|
|
case SerializedPropertyType.Vector3:
|
|||
|
|
return property.vector3Value;
|
|||
|
|
case SerializedPropertyType.Vector4:
|
|||
|
|
return property.vector4Value;
|
|||
|
|
case SerializedPropertyType.Quaternion:
|
|||
|
|
return property.quaternionValue;
|
|||
|
|
case SerializedPropertyType.Color:
|
|||
|
|
return property.colorValue;
|
|||
|
|
case SerializedPropertyType.ObjectReference:
|
|||
|
|
return property.objectReferenceValue;
|
|||
|
|
case SerializedPropertyType.Enum:
|
|||
|
|
return property.enumValueIndex;
|
|||
|
|
case SerializedPropertyType.Vector2Int:
|
|||
|
|
return property.vector2IntValue;
|
|||
|
|
case SerializedPropertyType.Vector3Int:
|
|||
|
|
return property.vector3IntValue;
|
|||
|
|
case SerializedPropertyType.Rect:
|
|||
|
|
return property.rectValue;
|
|||
|
|
case SerializedPropertyType.RectInt:
|
|||
|
|
return property.rectIntValue;
|
|||
|
|
case SerializedPropertyType.Bounds:
|
|||
|
|
return property.boundsValue;
|
|||
|
|
case SerializedPropertyType.BoundsInt:
|
|||
|
|
return property.boundsIntValue;
|
|||
|
|
case SerializedPropertyType.AnimationCurve:
|
|||
|
|
return property.animationCurveValue;
|
|||
|
|
case SerializedPropertyType.Generic:
|
|||
|
|
default:
|
|||
|
|
// 对于不支持的类型或复杂类型,返回null或尝试其他处理
|
|||
|
|
Debug.LogWarning($"Unsupported property type: {property.propertyType}");
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取SerializedProperty的值(泛型版本)
|
|||
|
|
/// </summary>
|
|||
|
|
public static T GetPropertyValue<T>(SerializedProperty property, T defaultValue = default(T))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
object value = GetPropertyValue(property);
|
|||
|
|
if (value == null) return defaultValue;
|
|||
|
|
|
|||
|
|
// 如果类型匹配,直接返回
|
|||
|
|
if (value is T typedValue)
|
|||
|
|
return typedValue;
|
|||
|
|
|
|||
|
|
// 尝试类型转换
|
|||
|
|
return (T)Convert.ChangeType(value, typeof(T));
|
|||
|
|
}
|
|||
|
|
catch (Exception e)
|
|||
|
|
{
|
|||
|
|
Debug.LogWarning($"Failed to get property value as type {typeof(T).Name}: {e.Message}");
|
|||
|
|
return defaultValue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 安全地获取属性值,返回是否成功
|
|||
|
|
/// </summary>
|
|||
|
|
public static bool TryGetPropertyValue<T>(SerializedProperty property, out T value, T defaultValue = default(T))
|
|||
|
|
{
|
|||
|
|
value = defaultValue;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
value = GetPropertyValue<T>(property, defaultValue);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|