Pulver trash maze sequence

This commit is contained in:
Michal Pikulski
2025-12-19 15:26:13 +01:00
parent 15c9ba0127
commit f0905f92d3
36 changed files with 2372 additions and 842 deletions

View File

@@ -0,0 +1,121 @@
using UnityEditor;
using UnityEngine;
using Interactions;
namespace Editor
{
/// <summary>
/// Custom editor for TriggerAnimationOnInteraction with helpful validation and feedback
/// </summary>
[CustomEditor(typeof(TriggerAnimationOnInteraction))]
public class TriggerAnimationOnInteractionEditor : UnityEditor.Editor
{
private SerializedProperty _interactable;
private SerializedProperty _animator;
private SerializedProperty _triggerName;
private void OnEnable()
{
_interactable = serializedObject.FindProperty("interactable");
_animator = serializedObject.FindProperty("animator");
_triggerName = serializedObject.FindProperty("triggerName");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
// Draw script field (read-only)
EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.ObjectField("Script", MonoScript.FromMonoBehaviour((MonoBehaviour)target), GetType(), false);
EditorGUI.EndDisabledGroup();
EditorGUILayout.Space();
// Component References
EditorGUILayout.LabelField("Component References (Optional)", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_interactable);
EditorGUILayout.PropertyField(_animator);
if (_interactable.objectReferenceValue == null || _animator.objectReferenceValue == null)
{
EditorGUILayout.HelpBox("Leave fields empty to auto-discover components on this GameObject or children.", MessageType.Info);
}
EditorGUILayout.Space();
// Animation Settings
EditorGUILayout.LabelField("Animation Settings", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_triggerName);
if (string.IsNullOrEmpty(_triggerName.stringValue))
{
EditorGUILayout.HelpBox("Assign a trigger name that matches a trigger parameter in the Animator.", MessageType.Warning);
}
EditorGUILayout.Space();
// Component Discovery Info
EditorGUILayout.LabelField("Component Discovery Status", EditorStyles.boldLabel);
var component = (TriggerAnimationOnInteraction)target;
// Check what will be used at runtime
InteractableBase resolvedInteractable = _interactable.objectReferenceValue as InteractableBase;
if (resolvedInteractable == null)
{
resolvedInteractable = component.GetComponent<InteractableBase>();
}
if (resolvedInteractable == null)
{
resolvedInteractable = component.GetComponentInChildren<InteractableBase>();
}
Animator resolvedAnimator = _animator.objectReferenceValue as Animator;
if (resolvedAnimator == null)
{
resolvedAnimator = component.GetComponent<Animator>();
}
if (resolvedAnimator == null)
{
resolvedAnimator = component.GetComponentInChildren<Animator>();
}
// Show discovered components
if (resolvedInteractable != null)
{
string source = _interactable.objectReferenceValue != null ? "Assigned" : "Auto-discovered";
EditorGUILayout.HelpBox($"✓ Interactable: {resolvedInteractable.gameObject.name} ({source})", MessageType.Info);
}
else
{
EditorGUILayout.HelpBox("✗ No Interactable found! Assign one or ensure an Interactable exists on this GameObject or children.", MessageType.Error);
}
if (resolvedAnimator != null)
{
string source = _animator.objectReferenceValue != null ? "Assigned" : "Auto-discovered";
EditorGUILayout.HelpBox($"✓ Animator: {resolvedAnimator.gameObject.name} ({source})", MessageType.Info);
}
else
{
EditorGUILayout.HelpBox("✗ No Animator found! Assign one or ensure an Animator exists on this GameObject or children.", MessageType.Error);
}
EditorGUILayout.Space();
// Behavior explanation
EditorGUILayout.HelpBox(
"Behavior:\n" +
"• Components can be manually assigned or auto-discovered\n" +
"• Auto-discovery searches: this GameObject → children\n" +
"• Listens to interactionComplete event from Interactable\n" +
"• Triggers animation ONLY when interaction succeeds (success = true)\n" +
"• Uses SetTrigger() with the specified trigger name",
MessageType.None
);
serializedObject.ApplyModifiedProperties();
}
}
}