【原创】Unity3D ScrollView 使用对象池动态添加与删除元素

ScrollView 在开发的过程中使用非常普遍,但是我们在动态处理元素的时候,如果频繁的创建与销毁元素,那么 ScrollView 的性能也会降低,因为 UIGrid 自身并没有对象池,所以需要我们额外去处理。

先来看看最终效果,默认界面如图:

【原创】Unity3D ScrollView 使用对象池动态添加与删除元素_第1张图片

当点击装备的时候,程序会筛选出装备分类的物品并显示,那么多出来的子元素会从 UIGrid 对象中删除,并被缓存到对象池中,等待需要的时候再次赋给 UIGrid,这样元素的个数只与对象的最大个数相同,如图:

【原创】Unity3D ScrollView 使用对象池动态添加与删除元素_第2张图片

先来搭建测试场景,我们需要额外添加一个 CacheItem 对象,并且不激活这个对象,因为不希望缓存起来的对象能被显示,如图:

【原创】Unity3D ScrollView 使用对象池动态添加与删除元素_第3张图片

限于篇幅,因为与核心模块无关的代码比较多,所以这儿只展示核心模块代码的创建与使用,剩下的代码可以直接下载源代码进行查看,新建立一个新的 C# 类,取名:StoreItemList.cs 代码如下:

using UnityEngine;
using System.Collections.Generic;

public class StoreItemList : MonoBehaviour 
{
	/// 
	/// 物品格子
	/// 
	public StoreItem storeItem;

	/// 
	/// 缓存元件
	/// 
	public GameObject cacheItem;

	/// 
	/// uiGrid 对象
	/// 
	private UIGrid uiGrid;

	/// 
	/// 物品格子列表
	/// 
	private IList itemList;

	/// 
	/// 缓存格子列表,可以直接使用 ItemList 列表,但这样会稍微麻烦一些
	/// 
	private IList cacheItemList;

	void Awake()
	{
		this.uiGrid = this.GetComponentInParent ();
		this.itemList = new List ();
		this.cacheItemList = new List ();
	}

	/// 
	/// 更新物品栏
	/// 
	public void ChangeData(IList modelList)
	{
		GameObject newObject = null;
		StoreItem newItem = null;

		int dataLength = modelList.Count;
		int itemLength = this.itemList.Count;
		int index = 0;

		for(index = 0; index < dataLength; index ++)
		{
			if(index < itemLength)
			{
				newObject = this.itemList[index].gameObject;
				newItem = this.itemList[index];
			}
			else
			{
				// 如果有缓存格子数据
				if(this.cacheItemList.Count > 0)
				{
					newObject = this.cacheItemList[0].gameObject;
					newItem = this.cacheItemList[0];

					newObject.transform.parent = this.transform;
					this.cacheItemList.RemoveAt(0);

					this.itemList.Add(newItem);
				}else{
					newObject = (GameObject)Instantiate(this.storeItem.gameObject);
					if(newObject != null)
					{
						// 设置父对象
						newObject.transform.parent = this.transform;
						newItem = newObject.GetComponent();
						// 物品脚本
						if(newItem != null)
						{
							newItem.Init(OnItemCallback);
							this.itemList.Add(newItem);
						}
					}
				}
			}
			if(newObject != null)
			{
				newObject.transform.localPosition = new Vector3(0f, 0f, 0f);
				newObject.transform.localScale = new Vector3(1f, 1f, 1f);
			}
			// 更新物品格子数据
			if(newItem != null) newItem.ChangeData(modelList[index]);
		}
		// 如果格子超出
		while(index < this.itemList.Count)
		{
			int endIndex = this.itemList.Count - 1;
			// 从 UIGrid 中删除
			this.itemList[endIndex].transform.parent = this.cacheItem.transform;
			// 添加到缓存列表中
			this.cacheItemList.Add(this.itemList[endIndex]);
			// 从列表中删除
			this.itemList.RemoveAt(endIndex);
		}

		// 刷新 UI
		this.uiGrid.Reposition ();
	}

	private void OnItemCallback(ItemModel itemModel)
	{

	}
}

然后把 StoreItemList.cs 挂载到 GridList 对象上(包含UIGrid组件),如图

【原创】Unity3D ScrollView 使用对象池动态添加与删除元素_第4张图片

最后运行游戏,查看效果。

下载地址:链接: http://pan.baidu.com/s/1ntxge97 密码: u9hd

转载于:https://my.oschina.net/wangjiajun/blog/483642

你可能感兴趣的:(游戏,c#,ui)