Unity3D游戏开发之【NGUI】grid下面的item的重复利用
浏览数:48 /
时间:2015年06月08日
解决的问题
使用grid放置item的时候,每次数据可能都不一样,但是每次都删除grid下面的节点,之后动态创建新的item是比较浪费的。
写个简单的工具函数,原理很简单。
1、先获得grid下面的可用item
2、根据data的大小进行初始化
3、每次在可用的item列表里面获取新的item,如果不够用了,就创建新的item
4、disable掉没用的item
附:每个grid下面预先要有一个名字包含“Template_”的模板item。这个模板不会被用,之前尝试过把这个模板也当做一个item正常使用,但是有些NGUI的widget会出现BUG。
-
[font=微软雅黑]using UnityEngine;
-
using System.Collections.Generic;
-
//qq group :333417608
-
public class UITools
-
{
-
-
/* usage:
-
List<GameObject> canUseList = UITools.GetCanUseItemList(gridRoot);
-
for (int i=0; i<totalData.Length; ++i)
-
{
-
GameObject go = UITools.GetNewItemObj(canUseList, gridRoot, prefab);
-
// do init
-
}
-
UITools.UnActiveUnuseItem(canUseList);
-
-
// prefab is the template
-
*/
-
-
static public GameObject GetNewItemObj (List<GameObject> 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<T> (List<T> 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<T>();
-
}
-
item.name = string.Format("{0:D3}", 0);
-
NGUITools.SetActiveSelf (item.gameObject, true);
-
return item;
-
}
-
-
static public List<GameObject> GetCanUseItemList (GameObject root)
-
{
-
List<GameObject> itemList = new List<GameObject> ();
-
Transform rootT = root.transform;
-
for (int i=0; i<rootT.childCount; ++i) {
-
GameObject go = rootT.GetChild (i).gameObject;
-
if (IsNotTemplateGameObject(go))
-
{
-
itemList.Add (go);
-
}
-
}
-
return itemList;
-
}
-
-
static public List<T> GetCanUseItemList<T> (GameObject root) where T : Component
-
{
-
List<T> childrenList = new List<T> ();
-
Transform rootT = root.transform;
-
for (int i=0; i<rootT.childCount; ++i) {
-
Transform child = rootT.GetChild (i);
-
T t = child.GetComponent<T> ();
-
if (t != null && IsNotTemplateGameObject(child.gameObject)) {
-
childrenList.Add (t);
-
}
-
}
-
return childrenList;
-
}
-
-
static public void UnActiveUnuseItem (List<GameObject> canUseList)
-
{
-
foreach (var item in canUseList) {
-
NGUITools.SetActiveSelf (item, false);
-
}
-
}
-
-
static public void UnActiveUnuseItem<T> (List<T> 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;
-
}
-
}
-
[/font]
复制代码
欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多Unity3D资源、Unity3D培训视频、Unity3D教程、Unity3D常见问题、Unity3D项目源码,【狗刨学习网】unity极致学院,致力于打造业内unity3d培训、学习第一品牌。
更多内容,请访问【狗刨学习网】unity极致学院
|
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。