WuhuIslandTesting/Library/PackageCache/com.unity.addressables@1.21.12/Editor/GUI/ProfileValueReferenceDrawer.cs
2025-01-07 02:06:59 +01:00

81 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor.AddressableAssets.Settings;
using UnityEngine;
using UnityEngine.ResourceManagement.Util;
namespace UnityEditor.AddressableAssets.GUI
{
[CustomPropertyDrawer(typeof(ProfileValueReference), true)]
class ProfileValueReferenceDrawer : PropertyDrawer
{
FieldInfo m_SerializedFieldInfo;
SerializedProperty m_Property;
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
OnGUIMultiple(position, property, label, EditorGUI.showMixedValue);
}
public void OnGUIMultiple(Rect position, SerializedProperty property, GUIContent label, bool showMixed)
{
var settings = AddressableAssetSettingsDefaultObject.Settings;
if (settings == null)
return;
EditorGUI.BeginProperty(position, label, property);
if (m_SerializedFieldInfo == null)
m_SerializedFieldInfo = GetFieldInfo(property);
EditorGUI.BeginProperty(position, label, property);
var st = (ProfileValueReference)m_SerializedFieldInfo.GetValue(property.serializedObject.targetObject);
bool wasChanged = false;
string currentPathDisplay = st.Id;
if (showMixed)
currentPathDisplay = "—";
var newId = ProfilesEditor.ValueGUI(position, settings, label.text, currentPathDisplay, ref wasChanged);
if (newId != "—")
st.Id = newId; // ignore mixed value
if (wasChanged)
{
st = (ProfileValueReference)m_SerializedFieldInfo.GetValue(property.serializedObject.targetObject);
if (st != null && st.OnValueChanged != null)
st.OnValueChanged(st);
}
EditorGUI.EndProperty();
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
var settings = AddressableAssetSettingsDefaultObject.Settings;
if (settings == null)
return 0;
var idProp = property.FindPropertyRelative("m_Id");
return ProfilesEditor.CalcGUIHeight(settings, label.text, idProp.stringValue);
}
static FieldInfo GetFieldInfo(SerializedProperty property)
{
var o = property.serializedObject.targetObject;
var t = o.GetType();
string propertyName = property.name;
int i = property.propertyPath.IndexOf('.');
if (i > 0)
propertyName = property.propertyPath.Substring(0, i);
return t.GetField(propertyName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
}
static List<Type> GetTypes(FieldInfo fieldInfo)
{
var attrs = fieldInfo.GetCustomAttributes(typeof(SerializedTypeRestrictionAttribute), false);
if (attrs.Length == 0 || !(attrs[0] is SerializedTypeRestrictionAttribute))
return null;
return AddressableAssetUtility.GetTypes((attrs[0] as SerializedTypeRestrictionAttribute).type);
}
}
}