前言
最近在做一个飞机大战的小游戏,素材都是取自微信打飞机的,研究一下对象池,
游戏中需要重复实例化和销毁的游戏物体,比如子弹,敌机。通过对象池的使用可以优化游戏性能。
大致做法就是:
1 创建对象池,将频繁使用的游戏物体在对象池中预加载
2 在游戏过程中,需要使用时,将游戏物体从对象池中取出来
3 在游戏物体使用结束后,不用的时候不要把它直接Destory掉,而是SetActive(false)。
这样当你再次使用的时候只需要SetActivie(true) 这样对应这个游戏对象来说 它只会执行OnEnable()这一个方法,所以载入速度是最快的。
4 将对象池中的游戏物体,隔一段时间,定期清理掉(也就是Destory掉)
5 通过对象池的使用,避免了在游戏过程中频繁的实例化和销毁物体,从而提高游戏性能。
雨松大大有介绍对象池的用法和插件:Unity3D研究院之初探PoolManager插件(七十四)
动态的给内存池里面加对象
实际游戏中往往我们需要动态的去载入一些无法提前预知的游戏对象,
所以初始化内存池的操作建议还是在脚本里面来完成。
在飞机大战这个游戏中。有:三种敌机类型,两种子弹类型,两种奖励物品。
这里我们看下 敌机和奖励物品 是如何添加到对象池并且在游戏中使用的
using UnityEngine;
using System.Collections;
using PathologicalGames;
public class SpawnTest : MonoBehaviour {
public GameObject prefab;
//对象池
SpawnPool spawnPool;
//池子中的一类对象
PrefabPool refabPool;
// Use this for initialization
void Start () {
spawnPool = PoolManager.Pools["Spawn"];
if (!spawnPool._perPrefabPoolOptions.Contains(refabPool))
{
refabPool = new PrefabPool(prefab.transform);
//默认初始化个Prefab
refabPool.preloadAmount = 10;
//开启限制
refabPool.limitInstances = true;
//无限取Prefab
refabPool.limitFIFO = true;
//限制池子里最大的Prefab数量
refabPool.limitAmount = 20;
//自动清理 暂时没有搞明白 可在之后的实践应用中研究
//开启自动清理池子
refabPool.cullDespawned = true;
//最终保留
refabPool.cullAbove = 10;
//多久清理一次
refabPool.cullDelay = 5;
//每次清理几个
refabPool.cullMaxPerPass = 5;
//初始化内存池
spawnPool._perPrefabPoolOptions.Add(refabPool);
spawnPool.CreatePrefabPool(spawnPool._perPrefabPoolOptions[spawnPool.Count]);
//清空池子 spawnPool.DespawnAll();
//清空池子中某个prefab的所有 spawnPool.Despawn(prefab.transform);
}
//每隔0.5秒,调用一次CreatPerfab方法
InvokeRepeating("CreatPerfab", 1f, 0.5f);
}
// Update is called once per frame
void Update () {
}
void CreatPerfab() {
float x = Random.Range(-2.15f, 2.15f);
//从对象池中取出物体,并且设置它的位置
spawnPool.Spawn(prefab.transform, new Vector3(x, transform.position.y, 0), Quaternion.identity);
}
}
在敌机prefab上挂上控制脚本,设置当下移到某一高度,就将其setActive(false)掉,即重新放回到对象池中去
void Update () {
this.transform.Translate( Vector3.down*speed*Time.deltaTime );
if(this.transform.position.y<=-5.6f){
this.gameObject.SetActive(false);
//Destroy(this.gameObject);
}
}
最后效果就是,飞机不停的出来,消失,再出来,再消失 ,其他功能也是如此,子弹,奖励物品都可以按照这种方式,再也不用担心游戏卡顿啦~~