Unity游戏开发笔记:对象池

对象池的几种写法

(1)全局中,这种对象只有一种,使用前只需要配置好一个这种对象。使用时,会根据这个对象模板智能创建。

    //本身作为对象存在
    //单例 与 自身集合 设置
    public static UITxfly Instance;
    public static List<UITxfly> List = new List<UITxfly>();
    private void Awake()
    {
        //除了唯一的一个单例,其他的都添加到对象池中
        if (Instance == null) Instance = this;
        else List.Add(this);
    }
    //获得一个空闲UITxfly
    private UITxfly OnGet()
    {
        UITxfly fx = null;
        //选择一个闲置的特效预制体
        if (List.Count > 0)
            for (int i = 0; i < List.Count; i++)
                    if (List[i].gameObject.activeSelf == false)
                        fx = List[i];

        //如果没有闲置的特效预制体
        if (fx == null)
            fx = Instantiate(Instance, Instance.transform.parent.transform);

        fx.gameObject.SetActive(true);
        return fx;
    }

(2)每个怪物都需要一个血条,场景中那么多怪物,那么这么多血条应该如果创建,赋值。此时,只需要一个血条模板足矣,怪物脚本中定义一个属于自己的血条,使用时,先检查自己的血条是否拥有(NULL),如果没有,那么根据那个通用的血条模板给自己创建一个即可。

    //使用血条时,要先检查自己的血条是否可用
    //如果不可用,根据传递过来的模板,给自己创建一个
    public Text txhp_prefab;
    private Text txhp_temp;
    private Text txhp
    {
        get
        {
            if (txhp_temp == null)
                txhp_temp = Instantiate(txhp_prefab, txhp_prefab.transform.parent);
            return txhp_temp;
        }
    }

(3)坦克大战中,坦克发射的炮弹可以进入对象池,因为需要使用的子弹足够多,但是有这样一种情况,每个坦克发射的炮弹种类是不一样的,所以不能仅仅设置一个对象池,此时应该每一个坦克拥有一个对象池。假如功能增加了,每个坦克可以发射多种子弹,那么有几种子弹就需要设置几个对象池了。


    //获取一个子弹
    public S_Bullet prefabBullet;       //子弹的预制体
    private Transform bulletParent;     //子弹集合的父物体
    public List<S_Bullet> bulletList;   //子弹集合(对象池)
    //获取一个子弹
    public S_Bullet Get()
    {
        if (bulletList == null) bulletList = new List<S_Bullet>();
        S_Bullet bullet = null;
        //在集合中寻找一个空闲的子弹
        for (int i = 0; i < bulletList.Count; i++)
            if (bulletList[i].gameObject.activeSelf == false)
                bullet = bulletList[i];
        //没有空闲的子弹
        if (bullet == null)
        {
            if (bulletParent == null)
                bulletParent = new GameObject("BulletList").GetComponent<Transform>();
            //创建一个新子弹
            bullet = Instantiate(prefabBullet, bulletParent).GetComponent<S_Bullet>();
            bulletList.Add(bullet);
        }
        bullet.gameObject.SetActive(true);
        return bullet;
    }

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值