void UpdateActorSelection() { Camera camera = editMain.GetCamera(); Vector2 dragMinViewport = camera.ScreenToViewportPoint(Vector2.Min(startScreenCorner, endScreenCorner)); Vector2 dragMaxViewport = camera.ScreenToViewportPoint(Vector2.Max(startScreenCorner, endScreenCorner)); Rect dragViewportRect = new Rect(dragMinViewport, dragMaxViewport - dragMinViewport); Vector3[] dragFarWorldCorners = new Vector3[4]; camera.CalculateFrustumCorners(dragViewportRect, MAX_DIST, Camera.MonoOrStereoscopicEye.Mono, dragFarWorldCorners); float dragBoxWidth = Mathf.Abs(dragFarWorldCorners[1].x - dragFarWorldCorners[2].x); float dragBoxHeigh = Mathf.Abs(dragFarWorldCorners[1].y - dragFarWorldCorners[0].y); Ray centerRay = camera.ScreenPointToRay(Vector2.Lerp(startScreenCorner, endScreenCorner, .5f)); Vector3 dragBoxCenter = centerRay.GetPoint(MAX_DIST / 2f); Vector3 halfExtents = new Vector3(dragBoxWidth / 2f, dragBoxHeigh / 2f, MAX_DIST / 2f); Quaternion rotation = Quaternion.LookRotation(centerRay.direction, dragFarWorldCorners[1] - dragFarWorldCorners[0]); Collider[] colliders = Physics.OverlapBox(dragBoxCenter, halfExtents, rotation, userMain.GetLayerMask(), QueryTriggerInteraction.Collide); HashSet <VoosActor> actorsToAdd = new HashSet <VoosActor>(); foreach (Collider collider in colliders) { VoosActor maybeActor = collider.GetComponentInParent <VoosActor>(); if (maybeActor != null) { Vector3 viewportPosition = camera.WorldToViewportPoint(maybeActor.GetWorldRenderBoundsCenter()); if (viewportPosition.z > 0 && dragViewportRect.Contains(viewportPosition)) { actorsToAdd.Add(maybeActor); } } } // it feels like there should be a better way of finding these add/remove lists? HashSet <VoosActor> actorsToRemove = new HashSet <VoosActor>(selectedActors); actorsToRemove.ExceptWith(actorsToAdd); actorsToAdd.ExceptWith(selectedActors); foreach (VoosActor actor in actorsToRemove) { //editMain.RemoveTargetActor(actor); selectedActors.Remove(actor); selectedFeedback[actor].RequestDestroy(); selectedFeedback.Remove(actor); } foreach (VoosActor actor in actorsToAdd) { //editMain.AddTargetActor(actor); selectedActors.Add(actor); SelectionFeedback feedback = Instantiate(editMain.targetFeedbackPrefab); feedback.scaleMod = 1.1f; feedback.SetActor(actor); selectedFeedback[actor] = feedback; } }