Added DetectInspectorChanges
This commit is contained in:
@@ -3,7 +3,7 @@ using System;
|
|||||||
|
|
||||||
namespace PashaBibko.Pacore.Editor.Drawers
|
namespace PashaBibko.Pacore.Editor.Drawers
|
||||||
{
|
{
|
||||||
public class DisabledGUIBlock : IDisposable
|
public sealed class DisabledGUIBlock : IDisposable
|
||||||
{
|
{
|
||||||
public DisabledGUIBlock() => GUI.enabled = false;
|
public DisabledGUIBlock() => GUI.enabled = false;
|
||||||
public void Dispose() => GUI.enabled = true;
|
public void Dispose() => GUI.enabled = true;
|
||||||
|
|||||||
46
Assets/Pacore/Editor/Drawers/DetectInspectorChangesDrawer.cs
Normal file
46
Assets/Pacore/Editor/Drawers/DetectInspectorChangesDrawer.cs
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
using PashaBibko.Pacore.Shared.Attributes;
|
||||||
|
using System.Reflection;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace PashaBibko.Pacore.Editor.Drawers
|
||||||
|
{
|
||||||
|
[CustomPropertyDrawer(typeof(DetectInspectorChangesAttribute))]
|
||||||
|
public sealed class DetectInspectorChangesDrawer : PropertyDrawer
|
||||||
|
{
|
||||||
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||||||
|
{
|
||||||
|
/* Draws the property and checks for changes */
|
||||||
|
EditorGUI.BeginProperty(position, label, property);
|
||||||
|
EditorGUI.BeginChangeCheck();
|
||||||
|
|
||||||
|
EditorGUI.PropertyField(position, property, label);
|
||||||
|
if (EditorGUI.EndChangeCheck()) // Returns true if there were changes
|
||||||
|
{
|
||||||
|
property.serializedObject.ApplyModifiedProperties(); // Applies the changes
|
||||||
|
if (attribute is DetectInspectorChangesAttribute inspectorChangesAttribute)
|
||||||
|
{
|
||||||
|
const BindingFlags BINDING_FLAGS =
|
||||||
|
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
|
||||||
|
|
||||||
|
string methodName = inspectorChangesAttribute.ActionName;
|
||||||
|
|
||||||
|
/* Fetches the method and the object to call it on */
|
||||||
|
Object target = property.serializedObject.targetObject;
|
||||||
|
MethodInfo method = target.GetType().GetMethod(methodName, BINDING_FLAGS);
|
||||||
|
if (method == null)
|
||||||
|
{
|
||||||
|
Debug.LogError($"Method not found [{methodName}]");
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
method.Invoke(target, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorGUI.EndProperty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6a62b785aacd4f1b80370036cf8bb087
|
||||||
|
timeCreated: 1769190711
|
||||||
@@ -5,19 +5,17 @@ using UnityEngine;
|
|||||||
namespace PashaBibko.Pacore.Editor.Drawers
|
namespace PashaBibko.Pacore.Editor.Drawers
|
||||||
{
|
{
|
||||||
[CustomPropertyDrawer(typeof(InspectorReadOnlyAttribute))]
|
[CustomPropertyDrawer(typeof(InspectorReadOnlyAttribute))]
|
||||||
public class InspectorReadOnlyDrawer : PropertyDrawer
|
public sealed class InspectorReadOnlyDrawer : PropertyDrawer
|
||||||
{
|
{
|
||||||
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||||||
{
|
{
|
||||||
if (attribute is not InspectorReadOnlyAttribute roAttribute)
|
if (attribute is InspectorReadOnlyAttribute readOnlyAttribute)
|
||||||
{
|
{
|
||||||
return;
|
using (new DisabledGUIBlock())
|
||||||
}
|
{
|
||||||
|
label.text = readOnlyAttribute.Name ?? label.text; // Uses custom name if it exists
|
||||||
using (new DisabledGUIBlock())
|
EditorGUI.PropertyField(position, property, label);
|
||||||
{
|
}
|
||||||
label.text = roAttribute.Name ?? label.text; // Uses custom name if it exists
|
|
||||||
EditorGUI.PropertyField(position, property, label);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
17
Assets/Pacore/Shared/Attributes/DetectInspectorChanges.cs
Normal file
17
Assets/Pacore/Shared/Attributes/DetectInspectorChanges.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
using JetBrains.Annotations;
|
||||||
|
using UnityEngine;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace PashaBibko.Pacore.Shared.Attributes
|
||||||
|
{
|
||||||
|
[MeansImplicitUse, AttributeUsage(validOn: AttributeTargets.Field)]
|
||||||
|
public sealed class DetectInspectorChangesAttribute : PropertyAttribute
|
||||||
|
{
|
||||||
|
public string ActionName { get; }
|
||||||
|
|
||||||
|
public DetectInspectorChangesAttribute([NotNull] string function)
|
||||||
|
{
|
||||||
|
ActionName = function;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7b814b9ed1e8467084b8448ccdaf4ff6
|
||||||
|
timeCreated: 1769190547
|
||||||
@@ -6,18 +6,18 @@ namespace PashaBibko.Pacore.Shared.Attributes
|
|||||||
{
|
{
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
[MeansImplicitUse, AttributeUsage(validOn: AttributeTargets.Field)]
|
[MeansImplicitUse, AttributeUsage(validOn: AttributeTargets.Field)]
|
||||||
public class InspectorReadOnlyAttribute : PropertyAttribute
|
public sealed class InspectorReadOnlyAttribute : PropertyAttribute
|
||||||
{
|
{
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
|
|
||||||
public InspectorReadOnlyAttribute(string _name = null)
|
public InspectorReadOnlyAttribute(string name = null)
|
||||||
{
|
{
|
||||||
Name = _name;
|
Name = name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else // #if UNITY_EDITOR
|
#else // #if UNITY_EDITOR
|
||||||
[MeansImplicitUse, AttributeUsage(validOn: AttributeTargets.Field)]
|
[MeansImplicitUse, AttributeUsage(validOn: AttributeTargets.Field)]
|
||||||
public class InspectorReadOnlyAttribute : Attribute
|
public sealed class InspectorReadOnlyAttribute : Attribute
|
||||||
{
|
{
|
||||||
public InspectorReadOnlyAttribute(string _name = null) { }
|
public InspectorReadOnlyAttribute(string _name = null) { }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -272,6 +272,8 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: a411a69d284bfd04bafc210a81b43e88, type: 3}
|
m_Script: {fileID: 11500000, guid: a411a69d284bfd04bafc210a81b43e88, type: 3}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
go: {fileID: 0}
|
||||||
|
Test: 2147483647
|
||||||
--- !u!1 &410087039
|
--- !u!1 &410087039
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
@@ -4,4 +4,12 @@ using UnityEngine;
|
|||||||
public class TestMonoBehaviour : MonoBehaviour
|
public class TestMonoBehaviour : MonoBehaviour
|
||||||
{
|
{
|
||||||
[InspectorReadOnly, SerializeField] private GameObject go;
|
[InspectorReadOnly, SerializeField] private GameObject go;
|
||||||
|
|
||||||
|
[DetectInspectorChanges("OnTestChange")]
|
||||||
|
public int Test;
|
||||||
|
|
||||||
|
private void OnTestChange()
|
||||||
|
{
|
||||||
|
Debug.Log($"New value: {Test}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user