public bool Raycast(Ray ray, out RaycastHit hit, out GameObject obj, float maxDistance = Mathf.Infinity, List <GameObject> ignoreList = null) { obj = null; hit = new RaycastHit(); var result = false; var distance = Mathf.Infinity; k_Renderers.Clear(); if (m_SpatialHashContainer.GetIntersections(k_Renderers, ray, maxDistance)) { for (int i = 0; i < k_Renderers.Count; i++) { var renderer = k_Renderers[i]; if (ignoreList != null && ignoreList.Contains(renderer.gameObject)) { continue; } // Skip destroyed objects if (renderer == null) { continue; } var transform = renderer.transform; IntersectionUtils.SetupCollisionTester(m_CollisionTester, transform); RaycastHit tmp; if (IntersectionUtils.TestRay(m_CollisionTester, transform, ray, out tmp, maxDistance)) { var point = transform.TransformPoint(tmp.point); var dist = Vector3.Distance(point, ray.origin); if (dist < distance) { result = true; distance = dist; hit.distance = dist; hit.point = point; hit.normal = transform.TransformDirection(tmp.normal); obj = renderer.gameObject; } } } } return(result); }