ngui scrollview 数量不够回滚到顶部

2015年01月30日 10:04 0 点赞 1 评论 更新于 2025-11-21 15:44

在处理 NGUI ScrollView 时,当元素数量不足可能会面临回滚到顶部的相关问题。本文将先介绍元素动态添加和删除的基本概念,然后给出详细的实例教程。

动态添加元素的基本思想

  1. 预制体准备:在编辑器中编辑好要添加的元素,将其制作成一个预制体(Prefab)。预制体是 Unity 中一种可重复使用的对象模板,方便在代码中动态生成相同的对象。
  2. 动态生成对象并添加到 Grid:在代码里,动态生成一个新的对象并将其加入到 Grid 对象的子对象中。这里会用到 Resources 对象,该对象的使用方法可参考 Unity 官网。只要在 Assets 目录下存在一个 Resources 目录即可,其具体位置没有严格要求。
  3. 修改子对象属性:添加对象后,可以从这些对象中获取子对象并修改其属性。例如,若添加了十个武器对象,每个武器的图标(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 中的元素,从而解决可能出现的数量不够回滚到顶部等相关问题。