From 4ba1e437d330c6280d3be9664cb7899795736e23 Mon Sep 17 00:00:00 2001 From: mewlist Date: Fri, 2 Feb 2024 00:48:04 +0900 Subject: [PATCH] Add property drawer for UniFiedScene --- Editor/Assets/UnifiedScenePropertyDrawer.cs | 109 ++++++++++++++++++ .../Assets/UnifiedScenePropertyDrawer.cs.meta | 3 + 2 files changed, 112 insertions(+) create mode 100644 Editor/Assets/UnifiedScenePropertyDrawer.cs create mode 100644 Editor/Assets/UnifiedScenePropertyDrawer.cs.meta diff --git a/Editor/Assets/UnifiedScenePropertyDrawer.cs b/Editor/Assets/UnifiedScenePropertyDrawer.cs new file mode 100644 index 0000000..dce50a8 --- /dev/null +++ b/Editor/Assets/UnifiedScenePropertyDrawer.cs @@ -0,0 +1,109 @@ +using UnityEditor; +using UnityEngine; + +namespace Mew.Core.Assets +{ + [CustomPropertyDrawer(typeof(UnifiedScene))] + public class UnifiedScenePropertyDrawer : PropertyDrawer + { + private const string SceneAssetReferenceKBackingField = "k__BackingField"; + private const string SceneReferenceKBackingField = "k__BackingField"; + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + var sceneAssetReferenceProperty = property.FindPropertyRelative(SceneAssetReferenceKBackingField); + var sceneReferenceProperty = property.FindPropertyRelative(SceneReferenceKBackingField); + var sceneAssetReference = sceneAssetReferenceProperty.boxedValue as SceneAssetReference; + var sceneReference = sceneReferenceProperty.boxedValue as SceneReference; + + var drawer = new LayoutDrawer(); + var isAssetReference = !string.IsNullOrEmpty(sceneAssetReference.AssetGUID); + var isSceneReference = sceneReference.IsValid; + + var labelText = isAssetReference + ? $"{label.text} (Addressables)" + : isSceneReference + ? $"{label.text} : (Build Settings)" + : $"{label.text} : Select scene"; + var customLabel = new GUIContent(labelText); + var originalColor = GUI.color; + if (!isAssetReference && !isSceneReference) + GUI.color = Color.yellow; + drawer.DrawLabel(position, customLabel); + + EditorGUI.indentLevel++; + if (isAssetReference) + { + drawer.DrawProperty(position, sceneAssetReferenceProperty); + } + else if (isSceneReference) + { + drawer.DrawProperty(position, sceneReferenceProperty); + } + else + { + drawer.DrawProperty(position, sceneAssetReferenceProperty); + drawer.DrawProperty(position, sceneReferenceProperty); + } + EditorGUI.indentLevel--; + if (!isAssetReference && !isSceneReference) + GUI.color = originalColor; + } + + private class LayoutDrawer + { + private float y = 0f; + + public void DrawProperty(Rect position, SerializedProperty property) + { + var rect = position; + rect.y += y; + rect.height = EditorGUI.GetPropertyHeight(property);; + EditorGUI.PropertyField(rect, property); + y += rect.height; + } + + public void DrawLabel(Rect position, GUIContent text) + { + var rect = position; + rect.y += y; + rect.height = EditorGUI.GetPropertyHeight(SerializedPropertyType.String, text); + GUI.Label(rect, text); + y += rect.height; + } + } + + private void DrawProperty(Rect position, SerializedProperty property, GUIContent label) + { + var rect = position; + EditorGUI.PropertyField(position, property, label); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + var sceneAssetReferenceProperty = property.FindPropertyRelative(SceneAssetReferenceKBackingField); + var sceneReferenceProperty = property.FindPropertyRelative(SceneReferenceKBackingField); + var sceneAssetReference = sceneAssetReferenceProperty.boxedValue as SceneAssetReference; + var sceneReference = sceneReferenceProperty.boxedValue as SceneReference; + + var fixedHeight = EditorGUI.GetPropertyHeight(SerializedPropertyType.String, label); + + if (!string.IsNullOrEmpty(sceneAssetReference.AssetGUID)) + { + return fixedHeight + + EditorGUI.GetPropertyHeight(sceneAssetReferenceProperty); + } + else if (sceneReference.IsValid) + { + return fixedHeight + + EditorGUI.GetPropertyHeight(sceneReferenceProperty); + } + else + { + return fixedHeight + + EditorGUI.GetPropertyHeight(sceneAssetReferenceProperty) + + EditorGUI.GetPropertyHeight(sceneReferenceProperty); + } + } + } +} \ No newline at end of file diff --git a/Editor/Assets/UnifiedScenePropertyDrawer.cs.meta b/Editor/Assets/UnifiedScenePropertyDrawer.cs.meta new file mode 100644 index 0000000..0752be4 --- /dev/null +++ b/Editor/Assets/UnifiedScenePropertyDrawer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d66d31633227447686e63960448c2d32 +timeCreated: 1706751250 \ No newline at end of file