【Unity】写个Unity的泛型对象池,传子弹可以管理子弹,传特效可以管理特效

泛型对象池

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool<T> where T : MonoBehaviour //泛型约束
{
    private T prefab; // 存储要被管理的预设体组件
    private List<T> pool; // 存储对象的池子

    public ObjectPool(T prefab, int initialSize)
    {
        this.prefab = prefab;
        pool = new List<T>();
        // 根据传入的初始大小,实例化并存储预设体对象
        for (int i = 0; i < initialSize; i++)
        {
            T obj = Object.Instantiate(prefab);
            obj.gameObject.SetActive(false); // 隐藏对象
            pool.Add(obj); // 加入到对象池
        }
    }

    public T GetObject()
    {
        // 遍历对象池,寻找未被激活的对象
        foreach (T obj in pool)
        {
            if (!obj.gameObject.activeSelf)
            {
                obj.gameObject.SetActive(true); // 激活对象
                return obj;
            }
        }
        // 如果没有未被激活的对象,则实例化新对象并加入到对象池中
        T newObj = Object.Instantiate(prefab);
        pool.Add(newObj);
        return newObj;
    }

    public void ReturnObject(T obj)
    {
        obj.gameObject.SetActive(false); // 隐藏对象
    }
}

调用

using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float speed = 5f;

    private void Update()
    {
        // 在 Update 方法中移动子弹
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }

    private void OnBecameInvisible()
    {
        // 子弹离开屏幕时返回对象池
        BulletManager.Instance.ReturnBulletToPool(this.gameObject);
    }
}
using UnityEngine;

public class BulletManager : MonoBehaviour
{
    public static BulletManager Instance; // 单例模式

    public GameObject bulletPrefab; // 子弹的预设体
    public int initialPoolSize = 10; // 初始对象池大小

    private ObjectPool<Bullet> bulletPool; // 子弹对象池

    private void Awake()
    {
        Instance = this; // 初始化单例
    }

    private void Start()
    {
        bulletPool = new ObjectPool<Bullet>(bulletPrefab.GetComponent<Bullet>(), initialPoolSize); // 实例化子弹对象池
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Bullet bullet = bulletPool.GetObject(); // 从对象池中获取子弹对象
            bullet.transform.position = transform.position; // 设置子弹的初始位置
            bullet.gameObject.SetActive(true); // 激活子弹
        }
    }

    // 当子弹销毁时将其返回对象池
    public void ReturnBulletToPool(GameObject bullet)
    {
        bulletPool.ReturnObject(bullet.GetComponent<Bullet>());
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值