unity飛機大戰(1)對象池

前言

最近在做一個飛機大戰的小遊戲,素材都是取自微信打飛機的,研究一下對象池,

遊戲中需要重複實例化和銷燬的遊戲物體,比如子彈,敵機。通過對象池的使用可以優化遊戲性能。

大致做法就是:

1 創建對象池,將頻繁使用的遊戲物體在對象池中預加載 

2 在遊戲過程中,需要使用時,將遊戲物體從對象池中取出來

3 在遊戲物體使用結束後,不用的時候不要把它直接Destory掉,而是SetActive(false)。 

這樣當你再次使用的時候只需要SetActivie(true) 這樣對應這個遊戲對象來說 它只會執行OnEnable()這一個方法,所以載入速度是最快的。

4 將對象池中的遊戲物體,隔一段時間,定期清理掉(也就是Destory掉)

5 通過對象池的使用,避免了在遊戲過程中頻繁的實例化和銷燬物體,從而提高遊戲性能。

雨松大大有介紹對象池的用法和插件:Unity3D研究院之初探PoolManager插件(七十四)

動態的給內存池裏面加對象


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);
		}
    }

最後效果就是,飛機不停的出來,消失,再出來,再消失 ,其他功能也是如此,子彈,獎勵物品都可以按照這種方式,再也不用擔心遊戲卡頓啦~~




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章