Ejemplo n.º 1
0
        public override void Raycast(PointerEventData eventData, List <RaycastResult> resultAppendList)
        {
            if (eventCamera == null || !eventCamera.pixelRect.Contains(eventData.position))
            {
                return;
            }

            if (m_PlaneManger == null)
            {
                m_PlaneManger = arSessionOrigin.GetComponent <ARPlaneManager>();
            }
            if (m_referencePointManager == null)
            {
                m_referencePointManager = arSessionOrigin.GetComponent <ARReferencePointManager>();
            }


            if (arSessionOrigin.Raycast(eventData.position, m_raycastHits, trackableTypeMask))
            {
                m_raycastHits.Sort((r1, r2) => r1.distance.CompareTo(r2.distance));

                for (int i = 0; i < m_raycastHits.Count; i++)
                {
                    var        hit       = m_raycastHits[i];
                    GameObject hitTarget = null;

                    // Attempt to find a plane or reference point that was hit
                    if (m_PlaneManger != null)
                    {
                        ARPlane arPlane = m_PlaneManger.GetPlane(hit.trackableId);
                        if (arPlane != null)
                        {
                            hitTarget = arPlane.gameObject;
                        }
                    }

                    if (m_referencePointManager != null && hitTarget != null)
                    {
                        ARReferencePoint referencePoint = m_referencePointManager.GetReferencePoint(hit.trackableId);
                        if (referencePoint != null)
                        {
                            hitTarget = referencePoint.gameObject;
                        }
                    }

                    Vector3 worldPosition = m_SessionOrigin.transform.InverseTransformPoint(hit.pose.position);
                    Vector3 worldUp       = m_SessionOrigin.transform.TransformDirection(hit.pose.up);

                    resultAppendList.Add(
                        new RaycastResult()
                    {
                        gameObject     = hitTarget, // Send messages to the GameObject which has the trackable
                        module         = this,
                        distance       = hit.distance,
                        worldPosition  = worldPosition,
                        worldNormal    = worldUp,
                        screenPosition = eventData.position,
                        index          = i,
                        sortingLayer   = 0,
                        sortingOrder   = m_SortingOrder
                    }
                        );
                }
            }
        }