推荐阅读
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新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之UGUI | UGUI | Unity的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相关的技术文章、工具资源等。


评论记录:
回复评论: