最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
ngui scrollview 数量不够回滚到顶部
2015年01月30日 10:04
0 点赞
1 评论
更新于 2025-11-21 15:44
在处理 NGUI ScrollView 时,当元素数量不足可能会面临回滚到顶部的相关问题。本文将先介绍元素动态添加和删除的基本概念,然后给出详细的实例教程。
动态添加元素的基本思想
- 预制体准备:在编辑器中编辑好要添加的元素,将其制作成一个预制体(Prefab)。预制体是 Unity 中一种可重复使用的对象模板,方便在代码中动态生成相同的对象。
- 动态生成对象并添加到 Grid:在代码里,动态生成一个新的对象并将其加入到 Grid 对象的子对象中。这里会用到
Resources对象,该对象的使用方法可参考 Unity 官网。只要在Assets目录下存在一个Resources目录即可,其具体位置没有严格要求。 - 修改子对象属性:添加对象后,可以从这些对象中获取子对象并修改其属性。例如,若添加了十个武器对象,每个武器的图标(Icon)、名称和价格都可以设置为不同。
动态添加元素的代码实现
// 查找 UIGrid 对象
var ngui_grid = GameObject.Find("UIGrid");
// 获取 UIGrid 组件
UIGrid ngui_ui_grid = ngui_grid.GetComponent<UIGrid>();
// 从 Resources 加载预制体并添加为 UIGrid 的子对象
GameObject _gridItem = NGUITools.AddChild(ngui_grid, (GameObject)(Resources.Load("GridItemPrefab")));
// 为生成的对象重新命名
_gridItem.name = "gridItem" + indexSlot;
// 获取物品管理中的物品信息
var item = itemManage.Items[itemslot.Index];
// 获取 _gridItem 的所有子对象的 Transform
Transform[] allChildren = _gridItem.GetComponentsInChildren<Transform>();
foreach (Transform child in allChildren)
{
if (child.gameObject.tag == "GridItemIcon")
{
// 获取 UISprite 组件并设置图标名称
UISprite _ItemIcon = child.gameObject.GetComponent<UISprite>();
_ItemIcon.spriteName = item.Icon.name;
}
else if (child.gameObject.tag == "GridItemName")
{
// 获取 UILabel 组件并设置物品名称
UILabel _ItemName = child.gameObject.GetComponent<UILabel>();
_ItemName.text = item.Name + " " + itemslot.Index;
}
else if (child.gameObject.tag == "GridItemPrice")
{
// 获取 UILabel 组件并设置物品价格
UILabel _ItemPrice = child.gameObject.GetComponent<UILabel>();
_ItemPrice.text = item.Price + "$";
}
else
{
// 其他情况不做处理
}
}
// 加入这个标志,可以让元素添加之后,Grid 对元素进行重新排列
ngui_ui_grid.repositionNow = true;
return;
元素删除的实现
元素删除的代码实现
for (int k = 0; k < ngui_grid.transform.childCount; k++)
{
// 获取 UIGrid 的子对象
GameObject go = ngui_grid.transform.GetChild(k).gameObject;
// 销毁子对象
Destroy(go);
// 这个标记会让元素立即重新排列
ngui_ui_grid.Reposition();
}
通过以上动态添加和删除元素的方法,可以更好地管理 NGUI ScrollView 中的元素,从而解决可能出现的数量不够回滚到顶部等相关问题。