首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【SKFramework框架核心模块】3-8、对象池模块

  • 25-03-03 16:42
  • 2304
  • 5476
blog.csdn.net

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • QQ群:398291828
  • 小红书
  • 小破站

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

【Unity3D框架】SKFramework框架完全教程《全网最全》-专栏文章目录:
http://iyenn.com/rec/1695645.html

二、正文

2-1、介绍

对象池是一种创建型设计模式 ,当需要创建对象时,先从对象池中获取,如果对象池中没有符合条件的对象,再创建新对象。

同样,当对象需要销毁时,不做真正销毁,而是将其存放到对象池。

减少频繁创建和销毁对象带来的成本,实现对象的缓存和复用。

SKFramework框架中将对象池划分为两种:

  • ObjectPool:通过new运算符创建对象的对象池
  • MonoObjectPool:对象类继承自MonoBehaviour,需要自定义创建方法的对象池

接下来就来看一下如何使用。

2-2、使用说明

2-2-1、ObjectPool以一个Person类为例,为其继承IPoolable接口,并实现接口中属性和方法:

using SK.Framework;
using SK.Framework.ObjectPool;
using UnityEngine;

public class UseObjectPool : MonoBehaviour
{
    void Start()
    {
        // 分配对象
        Person person = SKFramework.Module<ObjectPool>().Allocate<Person>();
        person.Name = "CoderZ";
        person.Age = 28;
        person.Weight = 60f;

        //设置对象池的最大缓存数量
        SKFramework.Module<ObjectPool>().SetMaxCacheCount<Person>(100);

        // 回收对象
        SKFramework.Module<ObjectPool>().Recycle(person);
    }
}
public class Person : IPoolable
{
    public string Name { get; set; }
    public int Age { get; set; }
    public float Weight { get; set; }
    public bool isRecycled { get; set; }

    public void OnRecycled()
    {
        Name = null;
        Age = 0;
        Weight = 0f;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

2-2-2、MonoObjectPool以一个Bullet子弹类为例,它挂载于子弹的Prefab预制体上

子弹类,继承于IPoolable:

using UnityEngine;
using SK.Framework;
using SK.Framework.ObjectPool;

public class Bullet : MonoBehaviour, IPoolable
{
    public bool isRecycled { get; set; }

    public void OnRecycled()
    {
        gameObject.SetActive(false);
        transform.localPosition = Vector3.zero;
        transform.localRotation = Quaternion.identity;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Mono类型的对象池,我们在使用之前首先需要自定义一个创建方法:

using SK.Framework;
using SK.Framework.ObjectPool;
using UnityEngine;

public class UseObjectPool : MonoBehaviour
{
    //子弹预制体
    [SerializeField] private GameObject bulletPrefab;

    void Start()
    {
        SKFramework.Module<ObjectPool>().CreateBy(() =>
        {
            var instance = Instantiate(bulletPrefab);
            instance.transform.SetParent(transform);
            instance.transform.localPosition = Vector3.zero;
            instance.transform.localRotation = Quaternion.identity;
            instance.SetActive(true);
            Bullet bullet = instance.GetComponent<Bullet>();
            return bullet;
        });
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

2-3、实现及代码分析

抽象的对象池接口IObjectPool:
在这里插入图片描述
可用的对象池接口IPoolable:
在这里插入图片描述
它们的关系就相当于手枪和子弹,先有手枪IObjectPool,但是需要子弹IPoolable去匹配。

如果想要扩展其他对象池,也可以再抽象出来一个类似于IPoolable的接口。

ObjectPool就是实现对象池的地方:
在这里插入图片描述
分配和回收用了堆栈。

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
GameFramework框架框架Unity之GameFramework框架快速应用、使用说明、源码分析等文章合集。
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
Unity爱好者社区
微信公众号
分享Unity相关的技术文章、工具资源等。
注:本文转载自blog.csdn.net的恬静的小魔龙的文章"https://itmonon.blog.csdn.net/article/details/144261806"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top