【Unity3D】【NGUI】循环Scroll View

NGUI讨论群:333417608


NGUI版本3.0.9 f4

脚本的作用:使用10个甚至更少的item模拟成百上千的item数据。在滑动过程中,如果拖到最后面的时候,会拿第一个过来补位。所以要正确的设置补位的那个item的数据。滑到最前面也是一样,用最后面的那个过来补位。


方法:

1、脚本放在Scroll View下面的UIGrid的那个物体上

【Unity3D】【NGUI】循环Scroll View_第1张图片

2、UIScrollView的Restrict Within Panel勾选掉

3、Scroll View上面的UIPanel的Cull勾选上

【Unity3D】【NGUI】循环Scroll View_第2张图片

4、你的每一个Item都放上一个UIWidget,调整到合适的大小(用它的Visiable)

【Unity3D】【NGUI】循环Scroll View_第3张图片

5、仅仅是提供思路,具体每个Item的内容怎么更新什么的自己研究吧。

6、应该没问题了。有问题加群问。


附代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[RequireComponent(typeof(UIGrid))]
public class SZUILoopScrollView : MonoBehaviour {

	public string perfix = string.Empty;
	
	private List itemList = new List();
	private Vector4 posParam;
	private Transform cachedTransform;
	
	void Awake()
	{
		cachedTransform = this.transform;
		UIGrid grid = this.GetComponent();
		float cellWidth = grid.cellWidth;
		float cellHeight = grid.cellHeight;
		posParam = new Vector4(cellWidth, cellHeight, 
			grid.arrangement == UIGrid.Arrangement.Horizontal ? 1 : 0,
			grid.arrangement == UIGrid.Arrangement.Vertical ? 1 : 0);
	}
	
	void Start()
	{
		for (int i=0; i();
			uiw.name = string.Format("{0}_{1:D3}", perfix, itemList.Count);
			itemList.Add(uiw);
		}
	}
	
	void LateUpdate()
	{
		if (itemList.Count > 1)
		{
			int sourceIndex = -1;
			int targetIndex = -1;
			int sign = 0;
			
			bool firstVislable = itemList[0].isVisible;
			bool lastVisiable = itemList[itemList.Count-1].isVisible;
			
			// if first and last both visiable or invisiable then return	
			if (firstVislable == lastVisiable)
			{
				return;
			}
			
			if (firstVislable)
			{
				// move last to first one
				sourceIndex = itemList.Count-1;
				targetIndex = 0;
				sign = -1;
			}
			else if (lastVisiable)
			{
				// move first to last one
				sourceIndex = 0;
				targetIndex = itemList.Count-1;
				sign = 1;
			}
			if (sourceIndex > -1)
			{
				UIWidget movedWidget = itemList[sourceIndex];
				Vector3 offset = new Vector3(sign*posParam.x * posParam.z, sign*posParam.y * posParam.w, 0);
				movedWidget.cachedTransform.localPosition = itemList[targetIndex].cachedTransform.localPosition + offset;
				// change item index
				itemList.RemoveAt(sourceIndex);
				itemList.Insert(targetIndex, movedWidget);
			}
		}
	}
}


你可能感兴趣的:(Unity3D,NGUI)