【Unity3D】【NGUI】grid下面的item的重复利用

NGUI讨论群:333417608


解决的问题

使用grid放置item的时候,每次数据可能都不一样,但是每次都删除grid下面的节点,之后动态创建新的item是比较浪费的。

写个简单的工具函数,原理很简单。

1、先获得grid下面的可用item

2、根据data的大小进行初始化

3、每次在可用的item列表里面获取新的item,如果不够用了,就创建新的item

4、disable掉没用的item

附:每个grid下面预先要有一个名字包含“Template_”的模板item。这个模板不会被用,之前尝试过把这个模板也当做一个item正常使用,但是有些NGUI的widget会出现BUG。

using UnityEngine;
using System.Collections.Generic;
//qq group :333417608
public class UITools
{
	
	/* usage:
		List canUseList = UITools.GetCanUseItemList(gridRoot);
		for (int i=0; i canUseList, GameObject root, GameObject prefab)
	{
		GameObject go = null;
		if (canUseList.Count > 0) {
			go = canUseList [0];
			canUseList.RemoveAt (0);
		} else {
			go = NGUITools.AddChild (root, prefab);
		}
		NGUITools.SetActiveSelf (go, true);
		return go;
	}
	
	static public T GetNewItemObj (List canUseList, GameObject root, GameObject prefab) where T : Component
	{
		T item = null;
		if (canUseList.Count > 0) {
			item = canUseList [0];
			canUseList.RemoveAt (0);
		} else {
			item = NGUITools.AddChild (root, prefab).GetComponent();
		}
		item.name = string.Format("{0:D3}", 0);
		NGUITools.SetActiveSelf (item.gameObject, true);
		return item;
	}
	
	static public List GetCanUseItemList (GameObject root)
	{
		List itemList = new List ();
		Transform rootT = root.transform;
		for (int i=0; i GetCanUseItemList (GameObject root) where T : Component
	{
		List childrenList = new List ();
		Transform rootT = root.transform;
		for (int i=0; i ();
			if (t != null && IsNotTemplateGameObject(child.gameObject)) {
				childrenList.Add (t);
			}
		}
		return childrenList;
	}
	
	static public void UnActiveUnuseItem (List canUseList)
	{
		foreach (var item in canUseList) {
			NGUITools.SetActiveSelf (item, false);
		}
	}
	
	static public void UnActiveUnuseItem (List canUseList) where T : Component
	{
		foreach (var item in canUseList) {
			NGUITools.SetActiveSelf (item.gameObject, false);
		}
	}
	
	static private bool IsNotTemplateGameObject(GameObject go)
	{
		bool result = !go.name.ToLower().Contains("template_");
		if (!result && go.activeSelf)
		{
			NGUITools.SetActiveSelf(go, false);
		}
		return result;
	}
}


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