UnityEditor.SceneViewMotion.RaycastWorld C# (CSharp) Method

RaycastWorld() private static method

private static RaycastWorld ( Vector2 position, RaycastHit &hit ) : bool
position Vector2
hit UnityEngine.RaycastHit
return bool
        private static bool RaycastWorld(Vector2 position, out RaycastHit hit)
        {
            hit = new RaycastHit();
            GameObject obj2 = HandleUtility.PickGameObject(position, false);
            if (obj2 == null)
            {
                return false;
            }
            Ray ray = HandleUtility.GUIPointToWorldRay(position);
            MeshFilter[] componentsInChildren = obj2.GetComponentsInChildren<MeshFilter>();
            float positiveInfinity = float.PositiveInfinity;
            foreach (MeshFilter filter in componentsInChildren)
            {
                RaycastHit hit2;
                Mesh sharedMesh = filter.sharedMesh;
                if (((sharedMesh != null) && HandleUtility.IntersectRayMesh(ray, sharedMesh, filter.transform.localToWorldMatrix, out hit2)) && (hit2.distance < positiveInfinity))
                {
                    hit = hit2;
                    positiveInfinity = hit.distance;
                }
            }
            if (positiveInfinity == float.PositiveInfinity)
            {
                Collider[] colliderArray = obj2.GetComponentsInChildren<Collider>();
                foreach (Collider collider in colliderArray)
                {
                    RaycastHit hit3;
                    if (collider.Raycast(ray, out hit3, float.PositiveInfinity) && (hit3.distance < positiveInfinity))
                    {
                        hit = hit3;
                        positiveInfinity = hit.distance;
                    }
                }
            }
            if (positiveInfinity == float.PositiveInfinity)
            {
                Vector3 introduced15 = Vector3.Project(obj2.transform.position - ray.origin, ray.direction);
                hit.point = introduced15 + ray.origin;
            }
            return true;
        }

Usage Example

示例#1
0
 private static void HandleMouseUp(SceneView view, int id, int button, int clickCount)
 {
     if (GUIUtility.hotControl == id)
     {
         SceneViewMotion.ResetDragState();
         RaycastHit raycastHit;
         if (button == 2 && !SceneViewMotion.s_Dragged && SceneViewMotion.RaycastWorld(Event.current.mousePosition, out raycastHit))
         {
             Vector3 b       = view.pivot - view.rotation * Vector3.forward * view.cameraDistance;
             float   newSize = view.size;
             if (!view.orthographic)
             {
                 newSize = view.size * Vector3.Dot(raycastHit.point - b, view.rotation * Vector3.forward) / view.cameraDistance;
             }
             view.LookAt(raycastHit.point, view.rotation, newSize);
         }
         Event.current.Use();
     }
 }