Scroll View 居左对其的滑动,可以按需滑动固定值

本文介绍了如何在ScrollView中实现内容居左并按固定值滑动的方法,避免滑动过程中的内容切割问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using UnityEngine;
using System.Collections.Generic;


public class UIStepScroll : MonoBehaviour
{
    public enum EnAlignmentType
    {
        Left,
        Top
    }


    /// <summary>
    /// 对齐方式
    /// </summary>
    public EnAlignmentType alignmentType = EnAlignmentType.Left;


    /// <summary>
    /// The strength of the spring.  滑动的时候那个效果的值
    /// </summary>


    public float springStrength = 8f;


    /// <summary>
    /// Custom movement, if the 'movement' field is set to 'Custom'.  左右滑动设置X  上下滑动设置Y
    /// </summary>


    public Vector2 customMovement = new Vector2(0.1f, 0f);


    /// <summary>
    /// Callback to be triggered when the centering operation completes.
    /// </summary>


    public SpringPanel.OnFinished onFinished;


    UIScrollView mScrollView;
    GameObject mCenteredObject;


    /// <summary>
    /// Game object that the draggable panel is currently centered on.
    /// </summary>


    public GameObject centeredObject { get { return mCenteredObject; } }


    private int corners1;


    private int corners2;


    void Start() { 
        
        if (alignmentType == EnAlignmentType.Left)
        {
            corners1 = 1;
            corners2 = 0;
        }
        else if (alignmentType == EnAlignmentType.Top)
        {
            corners1 = 3;
            corners2 = 1;
        }


        Recenter(); 
    }
    void OnEnable() { Recenter(); }
    void OnDisable() { }
    void OnDragFinished() { if (enabled) Recenter(); }


    public void Recenter()
    {
        if (mScrollView == null)
        {
            mScrollView = NGUITools.FindInParents<UIScrollView>(gameObject);


            if (mScrollView == null)
            {
                Debug.LogWarning(GetType() + " requires " + typeof(UIScrollView) + " on a parent object in order to work", this);
                enabled = false;
                return;
            }
            else
            {
                if (mScrollView)
                {
                    mScrollView.onDragFinished = OnDragFinished;
                }


                if (mScrollView.horizontalScrollBar != null)
                    mScrollView.horizontalScrollBar.onDragFinished = OnDragFinished;


                if (mScrollView.verticalScrollBar != null)
                    mScrollView.verticalScrollBar.onDragFinished = OnDragFinished;
            }
        }
        if (mScrollView.panel == null) return;


        Transform trans = transform;
        if (trans.childCount == 0) return;


        // Calculate the panel's center in world coordinates
        Vector3[] corners = mScrollView.panel.worldCorners;
        Vector3 panelCenter = (corners[corners1] + corners[corners2]) * 0.5f;


        // Offset this value by the momentum
        Vector3 momentum = mScrollView.currentMomentum * mScrollView.momentumAmount;
        Vector3 moveDelta = NGUIMath.SpringDampen(ref momentum, 9f, 2f);
        Vector3 pickingPoint = panelCenter - moveDelta * 0.01f; // Magic number based on what "feels right"


        float min = float.MaxValue;
        Transform closest = null;
        int index = 0;


        // Determine the closest child
        for (int i = 0, imax = trans.childCount; i < imax; ++i)
        {
            Transform t = trans.GetChild(i);
            if (!t.gameObject.activeInHierarchy) continue;
            float sqrDist = Vector3.SqrMagnitude(t.position - pickingPoint);


            if (sqrDist < min)
            {
                min = sqrDist;
                closest = t;
                index = i;
            }
        }


        CenterOn(closest, panelCenter);
    }


    /// <summary>
    /// Center the panel on the specified target.
    /// </summary>


    void CenterOn(Transform target, Vector3 panelCenter)
    {
        if (target != null && mScrollView != null && mScrollView.panel != null)
        {
            Transform panelTrans = mScrollView.panel.cachedTransform;
            mCenteredObject = target.gameObject;


            Vector3 offset = Vector3.zero;
            offset.x += customMovement.x;
            offset.y += customMovement.y;
            // Figure out the difference between the chosen child and the panel's center in local coordinates
            Vector3 cp = panelTrans.InverseTransformPoint(target.position + offset);
            Vector3 cc = panelTrans.InverseTransformPoint(panelCenter);
            Vector3 localOffset = cp - cc;


            // Offset shouldn't occur if blocked
            if (!mScrollView.canMoveHorizontally) localOffset.x = 0f;
            if (!mScrollView.canMoveVertically) localOffset.y = 0f;
            localOffset.z = 0f;


            // Spring the panel to this calculated position
            {
                SpringPanel.Begin(mScrollView.panel.cachedGameObject,
                    panelTrans.localPosition - localOffset, springStrength).onFinished = onFinished;
            }
        }
        else mCenteredObject = null;
    }


    /// <summary>
    /// Center the panel on the specified target.
    /// </summary>


    public void CenterOn(Transform target)
    {
        if (mScrollView != null && mScrollView.panel != null)
        {
            Vector3[] corners = mScrollView.panel.worldCorners;
            Vector3 panelCenter = (corners[corners1] + corners[corners2]) * 0.5f;
            CenterOn(target, panelCenter);
        }
    }

}


同 UICenterOnChild.cs 代码

每次滑动不会出现切割的效果了!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值