/// <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"); }
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); }