using UnityEngine;
using System.Collections;
namespace Utility
{
public class NGUIGridAutoLoop : MonoBehaviour
{
public enum LoopDircetion
{
LeftToRight,
RightToLeft,
TopToDown,
DownToTop,
}
public enum LoopType
{
Horizontal,
Vertical,
}
public delegate void OnLoopDelegate (LoopDircetion direction);
public LoopType m_looptype = LoopType.Vertical;
public OnLoopDelegate m_loopCallback;
private UIGrid m_grid;
private Transform m_gridTrans;
private float validWidth;
private float validHeight;
private void Awake ()
{
m_grid = transform.GetComponentInChildren<UIGrid> ();
if(m_grid != null)
m_gridTrans = m_grid.transform;
}
private void Start ()
{
if (m_grid == null || m_gridTrans.childCount == 0) {
Debug.LogError ("GridAutoLoop Error");
return;
}
validWidth = m_grid.transform.childCount * m_grid.cellWidth;
validHeight = m_grid.transform.childCount * m_grid.cellHeight;
var backupGo = GameObject.Instantiate (m_grid.transform.GetChild(0));
backupGo.gameObject.SetActive (true);
backupGo.transform.SetParent (m_grid.transform, false);
}
private void LateUpdate ()
{
if (m_looptype == LoopType.Vertical) {
while (m_grid.transform.localPosition.y < 0) {
m_grid.transform.localPosition += new Vector3 (0, validHeight, 0);
if (m_loopCallback != null)
m_loopCallback (LoopDircetion.TopToDown);
}
while (m_grid.transform.localPosition.y > validHeight) {
m_grid.transform.localPosition -= new Vector3 (0, validHeight, 0);
if (m_loopCallback != null)
m_loopCallback (LoopDircetion.DownToTop);
}
} else if (m_looptype == LoopType.Horizontal) {
while (m_grid.transform.localPosition.x > 0) {
m_grid.transform.localPosition -= new Vector3 (validWidth, 0, 0);
if (m_loopCallback != null)
m_loopCallback (LoopDircetion.LeftToRight);
}
while (m_grid.transform.localPosition.x < -validWidth) {
m_grid.transform.localPosition += new Vector3 (validWidth, 0, 0);
if (m_loopCallback != null)
m_loopCallback (LoopDircetion.RightToLeft);
}
}
}
}
}
NGUI下列表循环,支持上下方向或者左右方向,用的地方比如,数字转码效果,抽奖列表循环,类似滚动无缝循环均可以