From 5b911f9f47d1665f987137ab9d10bddcb9840d1f Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 3 Oct 2025 13:28:15 -0400 Subject: [PATCH] change: better support for BoxOverlap observers, small tweaks to the editor and task --- .../Core/Graph Tasks/CheckGenericObserver.cs | 9 +++- .../Player/PlayerEnvironmentManager.cs | 41 ++++++++++++++++--- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/Assets/Scripts/Core/Graph Tasks/CheckGenericObserver.cs b/Assets/Scripts/Core/Graph Tasks/CheckGenericObserver.cs index 86ec20f..cc371f6 100644 --- a/Assets/Scripts/Core/Graph Tasks/CheckGenericObserver.cs +++ b/Assets/Scripts/Core/Graph Tasks/CheckGenericObserver.cs @@ -35,6 +35,7 @@ namespace Reset { private EnvironmentObserver observer; public BBParameter outputHit; + public BBParameter> outputHitArray; #if UNITY_EDITOR protected override void OnTaskInspectorGUI(){ @@ -63,7 +64,13 @@ namespace Reset { drawGizmosOnlyWhenActive = EditorGUILayout.Toggle("Draw Gizmos Only When Active", drawGizmosOnlyWhenActive); } - BBParameterEditor.ParameterField("Output Hit", outputHit); + if (castType.value == EnvironmentObserver.CastType.BoxCast || + castType.value == EnvironmentObserver.CastType.SphereCast || + castType.value == EnvironmentObserver.CastType.Ray) { + BBParameterEditor.ParameterField("Output Hit", outputHit); + } else { + BBParameterEditor.ParameterField("Output Hits", outputHitArray); + } } #endif diff --git a/Assets/Scripts/Player/PlayerEnvironmentManager.cs b/Assets/Scripts/Player/PlayerEnvironmentManager.cs index 29defff..1840a1a 100644 --- a/Assets/Scripts/Player/PlayerEnvironmentManager.cs +++ b/Assets/Scripts/Player/PlayerEnvironmentManager.cs @@ -43,19 +43,27 @@ public class EnvironmentObserver{ public bool active; // Parameters for Cast cast types - [FoldoutGroup("Settings")] public float length; + [FoldoutGroup("Settings")] [HideIf("@castType == CastType.BoxOverlap || castType == CastType.SphereOverlap")] + public float length; [FoldoutGroup("Settings")] public Vector3 direction; [FoldoutGroup("Settings")] public Vector3 offset; [PropertySpace(0, 5), FoldoutGroup("Settings")] public LayerMask ignoreLayers = ~0; - [ShowIfGroup("Settings/CastsOnly", VisibleIf = "@castType == CastType.SphereCast || castType == CastType.SphereOverlap")] + [FoldoutGroup("Settings")] [ShowIf("@castType == CastType.BoxOverlap || castType == CastType.SphereOverlap")] + public List ignoreObjects = new List(); + + [FoldoutGroup("Settings")] [ShowIf("@castType == CastType.BoxOverlap || castType == CastType.SphereOverlap")] + public bool dontIgnoreSelf; + + [ShowIfGroup("Settings/SpheresOnly", VisibleIf = "@castType == CastType.SphereCast || castType == CastType.SphereOverlap")] [FoldoutGroup("Settings")] public float width; // Parameters for Overlap cast types - [ShowIfGroup("Settings/3DOnly", VisibleIf = "@castType == CastType.BoxCast && castType != CastType.BoxOverlap")] [FoldoutGroup("Settings")] + [FoldoutGroup("Settings")] + [ShowIfGroup("Settings/BoxesOnly", VisibleIf = "@castType == CastType.BoxCast || castType == CastType.BoxOverlap")] public Vector3 size; - [ShowIfGroup("Settings/3DOnly")] + [ShowIfGroup("Settings/BoxesOnly")] public Vector3 rotation; [HideInInspector] @@ -96,8 +104,30 @@ public class EnvironmentObserver{ Physics.Raycast(relativeStart, source.transform.rotation * direction, out hit, length, ignoreLayers); break; case CastType.BoxOverlap: - overlapHits = Physics.OverlapBox(relativeStartWithRotation, size / 2f, + // Create original box overlap + Collider[] originalOverlap = Physics.OverlapBox(relativeStartWithRotation, size / 2f, source.transform.rotation * Quaternion.Euler(rotation), ignoreLayers); + + // Convert to a list for editing + List collidersAsList = new List(); + collidersAsList.AddRange(originalOverlap); + + // Remove any specifically specified objects + foreach (Collider ignoredObject in ignoreObjects) { + if (collidersAsList.Contains(ignoredObject)) { + collidersAsList.Remove(ignoredObject); + } + } + + // Remove the source but only if requested + if (!dontIgnoreSelf) { + if (collidersAsList.Contains(source.GetComponent())) { + collidersAsList.Remove(source.GetComponent()); + } + } + + // Send back to an array and done + overlapHits = collidersAsList.ToArray(); if (overlapHits.Length > 0) { return true; @@ -165,7 +195,6 @@ public class EnvironmentObserver{ } else { gizmosRotation = source.transform.rotation * Quaternion.LookRotation(direction) * Quaternion.Euler(rotation); } - Vector3 firstBoxOffset = gizmosRotation * (Vector3.forward * size.z); Color gizmoColor = Evaluate(source) ? Color.green : Color.red; gizmoColor = active ? gizmoColor : Color.gray;