さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

ScrollRect.OverScrollを取得する

 ElasticUnrestrictedScrollRectで、はみ出したスクロール量を取得する処理。

 なんで前回normalizedPositionでガタガタ言ってたかというと、これがやりたかったからなんだよね。結局使わなかったが。

    Vector2 GetOverScrollRanges(ScrollRect scrollRect)
    {
        var result = Vector2.zero;

        var localPosition = scrollRect.content.localPosition;
        var contentRect = scrollRect.content.rect;
        var contentPivot = scrollRect.content.pivot;
        var viewportRect = scrollRect.viewport.rect;
        if (viewportRect.width <= contentRect.width)
        {
            var over = contentRect.xMin + localPosition.x - viewportRect.xMin;
            var under = -(contentRect.xMax + localPosition.x - viewportRect.xMax);

            if (over > 0f)
            {
                result.x = over;
            }
            if (under > 0f)
            {
                result.x = -under;
            }
        }
        else
        {
            result.x = localPosition.x - Mathf.Lerp(viewportRect.xMin, viewportRect.xMax, contentPivot.x);
        }

        if (viewportRect.height <= contentRect.height)
        {
            var over = contentRect.yMin + localPosition.y - viewportRect.yMin;
            var under = -(contentRect.yMax + localPosition.y - viewportRect.yMax);

            if (over > 0f)
            {
                result.y = over;
            }
            if (under > 0f)
            {
                result.y = -under;
            }
        }
        else
        {
            result.y = localPosition.y - Mathf.Lerp(viewportRect.yMin, viewportRect.yMax, contentPivot.y);
        }

        return result;
    }

 pivotやらlocalPositionやら飛び交ってヒッジョにアレだ。もうちょい綺麗に書けそうなものだが。