void Update() { if (m_SpatialHash == null) { return; } if (m_Testers == null) { return; } foreach (var tester in m_Testers) { if (!tester.active) { Renderer intersectedObject; if (m_IntersectedObjects.TryGetValue(tester, out intersectedObject)) { OnIntersectionExit(tester, intersectedObject); } continue; } var testerTransform = tester.transform; if (testerTransform.hasChanged) { var intersectionFound = false; Renderer[] intersections; if (m_SpatialHash.GetIntersections(tester.renderer.bounds, out intersections)) { //Sort list to try and hit closer object first var testerBounds = tester.renderer.bounds; var testerBoundsCenter = testerBounds.center; Array.Sort(intersections, (a, b) => (a.bounds.center - testerBoundsCenter).magnitude.CompareTo((b.bounds.center - testerBoundsCenter).magnitude)); var intersectionList = intersections.ToList(); intersectionList.RemoveAll(obj => { // Ignore destroyed objects if (!obj) { return(true); } // Ignore inactive objects if (!obj.gameObject.activeInHierarchy) { return(true); } // Ignore locked objects if (isLocked(obj.gameObject)) { return(true); } // Bounds check if (!obj.bounds.Intersects(testerBounds)) { return(true); } return(false); }); if (intersectionList.Count > k_MaxTestsPerTester) { continue; } foreach (var obj in intersectionList) { if (IntersectionUtils.TestObject(m_CollisionTester, obj, tester)) { intersectionFound = true; Renderer currentObject; if (m_IntersectedObjects.TryGetValue(tester, out currentObject)) { if (currentObject == obj) { OnIntersectionStay(tester, obj); } else { OnIntersectionExit(tester, currentObject); OnIntersectionEnter(tester, obj); } } else { OnIntersectionEnter(tester, obj); } } if (intersectionFound) { break; } } } if (!intersectionFound) { Renderer intersectedObject; if (m_IntersectedObjects.TryGetValue(tester, out intersectedObject)) { OnIntersectionExit(tester, intersectedObject); } } testerTransform.hasChanged = false; } } }
void Update() { if (m_SpatialHash == null) { return; } if (m_Testers == null) { return; } for (int i = 0; i < m_Testers.Count; i++) { var tester = m_Testers[i]; if (!tester.active) { Renderer intersectedObject; if (m_IntersectedObjects.TryGetValue(tester, out intersectedObject)) { OnIntersectionExit(tester); } continue; } var testerTransform = tester.transform; if (testerTransform.hasChanged) { var intersectionFound = false; m_Intersections.Clear(); var testerCollider = tester.collider; if (m_SpatialHash.GetIntersections(m_Intersections, testerCollider.bounds)) { var testerBounds = testerCollider.bounds; var testerBoundsCenter = testerBounds.center; m_SortedIntersections.Clear(); for (int j = 0; j < m_Intersections.Count; j++) { var obj = m_Intersections[j]; // Ignore destroyed objects if (!obj) { continue; } // Ignore inactive objects var go = obj.gameObject; if (!go.activeInHierarchy) { continue; } // Ignore locked objects if (this.IsLocked(go)) { continue; } // Bounds check if (!obj.bounds.Intersects(testerBounds)) { continue; } // Check if the object is larger than the player, and the player is inside it if (ContainsVRPlayerCompletely(go)) { continue; } m_SortedIntersections.Add(new SortableRenderer { renderer = obj, distance = (obj.bounds.center - testerBoundsCenter).magnitude }); } //Sort list to try and hit closer object first m_SortedIntersections.Sort((a, b) => a.distance.CompareTo(b.distance)); if (m_SortedIntersections.Count > k_MaxTestsPerTester) { continue; } for (int j = 0; j < m_SortedIntersections.Count; j++) { var obj = m_SortedIntersections[j].renderer; if (IntersectionUtils.TestObject(m_CollisionTester, obj, tester)) { intersectionFound = true; Renderer currentObject; if (m_IntersectedObjects.TryGetValue(tester, out currentObject)) { if (currentObject == obj) { OnIntersectionStay(tester, obj); } else { OnIntersectionExit(tester); OnIntersectionEnter(tester, obj); } } else { OnIntersectionEnter(tester, obj); } } if (intersectionFound) { break; } } } if (!intersectionFound) { Renderer intersectedObject; if (m_IntersectedObjects.TryGetValue(tester, out intersectedObject)) { OnIntersectionExit(tester); } } testerTransform.hasChanged = false; } } }