NGUI 相片循环滚动效果

来源:互联网 发布:mac系统能玩的网络游戏 编辑:程序博客网 时间:2024/05/21 09:16

将NGUI 自带Demo Example14的Vertical2抽出来,UICenterOnChild.cs自带的这个类里nextPageThreshold(滑动灵敏参数)无效

整个类替换之后即可实现效果。

//----------------------------------------------//            NGUI: Next-Gen UI kit// Copyright © 2011-2014 Tasharen Entertainment//----------------------------------------------using UnityEngine;/// <summary>/// Ever wanted to be able to auto-center on an object within a draggable panel?/// Attach this script to the container that has the objects to center on as its children./// </summary>[AddComponentMenu("NGUI/Interaction/Center Scroll View on Child")]public class UICenterOnChild : MonoBehaviour{    /// <summary>    /// The strength of the spring.    /// </summary>    public float springStrength = 8f;    /// <summary>    /// If set to something above zero, it will be possible to move to the next page after dragging past the specified threshold.    /// </summary>    public float nextPageThreshold = 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; } }    void OnEnable() { Recenter(); }    void OnDragFinished() { if (enabled) Recenter(); }    /// <summary>    /// Ensure that the threshold is always positive.    /// </summary>    void OnValidate()    {        nextPageThreshold = Mathf.Abs(nextPageThreshold);    }    /// <summary>    /// Recenter the draggable list on the center-most child.    /// </summary>    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            {                mScrollView.onDragFinished = OnDragFinished;                if (mScrollView.horizontalScrollBar != null)                    mScrollView.horizontalScrollBar.onDragFinished = OnDragFinished;                if (mScrollView.verticalScrollBar != null)                    mScrollView.verticalScrollBar.onDragFinished = OnDragFinished;            }        }        if (mScrollView.panel == null) return;        // Calculate the panel's center in world coordinates        Vector3[] corners = mScrollView.panel.worldCorners;        Vector3 panelCenter = (corners[2] + corners[0]) * 0.5f;        // Offset this value by the momentum        Vector3 pickingPoint = panelCenter - mScrollView.currentMomentum * (mScrollView.momentumAmount * 0.1f);        mScrollView.currentMomentum = Vector3.zero;        float min = float.MaxValue;        Transform closest = null;        Transform trans = transform;        int index = 0;        // Determine the closest child        for (int i = 0, imax = trans.childCount; i < imax; ++i)        {            Transform t = trans.GetChild(i);            float sqrDist = Vector3.SqrMagnitude(t.position - pickingPoint);            if (sqrDist < min)            {                min = sqrDist;                closest = t;                index = i;            }        }        // If we have a touch in progress and the next page threshold set        if (nextPageThreshold > 0f && UICamera.currentTouch != null)        {            // If we're still on the same object            if (mCenteredObject != null && mCenteredObject.transform == trans.GetChild(index))            {                Vector2 delta = UICamera.currentTouch.totalDelta;                Debug.Log("delta="+ delta+ "  nextPageThreshold="+ nextPageThreshold+"  index= "+index);                if (delta.x > nextPageThreshold)                {                    // Next page                    if (index > 0)                        closest = trans.GetChild(index - 1);                    else                    {                        closest= trans.GetChild(trans.childCount - 1);                    }                }                else if (delta.x < -nextPageThreshold)                {                    // Previous page                    if (index < trans.childCount - 1)                        closest = trans.GetChild(index + 1);                    else                        closest = trans.GetChild(0);                }            }        }        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;            // Figure out the difference between the chosen child and the panel's center in local coordinates            Vector3 cp = panelTrans.InverseTransformPoint(target.position);            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[2] + corners[0]) * 0.5f;            CenterOn(target, panelCenter);        }    }}



0 0