对象池简单实现

1、对象池

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameObjectPool : MonoBehaviour
{
    public GameObject prefab;
    public int maxPoolSize = 100;
    private Queue<GameObject> pool = new Queue<GameObject>();
    void Start()
    {
        this.EnLargePool();
    }
    private void EnLargePool()
    {
        for (int i = 0; i < maxPoolSize; i++)
        {
            GameObject obj = Instantiate(prefab, transform);
            pool.Enqueue(obj);
            obj.SetActive(false);
        }
    }
    public GameObject GetObj()
    {
        if (pool.Count==0)
        {
            this.EnLargePool();
        }
        GameObject obj =  pool.Dequeue();
        obj.SetActive(true);
        return obj;
    }
    public void ReturnObj(GameObject obj)
    {
        pool.Enqueue(obj);
        obj.SetActive(false);

    }
}

2、发生器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Generator : MonoBehaviour
{
    // Start is called before the first frame update

    private GameObjectPool pool;
    public GameObject poolPrefab;
    float spawnTimer = 0f;
    public float spawnInterval = 1f;
    void Start()
    {
        pool = poolPrefab.GetComponent<GameObjectPool>();
    }

    // Update is called once per frame
    void Update()
    {
        spawnTimer += Time.deltaTime;
        if(spawnTimer>= spawnInterval)
        {
            spawnTimer = 0;
            GameObject prefab = pool.GetObj();
            prefab.GetComponent<Renderer>().material.color= Color.red;
            prefab.transform.position = this.transform.position;
           
        }
    }

 
}

3、收集器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Collection : MonoBehaviour
{
    private GameObjectPool pool;
    public GameObject poolPrefab;
    // Start is called before the first frame update
    void Start()
    {
        pool = poolPrefab.GetComponent<GameObjectPool>();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    private void OnCollisionEnter(Collision collision)
    {
        pool.ReturnObj(collision.gameObject);
    }
}

适当调整对象池的容量,来防止多次扩容和产生GC问题。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值