飞机大战中对象池模式子弹使用

在B站上学习阿严教程,记录一下对象池模式的学习
在这里插入图片描述
由图,一共是四个步骤:
1 在Pool 脚本中生成预备对象。具体包括 Initialize()初始化队列,Copy() 复制预备对象并初始化禁用状态, 放入队列。
2 玩家进行开火,从PoolManager脚本中Release()找到对应的Pool.prefab(因为游戏中不会只有一个对象池),通过对象池管理器脚本中的字典< prefab, Pool >,对应到当前使用的对象是在哪个池子里。从中取出。
3 得到对应的池子,在池子Pool脚本中PreparedObject()返回队里的一个可用对象将状态设置为启用。
4 Pool脚本中,可用对象AvailableObject()一从队列头取出,马上放回队尾,供下次使用。

1:Pool.cs

public void Initialize(Transform parent)
    {
        queue = new Queue<GameObject>();

        this.parent = parent;

        for (var i = 0; i < size; i++)
        {
            queue.Enqueue(Copy());
        }
    }

    GameObject Copy()
    {
        var copy = GameObject.Instantiate(prefab, parent);
        copy.SetActive(false);
        return copy;
    }

2:
Player.cs

PoolManager.Release(projectile1, muzzleMiddle.position);

PoolManager.cs

	static Dictionary<GameObject, Pool> dictionary;

	public static GameObject Release(GameObject prefab)
    {
        if(!dictionary.ContainsKey(prefab))
        {
            return null;
        }
        return dictionary[prefab].PreparedObject();
    }

3:
Pool.cs

	public GameObject PreparedObject()
    {
        GameObject preparedObject = AvailableObject();

        preparedObject.SetActive(true);

        return preparedObject;
    }

4:Pool.cs

    GameObject AvailableObject()
    {
        GameObject availableObject = null;
        
        availableObject = queue.Dequeue();
        queue.Enqueue(availableObject);

        return availableObject;
    }

如何判断对象池应该有多大?
在PoolManager脚本中,写一个CheckPoolSize(),在Ondestroy时调用。主要内容就是判断当前队列的大小与我们预设的大小是否符合,不符合打印出来,调整预设大小。

private void OnDestroy()
    {
        CheckPoolSize(playProjectilePools);
    }

    void CheckPoolSize(Pool[] pools)
    {
        foreach(var pool in pools)
        {
            if(pool.RuntimeSize > pool.Size)
            {
                Debug.Log(
                    string.Format("Pool : {0} 的实际尺寸{1}大于预留尺寸{2}", 
                    pool.Prefab.name,
                    pool.RuntimeSize,
                    pool.Size));
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值