此次的实现效果是,将对象池可以批量管理,只需要提前将对象池的名字、预制体、最大数等配置好,存成资源配置文件,然后存于本地;运行时读取配置文件,将对象池信息存于字典中,当需要对应的实例对象时,只需给出对象的名字就可从对象池中取得。
[SerializeField]序列化字段,可将私有属性仍显示于Inspector面板。
虽然将批量对象放于字典,但访问时foreach不能一边访问一边修改,所以循环遍历字典时用for循环;
做了一个自定义菜单实现点击菜单时,创建资源配置文件,以便手动的批量配置对象池。
1. 对象信息及实例化取得对象
1.1 对象信息及方法(GameObjectPool.cs)
[Serializable],序列化;可将对象的属性显示于Inspector面板,以便手动配置。[SerializeField]序列化字段,可将私有属性仍显示于Inspector面板。
虽然将批量对象放于字典,但访问时foreach不能一边访问一边修改,所以循环遍历字典时用for循环;
用两个字典存放对象,一个为正在使用的对象字典,一个为空闲字典,当需要实例化时,先从空闲字典中取得;如果所有放于一个字典,当需要对象时则遍历整个字典,两个字典可以节约性能。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
/// <summary>
/// 资源池
/// 此资源池将实例化出的对象放于根目录,优化时可将同一类对象放于一个父对象下
/// </summary>
[Serializable]
public class GameObjectPool{
[SerializeField]//虽为私有成员,但加上[SerializeField]Inspector面板显示
public string name;
[SerializeField]
private GameObject prefab;
[SerializeField]
private int maxAmount;
[NonSerialized]
public List<GameObject> goActiveIsFalseList = new List<GameObject>();//空闲的实例(未被使用)
[NonSerialized]
public List<GameObject> goActiveIsTrueList = new List<GameObjec