예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="eventData"></param>
        /// <param name="axisIdx">Vector2の軸を指定</param>
        /// <returns></returns>
        private IEnumerator FrameProcess(PointerEventData eventData, int axisIdx)
        {
            var canvasScaler = scrollRect.GetComponentInParent <CanvasScaler>();
            // 移動方向(時間が経つと値が変わるので今取得)
            var   delta     = (eventData.delta.normalized)[axisIdx];
            float target    = float.NaN;
            var   stepCount = this.stepCount[axisIdx] - 1;

            DebugLog("stepCount=" + stepCount);
            var stepInterval = 1.0f / stepCount;
            var speed        = this.speed;
            var speed2       = speed * canvasScaler.referencePixelsPerUnit;

            speed2 *= speed2;
            while (true)
            {
                var currentPosition = scrollRect.normalizedPosition;
                // targetが未設定なら、現在の速度を監視
                if (float.IsNaN(target))
                {
                    var velocity = scrollRect.velocity[axisIdx];
                    velocity /= stepCount;
                    var currentSpeed = Mathf.Abs(velocity);
                    if (currentSpeed <= speed2)
                    {
                        // 移動方向の、次の区切りを目的地とする。
                        target = currentPosition[axisIdx];
                        if (target % stepInterval == 0)
                        {
                            // 既に目的地なら終了
                            break;
                        }
                        target = NextTarget(target, delta, stepCount);
                        DebugLog("snap start " + axisIdx + " delta=" + delta + " target=" + target);
                    }
                }
                else
                {
                    currentPosition[axisIdx]      = Move(currentPosition[axisIdx], target, stepInterval * (Time.deltaTime * speed));
                    scrollRect.normalizedPosition = currentPosition;
                    if (currentPosition[axisIdx] == target)
                    {
                        break;
                    }
                }
                yield return(new WaitForEndOfFrame());
            }
            DebugLog("snap end");
        }
예제 #2
0
파일: ApeUtil.cs 프로젝트: kyubuns/ApeTest
        public static bool CheckScrollRectClickable(ScrollRect target, Func <ScrollRect, bool> condition = null)
        {
            if (!target.isActiveAndEnabled)
            {
                return(false);
            }
            if (EventSystem.current == null)
            {
                return(false);
            }
            if (EventSystem.current.enabled == false)
            {
                return(false);
            }

            var rect   = target.GetComponent <RectTransform>();
            var center = rect.position;
            var canvas = target.GetComponentInParent <Canvas>();
            var pos    = RectTransformUtility.WorldToScreenPoint(canvas.worldCamera, center);

            var eventDataCurrentPosition = new PointerEventData(EventSystem.current)
            {
                position = pos
            };
            var results = new List <RaycastResult>();

            EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
            var raycastResult = results.Any() && results[0].gameObject.GetComponentInParent <ScrollRect>() == target;

            if (raycastResult && condition != null)
            {
                raycastResult = condition(results[0].gameObject.GetComponentInParent <ScrollRect>());
            }

            return(raycastResult);
        }