Added Pacore

This commit is contained in:
2026-03-30 10:32:44 +01:00
parent 62f6553986
commit b3202a4636
55 changed files with 1142 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
using PashaBibko.Pacore.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();
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a5fad12cc06f1a749bc75948a24e6306
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,23 @@
using PashaBibko.Pacore.Attributes;
using UnityEditor;
using UnityEngine;
namespace PashaBibko.Pacore.Editor.Drawers
{
[CustomPropertyDrawer(typeof(InspectorReadOnlyAttribute))]
public sealed class InspectorReadOnlyDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
if (attribute is InspectorReadOnlyAttribute readOnlyAttribute)
{
GUI.enabled = false;
label.text = readOnlyAttribute.Name ?? label.text; // Uses custom name if it exists
EditorGUI.PropertyField(position, property, label);
GUI.enabled = true;
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a90f608095c5b964fabd707859b141ed
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,42 @@
using PashaBibko.Pacore.Editor.Caches;
using UnityEditor;
using UnityEngine;
using System;
using Object = UnityEngine.Object;
namespace PashaBibko.Pacore.Editor.Drawers
{
[CustomEditor(typeof(MonoBehaviour), editorForChildClasses: true)]
public class MonoBehaviourDrawer : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
DrawFunctionButtons(target);
}
public static void DrawFunctionButtons(Object target)
{
Type type = target.GetType();
InspectorCallableCache.AttributeInfo[] buttons
= InspectorCallableCache.GetAllAttributesOfType(type);
if (buttons.Length == 0)
{
return;
}
EditorGUILayout.Space();
EditorGUILayout.LabelField("Functions", EditorStyles.boldLabel);
foreach (InspectorCallableCache.AttributeInfo button in buttons)
{
string name = button.Attribute.ButtonName;
if (GUILayout.Button(name))
{
button.AttachedMethod.Invoke(target, null);
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a0f42304568f6f54f9f7cf0c6e3e62ad
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,80 @@
using PashaBibko.Pacore.Editor.Caches;
using PashaBibko.Pacore.Attributes;
using UnityEditor;
using UnityEngine;
using System;
namespace PashaBibko.Pacore.Editor.Drawers
{
[CustomPropertyDrawer(typeof(MonoScriptAttribute))]
public class MonoScriptDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
/* I'm not sure if this will ever happen */
if (attribute is not MonoScriptAttribute attr)
{
return; // Stops NullReferenceExceptions
}
/* Makes sure the type is a string */
if (property.propertyType != SerializedPropertyType.String)
{
Debug.LogError($"Attribute [{nameof(MonoScriptAttribute)}] must be attached to a string");
return;
}
/* Draws the label of the script variable */
Rect rect = EditorGUI.PrefixLabel(position, label);
/* Fetches the script if there is a value assigned to the property */
string propValue = property.stringValue;
MonoScript script = null;
if (!string.IsNullOrEmpty(propValue))
{
script = MonoScriptCache.Get(propValue);
}
/* Draws the selected script and checks for changes */
script = EditorGUI.ObjectField(rect, script, typeof(MonoScript), allowSceneObjects: false) as MonoScript;
if (!GUI.changed)
{
return; // No changes to check
}
/* Makes sure the script is valid */
if (script is null)
{
property.stringValue = string.Empty; // No type means empty string
return;
}
/* Fetches the type of the attached script, and checks if it is valid */
Type type = script.GetClass();
if (type is null || (attr.MonoType is not null && !attr.MonoType.IsAssignableFrom(type)))
{
Debug.LogError($"The script file [{script.name}] doesn't contain an assignable MonoBehaviour class");
return;
}
/* If a forced inheritance has been set, checks its validity */
if (attr.InheritedFrom is not null && !attr.InheritedFrom.IsAssignableFrom(type))
{
property.stringValue = type.FullName; // Still applies the changes to make it appear like it is functioning
string attachedObject = property.serializedObject.targetObject.name;
string inherited = attr.InheritedFrom.FullName;
Debug.LogError
(
$"Field [{property.name}] as part of [{attachedObject}] is invalid.\n" +
$"The type must inherit from [{inherited}]. Currently it is [{type.FullName}]"
);
return;
}
/* Assigns the name of the type to the property so it can be created */
property.stringValue = type.FullName;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 21cdc55dcda1d9e40a1463929b020832
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: