コード例 #1
0
        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);
        }