Files
fnl/Assets/Extensions/ProCamera2D/Editor/Triggers/ProCamera2DTriggerBoundariesEditor.cs

185 lines
8.4 KiB
C#
Raw Normal View History

2026-02-21 16:40:15 -08:00
using UnityEditor;
using UnityEngine;
namespace Com.LuisPedroFonseca.ProCamera2D
{
[CustomEditor(typeof(ProCamera2DTriggerBoundaries))]
[CanEditMultipleObjects]
public class ProCamera2DTriggerBoundariesEditor : Editor
{
MonoScript _script;
GUIContent _tooltip;
void OnEnable()
{
var proCamera2DTriggerBoundaries = (ProCamera2DTriggerBoundaries)target;
if (proCamera2DTriggerBoundaries.NumericBoundaries == null && proCamera2DTriggerBoundaries.ProCamera2D != null)
{
var numericBoundaries = proCamera2DTriggerBoundaries.ProCamera2D.GetComponent<ProCamera2DNumericBoundaries>();
proCamera2DTriggerBoundaries.NumericBoundaries = numericBoundaries == null ? proCamera2DTriggerBoundaries.ProCamera2D.gameObject.AddComponent<ProCamera2DNumericBoundaries>() : numericBoundaries;
}
_script = MonoScript.FromMonoBehaviour(proCamera2DTriggerBoundaries);
}
public override void OnInspectorGUI()
{
var proCamera2DTriggerBoundaries = (ProCamera2DTriggerBoundaries)target;
if (proCamera2DTriggerBoundaries.ProCamera2D == null)
EditorGUILayout.HelpBox("ProCamera2D is not set.", MessageType.Error, true);
serializedObject.Update();
// Show script link
GUI.enabled = false;
_script = EditorGUILayout.ObjectField("Script", _script, typeof(MonoScript), false) as MonoScript;
GUI.enabled = true;
// ProCamera2D
_tooltip = new GUIContent("Pro Camera 2D", "");
EditorGUILayout.PropertyField(serializedObject.FindProperty("_pc2D"), _tooltip);
// Update interval
_tooltip = new GUIContent("Update Interval", "Every X seconds detect collision. Smaller frequencies are more precise but also require more processing.");
EditorGUILayout.PropertyField(serializedObject.FindProperty("UpdateInterval"), _tooltip);
if (proCamera2DTriggerBoundaries.UpdateInterval <= 0.01f)
proCamera2DTriggerBoundaries.UpdateInterval = 0.01f;
// Trigger shape
_tooltip = new GUIContent("Trigger Shape", "");
EditorGUILayout.PropertyField(serializedObject.FindProperty("TriggerShape"), _tooltip);
// Boundaries relative
_tooltip = new GUIContent("Are boundaries relative", "Are the boundaries relative to this or are they world positions?");
EditorGUILayout.PropertyField(serializedObject.FindProperty("AreBoundariesRelative"), _tooltip);
// Top boundary
EditorGUILayout.BeginHorizontal();
_tooltip = new GUIContent("Use Top Boundary", "Should the camera top position be limited?");
EditorGUILayout.PropertyField(serializedObject.FindProperty("UseTopBoundary"), _tooltip);
if(proCamera2DTriggerBoundaries.UseTopBoundary)
{
_tooltip = new GUIContent(" ", "Camera top boundary");
EditorGUILayout.PropertyField(serializedObject.FindProperty("TopBoundary"), _tooltip);
}
EditorGUILayout.EndHorizontal();
// Bottom boundary
EditorGUILayout.BeginHorizontal();
_tooltip = new GUIContent("Use Bottom Boundary", "Should the camera bottom position be limited?");
EditorGUILayout.PropertyField(serializedObject.FindProperty("UseBottomBoundary"), _tooltip);
if(proCamera2DTriggerBoundaries.UseBottomBoundary)
{
_tooltip = new GUIContent(" ", "Camera bottom boundary");
EditorGUILayout.PropertyField(serializedObject.FindProperty("BottomBoundary"), _tooltip);
}
EditorGUILayout.EndHorizontal();
// Left boundary
EditorGUILayout.BeginHorizontal();
_tooltip = new GUIContent("Use Left Boundary", "Should the camera left position be limited?");
EditorGUILayout.PropertyField(serializedObject.FindProperty("UseLeftBoundary"), _tooltip);
if(proCamera2DTriggerBoundaries.UseLeftBoundary)
{
_tooltip = new GUIContent(" ", "Camera left boundary");
EditorGUILayout.PropertyField(serializedObject.FindProperty("LeftBoundary"), _tooltip);
}
EditorGUILayout.EndHorizontal();
// Right boundary
EditorGUILayout.BeginHorizontal();
_tooltip = new GUIContent("Use Right Boundary", "Should the camera right position be limited?");
EditorGUILayout.PropertyField(serializedObject.FindProperty("UseRightBoundary"), _tooltip);
if(proCamera2DTriggerBoundaries.UseRightBoundary)
{
_tooltip = new GUIContent(" ", "Camera right boundary");
EditorGUILayout.PropertyField(serializedObject.FindProperty("RightBoundary"), _tooltip);
}
EditorGUILayout.EndHorizontal();
// Transition duration
_tooltip = new GUIContent("Transition duration", "How many X seconds should the transition take?");
EditorGUILayout.PropertyField(serializedObject.FindProperty("TransitionDuration"), _tooltip);
if (proCamera2DTriggerBoundaries.TransitionDuration <= 0)
proCamera2DTriggerBoundaries.TransitionDuration = 0;
// Transition ease type
_tooltip = new GUIContent("Transition ease type", "The transition animation ease type");
EditorGUILayout.PropertyField(serializedObject.FindProperty("TransitionEaseType"), _tooltip);
// Trigger targets
EditorGUILayout.BeginHorizontal();
_tooltip = new GUIContent("Use Targets Mid Point", "If checked, the trigger will use the mid point of all your camera targets");
EditorGUILayout.PropertyField(serializedObject.FindProperty("UseTargetsMidPoint"), _tooltip);
if (!proCamera2DTriggerBoundaries.UseTargetsMidPoint)
{
_tooltip = new GUIContent("Trigger Target", "The target to use instead of the mid point of all camera targets");
EditorGUILayout.PropertyField(serializedObject.FindProperty("TriggerTarget"), _tooltip);
}
EditorGUILayout.EndHorizontal();
// Change zoom
_tooltip = new GUIContent("Change Zoom", "Change the camera zoom in/out?");
EditorGUILayout.PropertyField(serializedObject.FindProperty("ChangeZoom"), _tooltip);
if (proCamera2DTriggerBoundaries.ChangeZoom)
{
// Target zoom
_tooltip = new GUIContent("Zoom Amount", "");
EditorGUILayout.PropertyField(serializedObject.FindProperty("TargetZoom"), _tooltip);
// Zoom smoothness
_tooltip = new GUIContent("Zoom Smoothness", "");
EditorGUILayout.PropertyField(serializedObject.FindProperty("ZoomSmoothness"), _tooltip);
}
// Set as starting boundaries
_tooltip = new GUIContent("Set as starting boundaries", "Use this boundaries as the starting ones");
EditorGUILayout.PropertyField(serializedObject.FindProperty("_setAsStartingBoundaries"), _tooltip);
if(proCamera2DTriggerBoundaries._setAsStartingBoundaries)
{
var allBoundariesTriggers = FindObjectsOfType(typeof(ProCamera2DTriggerBoundaries));
foreach (ProCamera2DTriggerBoundaries trigger in allBoundariesTriggers)
{
trigger._setAsStartingBoundaries = false;
}
proCamera2DTriggerBoundaries._setAsStartingBoundaries = true;
}
// Limit boundaries
if (proCamera2DTriggerBoundaries.LeftBoundary > proCamera2DTriggerBoundaries.RightBoundary)
proCamera2DTriggerBoundaries.LeftBoundary = proCamera2DTriggerBoundaries.RightBoundary;
if (proCamera2DTriggerBoundaries.RightBoundary < proCamera2DTriggerBoundaries.LeftBoundary)
proCamera2DTriggerBoundaries.RightBoundary = proCamera2DTriggerBoundaries.LeftBoundary;
if (proCamera2DTriggerBoundaries.BottomBoundary > proCamera2DTriggerBoundaries.TopBoundary)
proCamera2DTriggerBoundaries.BottomBoundary = proCamera2DTriggerBoundaries.TopBoundary;
if (proCamera2DTriggerBoundaries.TopBoundary < proCamera2DTriggerBoundaries.BottomBoundary)
proCamera2DTriggerBoundaries.TopBoundary = proCamera2DTriggerBoundaries.BottomBoundary;
serializedObject.ApplyModifiedProperties();
}
}
}