Beispiel #1
0
        private HitTest.ObjectHitResult doHit(RaycastHit raycastHit, out TouchHit hit)
        {
            hit = new TouchHit(raycastHit);
            raycastHit.transform.GetComponents(tmpHitTestList);
            var count = tmpHitTestList.Count;

            if (count == 0)
            {
                return(HitTest.ObjectHitResult.Hit);
            }

            var hitResult = HitTest.ObjectHitResult.Hit;

            for (var i = 0; i < count; i++)
            {
                var test = tmpHitTestList[i];
                if (!test.enabled)
                {
                    continue;
                }
                hitResult = test.IsHit(hit);
                if (hitResult == HitTest.ObjectHitResult.Miss || hitResult == HitTest.ObjectHitResult.Discard)
                {
                    break;
                }
            }

            return(hitResult);
        }
 /// <summary>
 /// Checks if a point in screen coordinates hits something in this layer.
 /// </summary>
 /// <param name="position">Position in screen coordinates.</param>
 /// <param name="hit">Hit result.</param>
 /// <returns><see cref="LayerHitResult.Hit"/>, if an object is hit, <see cref="LayerHitResult.Miss"/> or <see cref="LayerHitResult.Error"/> otherwise.</returns>
 public virtual LayerHitResult Hit(Vector2 position, out TouchHit hit)
 {
     hit = default(TouchHit);
     if (enabled == false || gameObject.activeInHierarchy == false)
     {
         return(LayerHitResult.Miss);
     }
     return(LayerHitResult.Error);
 }
Beispiel #3
0
        /// <inheritdoc />
        public override LayerHitResult Hit(Vector2 position, out TouchHit hit)
        {
            if (base.Hit(position, out hit) == LayerHitResult.Miss)
            {
                return(LayerHitResult.Miss);
            }
            if (eventSystem == null)
            {
                return(LayerHitResult.Error);
            }

            if (pointerDataCache == null)
            {
                pointerDataCache = new PointerEventData(eventSystem);
            }
            pointerDataCache.position = position;
            eventSystem.RaycastAll(pointerDataCache, raycastResultCache);

            var count = raycastResultCache.Count;

            if (count == 0)
            {
                return(LayerHitResult.Miss);
            }
            if (count > 1)
            {
                for (var i = 0; i < count; ++i)
                {
                    var raycastHit = raycastResultCache[i];
                    switch (doHit(raycastHit, out hit))
                    {
                    case HitTest.ObjectHitResult.Hit:
                        return(LayerHitResult.Hit);

                    case HitTest.ObjectHitResult.Discard:
                        return(LayerHitResult.Miss);
                    }
                }
            }
            else
            {
                switch (doHit(raycastResultCache[0], out hit))
                {
                case HitTest.ObjectHitResult.Hit:
                    return(LayerHitResult.Hit);

                case HitTest.ObjectHitResult.Error:
                    return(LayerHitResult.Error);

                default:
                    return(LayerHitResult.Miss);
                }
            }

            return(LayerHitResult.Miss);
        }
Beispiel #4
0
        /// <inheritdoc />
        public override bool GetTargetHitResult(out TouchHit hit)
        {
            if (State == GestureState.Ended)
            {
                hit = cachedTargetHitResult;
                return(true);
            }

            return(base.GetTargetHitResult(out hit));
        }
Beispiel #5
0
        protected override LayerHitResult castRay(Ray ray, out TouchHit hit)
        {
            hit = new TouchHit();
            var hits = Physics2D.GetRayIntersectionAll(ray, float.PositiveInfinity, LayerMask);

            if (hits.Length == 0)
            {
                return(LayerHitResult.Miss);
            }
            if (hits.Length > 1)
            {
                hits = sortHits(hits);
            }

            var success = false;

            foreach (var raycastHit in hits)
            {
                hit = TouchHit.FromRaycastHit2D(raycastHit);
                var hitTests = raycastHit.transform.GetComponents <HitTest>();
                if (hitTests.Length == 0)
                {
                    success = true;
                    break;
                }

                var hitResult = HitTest.ObjectHitResult.Error;
                foreach (var test in hitTests)
                {
                    hitResult = test.IsHit(hit);
                    if (hitResult == HitTest.ObjectHitResult.Hit || hitResult == HitTest.ObjectHitResult.Discard)
                    {
                        break;
                    }
                }

                if (hitResult == HitTest.ObjectHitResult.Hit)
                {
                    success = true;
                    break;
                }
                if (hitResult == HitTest.ObjectHitResult.Discard)
                {
                    break;
                }
            }

            if (success)
            {
                return(LayerHitResult.Hit);
            }

            return(LayerHitResult.Miss);
        }
Beispiel #6
0
        /// <summary>
        /// Gets result of casting a ray from specific screen position.
        /// </summary>
        /// <param name="position">The position.</param>
        /// <param name="hit">Raycast result.</param>
        /// <returns>true if ray hits gesture's target; otherwise, false.</returns>
        public virtual bool GetTargetHitResult(Vector2 position, out TouchHit hit)
        {
            TouchLayer layer = null;

            if (!TouchManager.Instance.GetHitTarget(position, out hit, out layer))
            {
                return(false);
            }

            if (transform == hit.Transform || hit.Transform.IsChildOf(transform))
            {
                return(true);
            }
            return(false);
        }
        /// <inheritdoc />
        protected override LayerHitResult castRay(Ray ray, out TouchHit hit)
        {
            hit = default(TouchHit);
            var raycastHits = Physics2D.GetRayIntersectionAll(ray, float.PositiveInfinity, LayerMask);

            Debug.DrawRay(ray.origin, ray.direction, Color.green);

            if (raycastHits.Length == 0)
            {
                return(LayerHitResult.Miss);
            }
            if (raycastHits.Length > 1)
            {
                sortHits(raycastHits);

                RaycastHit2D raycastHit = default(RaycastHit2D);
                var          i          = 0;
                while (i < sortedHits.Count)
                {
                    raycastHit = sortedHits[i];
                    switch (doHit(raycastHit, out hit))
                    {
                    case HitTest.ObjectHitResult.Hit:
                        return(LayerHitResult.Hit);

                    case HitTest.ObjectHitResult.Discard:
                        return(LayerHitResult.Miss);
                    }
                    i++;
                }
            }
            else
            {
                switch (doHit(raycastHits[0], out hit))
                {
                case HitTest.ObjectHitResult.Hit:
                    return(LayerHitResult.Hit);

                case HitTest.ObjectHitResult.Error:
                    return(LayerHitResult.Error);

                default:
                    return(LayerHitResult.Miss);
                }
            }

            return(LayerHitResult.Miss);
        }
Beispiel #8
0
        /// <inheritdoc />
        protected override LayerHitResult castRay(Ray ray, out TouchHit hit)
        {
            hit = default(TouchHit);
            var raycastHits = Physics.RaycastAll(ray, float.PositiveInfinity, LayerMask);

            if (raycastHits.Length == 0)
            {
                return(LayerHitResult.Miss);
            }
            if (raycastHits.Length > 1)
            {
                sortHits(raycastHits);

                RaycastHit raycastHit = default(RaycastHit);
                var        i          = 0;
                while (i < sortedHits.Count)
                {
                    raycastHit = sortedHits[i];
                    switch (doHit(raycastHit, out hit))
                    {
                    case HitTest.ObjectHitResult.Hit:
                        return(LayerHitResult.Hit);

                    case HitTest.ObjectHitResult.Discard:
                        return(LayerHitResult.Miss);
                    }
                    i++;
                }
            }
            else
            {
                switch (doHit(raycastHits[0], out hit))
                {
                case HitTest.ObjectHitResult.Hit:
                    return(LayerHitResult.Hit);

                case HitTest.ObjectHitResult.Error:
                    return(LayerHitResult.Error);

                default:
                    return(LayerHitResult.Miss);
                }
            }

            return(LayerHitResult.Miss);
        }
Beispiel #9
0
        private HitTest.ObjectHitResult doHit(RaycastResult raycastHit, out TouchHit hit)
        {
            hit = new TouchHit(raycastHit);

            if (!(raycastHit.module is GraphicRaycaster))
            {
                return(HitTest.ObjectHitResult.Miss);
            }
            var go = raycastHit.gameObject;

            if (go == null)
            {
                return(HitTest.ObjectHitResult.Miss);
            }

            if (((1 << go.layer) & LayerMask) == 0)
            {
                return(HitTest.ObjectHitResult.Miss);
            }

            go.GetComponents(tmpHitTestList);
            var count = tmpHitTestList.Count;

            if (count == 0)
            {
                return(HitTest.ObjectHitResult.Hit);
            }

            var hitResult = HitTest.ObjectHitResult.Hit;

            for (var i = 0; i < count; i++)
            {
                var test = tmpHitTestList[i];
                if (!test.enabled)
                {
                    continue;
                }
                hitResult = test.IsHit(hit);
                if (hitResult == HitTest.ObjectHitResult.Miss || hitResult == HitTest.ObjectHitResult.Discard)
                {
                    break;
                }
            }
            return(hitResult);
        }
Beispiel #10
0
        /// <inheritdoc />
        public override LayerHitResult Hit(Vector2 position, out TouchHit hit)
        {
            hit = new TouchHit();

            if (camera == null)
            {
                return(LayerHitResult.Error);
            }
            if (camera.enabled == false || camera.gameObject.activeInHierarchy == false)
            {
                return(LayerHitResult.Miss);
            }
            if (!camera.pixelRect.Contains(position))
            {
                return(LayerHitResult.Miss);
            }

            var ray = camera.ScreenPointToRay(new Vector3(position.x, position.y, camera.nearClipPlane));

            return(castRay(ray, out hit));
        }
Beispiel #11
0
        /// <inheritdoc />
        public override LayerHitResult Hit(Vector2 position, out TouchHit hit)
        {
            if (base.Hit(position, out hit) == LayerHitResult.Miss)
            {
                return(LayerHitResult.Miss);
            }

            if (_camera != null)
            {
                if (!_camera.pixelRect.Contains(position))
                {
                    return(LayerHitResult.Miss);
                }
            }

            hit = new TouchHit(transform);
            transform.GetComponents(tmpHitTestList);
            var count = tmpHitTestList.Count;

            if (count == 0)
            {
                return(LayerHitResult.Hit);
            }

            for (var i = 0; i < count; i++)
            {
                var test = tmpHitTestList[i];
                if (!test.enabled)
                {
                    continue;
                }
                var hitResult = test.IsHit(hit);
                if (hitResult == HitTest.ObjectHitResult.Miss || hitResult == HitTest.ObjectHitResult.Discard)
                {
                    return(LayerHitResult.Miss);
                }
            }

            return(LayerHitResult.Hit);
        }
Beispiel #12
0
        /// <summary>
        /// Checks if the touch has hit something.
        /// </summary>
        /// <param name="position">Touch point screen position.</param>
        /// <param name="hit">Output RaycastHit.</param>
        /// <param name="layer">Output touch layer which was hit.</param>
        /// <returns>True if something was hit.</returns>
        public bool GetHitTarget(Vector2 position, out TouchHit hit, out TouchLayer layer)
        {
            hit   = new TouchHit();
            layer = null;

            foreach (var touchLayer in layers)
            {
                if (touchLayer == null)
                {
                    continue;
                }
                TouchHit _hit;
                if (touchLayer.Hit(position, out _hit) == TouchLayer.LayerHitResult.Hit)
                {
                    hit   = _hit;
                    layer = touchLayer;
                    return(true);
                }
            }

            return(false);
        }
        /// <inheritdoc />
        public bool GetHitTarget(Vector2 position, out TouchHit hit, out TouchLayer layer)
        {
            hit   = default(TouchHit);
            layer = null;

            for (var i = 0; i < layerCount; i++)
            {
                var touchLayer = layers[i];
                if (touchLayer == null)
                {
                    continue;
                }
                TouchHit _hit;
                if (touchLayer.Hit(position, out _hit) == TouchLayer.LayerHitResult.Hit)
                {
                    hit   = _hit;
                    layer = touchLayer;
                    return(true);
                }
            }

            return(false);
        }
        /// <inheritdoc />
        public override LayerHitResult Hit(Vector2 position, out TouchHit hit)
        {
            if (base.Hit(position, out hit) == LayerHitResult.Miss)
            {
                return(LayerHitResult.Miss);
            }

            if (_camera == null)
            {
                return(LayerHitResult.Error);
            }
            if (_camera.enabled == false || _camera.gameObject.activeInHierarchy == false)
            {
                return(LayerHitResult.Miss);
            }
            if (!_camera.pixelRect.Contains(position))
            {
                return(LayerHitResult.Miss);
            }

            var ray = _camera.ScreenPointToRay(position);

            return(castRay(ray, out hit));
        }
Beispiel #15
0
        /// <summary>
        /// Gets result of casting a ray from specific screen position.
        /// </summary>
        /// <param name="position"> The position. </param>
        /// <param name="hit"> Raycast result. </param>
        /// <returns> <c>true</c> if ray hits gesture's target; <c>false</c> otherwise. </returns>
        public virtual bool GetTargetHitResult(Vector2 position, out TouchHit hit)
        {
            if (layer != null)
            {
                if (layer.Hit(position, out hit) != TouchLayer.LayerHitResult.Hit)
                {
                    return(false);
                }
            }
            else
            {
                TouchLayer l = null;
                if (!touchManager.GetHitTarget(position, out hit, out l))
                {
                    return(false);
                }
            }

            if (cachedTransform == hit.Transform || hit.Transform.IsChildOf(cachedTransform))
            {
                return(true);
            }
            return(false);
        }
Beispiel #16
0
 /// <summary>
 /// Gets result of casting a ray from gesture touch points centroid screen position.
 /// </summary>
 /// <param name="hit"> Raycast result </param>
 /// <returns> <c>true</c> if ray hits gesture's target; <c>false</c> otherwise. </returns>
 public virtual bool GetTargetHitResult(out TouchHit hit)
 {
     return(GetTargetHitResult(ScreenPosition, out hit));
 }
Beispiel #17
0
        /// <summary>
        /// Called when a layer is touched to query the layer if this touch hits something.
        /// </summary>
        /// <param name="touch">Touch.</param>
        /// <param name="hit">Hit result.</param>
        /// <returns><see cref="LayerHitResult.Hit"/>, if an object is hit, <see cref="LayerHitResult.Miss"/> or <see cref="LayerHitResult.Error"/> otherwise.</returns>
        /// <remarks>This method may also be used to update some internal state or resend this event somewhere.</remarks>
        protected virtual LayerHitResult beginTouch(TouchPoint touch, out TouchHit hit)
        {
            var result = Hit(touch.Position, out hit);

            return(result);
        }
Beispiel #18
0
 protected abstract LayerHitResult castRay(Ray ray, out TouchHit hit);
Beispiel #19
0
 /// <summary>
 /// Checks if a point hits something in this layer.
 /// </summary>
 /// <param name="position">Position in screen coordinates.</param>
 /// <param name="hit">Raycast result.</param>
 /// <returns>Hit, if an object is hit, Miss or Error otherwise.</returns>
 public virtual LayerHitResult Hit(Vector2 position, out TouchHit hit)
 {
     hit = new TouchHit();
     return(LayerHitResult.Miss);
 }
        /// <inheritdoc />
        public bool GetHitTarget(Vector2 position, out TouchHit hit)
        {
            TouchLayer layer;

            return(GetHitTarget(position, out hit, out layer));
        }