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);
}
}
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 代码
每次滑动不会出现切割的效果了!