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. /* usage:
  7. List<GameObject> canUseList = UITools.GetCanUseItemList(gridRoot);
  8. for (int i=0; i<totalData.Length; ++i)
  9. {
  10. GameObject go = UITools.GetNewItemObj(canUseList, gridRoot, prefab);
  11. // do init
  12. }
  13. UITools.UnActiveUnuseItem(canUseList);
  14. // prefab is the template
  15. */
  16. static public GameObject GetNewItemObj (List<GameObject> canUseList, GameObject root, GameObject prefab)
  17. {
  18. GameObject go = null;
  19. if (canUseList.Count > 0) {
  20. go = canUseList [0];
  21. canUseList.RemoveAt (0);
  22. } else {
  23. go = NGUITools.AddChild (root, prefab);
  24. }
  25. NGUITools.SetActiveSelf (go, true);
  26. return go;
  27. }
  28. static public T GetNewItemObj<T> (List<T> canUseList, GameObject root, GameObject prefab) where T : Component
  29. {
  30. T item = null;
  31. if (canUseList.Count > 0) {
  32. item = canUseList [0];
  33. canUseList.RemoveAt (0);
  34. } else {
  35. item = NGUITools.AddChild (root, prefab).GetComponent<T>();
  36. }
  37. item.name = string.Format("{0:D3}", 0);
  38. NGUITools.SetActiveSelf (item.gameObject, true);
  39. return item;
  40. }
  41. static public List<GameObject> GetCanUseItemList (GameObject root)
  42. {
  43. List<GameObject> itemList = new List<GameObject> ();
  44. Transform rootT = root.transform;
  45. for (int i=0; i<rootT.childCount; ++i) {
  46. GameObject go = rootT.GetChild (i).gameObject;
  47. if (IsNotTemplateGameObject(go))
  48. {
  49. itemList.Add (go);
  50. }
  51. }
  52. return itemList;
  53. }
  54. static public List<T> GetCanUseItemList<T> (GameObject root) where T : Component
  55. {
  56. List<T> childrenList = new List<T> ();
  57. Transform rootT = root.transform;
  58. for (int i=0; i<rootT.childCount; ++i) {
  59. Transform child = rootT.GetChild (i);
  60. T t = child.GetComponent<T> ();
  61. if (t != null && IsNotTemplateGameObject(child.gameObject)) {
  62. childrenList.Add (t);
  63. }
  64. }
  65. return childrenList;
  66. }
  67. static public void UnActiveUnuseItem (List<GameObject> canUseList)
  68. {
  69. foreach (var item in canUseList) {
  70. NGUITools.SetActiveSelf (item, false);
  71. }
  72. }
  73. static public void UnActiveUnuseItem<T> (List<T> canUseList) where T : Component
  74. {
  75. foreach (var item in canUseList) {
  76. NGUITools.SetActiveSelf (item.gameObject, false);
  77. }
  78. }
  79. static private bool IsNotTemplateGameObject(GameObject go)
  80. {
  81. bool result = !go.name.ToLower().Contains("template_");
  82. if (!result && go.activeSelf)
  83. {
  84. NGUITools.SetActiveSelf(go, false);
  85. }
  86. return result;
  87. }
  88. }
  89. [/font]

复制代码

欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多Unity3D资源Unity3D培训视频Unity3D教程Unity3D常见问题Unity3D项目源码,【狗刨学习网】unity极致学院,致力于打造业内unity3d培训、学习第一品牌。

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

时间: 2024-12-31 20:35:09

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

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D]Unity3D游戏开发之从Unity3D到Eclipse

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述

各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在研究了Unity3D Mecanim动画系统的重定向特性后,今天我们继续来探索Mecanim动画系统更多的特性吧.今天博主想和大家分享的是ACT游戏中的三连击效果的实现,由于Unity3D目前存在Animation和Animator两种类型的动画组件,因此本文将分别讲这两种类型的动画组件的三连击效果的实现,其中Animation组件是Unity3.5以下版本所使用的动画组件,An

Unity3D游戏开发之3DMAX 灯光

Unity3D游戏开发之3DMAX 灯光 欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一.3DMAX 五种光源 1.Ommi Light 泛光灯:可以从一点向四周均匀照射的点光源. 2.Target Spotlight 目标聚光灯:一种投射光束,影响光束内被照射的物体,可以投影 阴影,照射范围可以指定. 3.

Unity3D游戏开发之Unity3D动画与Mecanim动画系统

Unity3D游戏开发之Unity3D动画与Mecanim动画系统 欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. Mecanim是Unity新增的动画系统,其功能强大而灵活,让人类和非人类角色栩栩如生.Mecanim的重定向极大的提供了工作效率,而且占用极少CPU周期.使用从Unity资源商店找到的动画资源,或

unity3D游戏开发之iTween介绍和用法

unity3D游戏开发之iTween介绍和用法 一.iTween 介绍 iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出.让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等 二.iTween 原理 iTween的核心是数值插值,简单说就是给iTween两个数值(开始值,结束值),它会自动生成一些中间值. 三.iTween 下载:  从官网http://itween.pixelplacement.com下载 主要文件有两个iTween.cs

Unity3D游戏开发之Unity打包APK

Unity3D游戏开发之Unity打包APK 1.安装JDK 2.配置JDK 3.在Paht的变量值后面加分号,把D:\android\adt-bundle-windows-x86-20131030\sdk\tools放在Path后面.[狗刨学习网] 4.点击菜单栏中的Edit-->Preferences 看Android SDK Location这个选项 浏览你的模拟器路径. 5.点击 File-Build Settings 然后再 点击Add Current 添加你的场景.再 点击Switc