Unity3D游戏开发之【NGUI】grid下面的item的重复利用

解决的问题



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


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


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


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


4、disable掉没用的item


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

  1. [font=微软雅黑]using UnityEngine;
  2. using System.Collections.Generic;
  3. //qq group :333417608
  4. public class UITools
  5. {
  6.         
  7.         /* usage:
  8.                 List<GameObject> canUseList = UITools.GetCanUseItemList(gridRoot);
  9.                 for (int i=0; i<totalData.Length; ++i)
  10.                 {
  11.                         GameObject go = UITools.GetNewItemObj(canUseList, gridRoot, prefab);
  12.                         // do init
  13.                 }
  14.                 UITools.UnActiveUnuseItem(canUseList);

  15.                 // prefab is the template
  16.          */ 

  17.         static public GameObject GetNewItemObj (List<GameObject> canUseList, GameObject root, GameObject prefab)
  18.         {
  19.                 GameObject go = null;
  20.                 if (canUseList.Count > 0) {
  21.                         go = canUseList [0];
  22.                         canUseList.RemoveAt (0);
  23.                 } else {
  24.                         go = NGUITools.AddChild (root, prefab);
  25.                 }
  26.                 NGUITools.SetActiveSelf (go, true);
  27.                 return go;
  28.         }
  29.         
  30.         static public T GetNewItemObj<T> (List<T> canUseList, GameObject root, GameObject prefab) where T : Component
  31.         {
  32.                 T item = null;
  33.                 if (canUseList.Count > 0) {
  34.                         item = canUseList [0];
  35.                         canUseList.RemoveAt (0);
  36.                 } else {
  37.                         item = NGUITools.AddChild (root, prefab).GetComponent<T>();
  38.                 }
  39.                 item.name = string.Format("{0:D3}", 0);
  40.                 NGUITools.SetActiveSelf (item.gameObject, true);
  41.                 return item;
  42.         }
  43.         
  44.         static public List<GameObject> GetCanUseItemList (GameObject root)
  45.         {
  46.                 List<GameObject> itemList = new List<GameObject> ();
  47.                 Transform rootT = root.transform;
  48.                 for (int i=0; i<rootT.childCount; ++i) {
  49.                         GameObject go = rootT.GetChild (i).gameObject;
  50.                         if (IsNotTemplateGameObject(go))
  51.                         {
  52.                                 itemList.Add (go);
  53.                         }
  54.                 }
  55.                 return itemList;
  56.         }
  57.         
  58.         static public List<T> GetCanUseItemList<T> (GameObject root) where T : Component
  59.         {
  60.                 List<T> childrenList = new List<T> ();
  61.                 Transform rootT = root.transform;
  62.                 for (int i=0; i<rootT.childCount; ++i) {
  63.                         Transform child = rootT.GetChild (i);
  64.                         T t = child.GetComponent<T> ();
  65.                         if (t != null && IsNotTemplateGameObject(child.gameObject)) {
  66.                                 childrenList.Add (t);
  67.                         }
  68.                 }
  69.                 return childrenList;
  70.         }
  71.         
  72.         static public void UnActiveUnuseItem (List<GameObject> canUseList)
  73.         {
  74.                 foreach (var item in canUseList) {
  75.                         NGUITools.SetActiveSelf (item, false);
  76.                 }
  77.         }
  78.         
  79.         static public void UnActiveUnuseItem<T> (List<T> canUseList) where T : Component
  80.         {
  81.                 foreach (var item in canUseList) {
  82.                         NGUITools.SetActiveSelf (item.gameObject, false);
  83.                 }
  84.         }
  85.         
  86.         static private bool IsNotTemplateGameObject(GameObject go)
  87.         {
  88.                 bool result = !go.name.ToLower().Contains("template_");
  89.                 if (!result && go.activeSelf)
  90.                 {
  91.                         NGUITools.SetActiveSelf(go, false);
  92.                 }
  93.                 return result;
  94.         }
  95. }
  96. [/font]
复制代码
欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多Unity3D资源Unity3D培训视频Unity3D教程Unity3D常见问题Unity3D项目源码,【狗刨学习网】unity极致学院,致力于打造业内unity3d培训、学习第一品牌。


更多内容,请访问【狗刨学习网】unity极致学院 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。