纳金网

标题: 关于使用PoolManager 的教程(转载) [打印本页]

作者: 王者再临    时间: 2014-12-28 17:43
标题: 关于使用PoolManager 的教程(转载)
在开发项目中使用 unity3d只带的 Resource.Load 在游戏中频繁加载游戏资,必然导致游戏卡顿。于是就有了使用PoolManager 的想法,但是怎么使用好PoolManager 特别是通过代码来管理。

这里给出一个例子。
现在模拟  3 个场景 A   B  C    A  是游戏进入画面 , B 是游戏登录后的主界面, C 是游戏战斗场景等....

【界面展示】
220114z9q23azyytltq2nw.png
点击 Start 按钮切换场景到 B (登录成功 主UI界面)
220248p4yd184ymgfddm0f.png
点击 B->C  到战斗场景
220432lzeeremalxmk636l.png
------------------------------
【创建过程】
A 场景中  A 挂上脚本
  1. public class ALoader : MonoBehaviour
  2. {
  3.     void OnGUI()
  4.     {
  5.         if (GUILayout.Button("Start!"))
  6.             Application.LoadLevel("B");
  7.     }
  8. }
复制代码

A 场景 ClinetApp  加上 脚本
  1. public class ClientApp : MonoBehaviour
  2. {
  3.         // Use this for initialization
  4.         void Start () {
  5.         GamePoolManager.Instance();
  6.         DontDestroyOnLoad(this);
  7.         }
  8. }
复制代码

B 场景 B 挂上脚本 && 绑定 cube 预制
  1. public class BLoader : MonoBehaviour {
  2.     public  GameObject cube;
  3.     int i = 0;
  4.         // Use this for initialization
  5.         void Start () {
  6.         LoadData();
  7.         }
  8.        
  9.         // Update is called once per frame
  10.         void Update () {
  11.         if (i < 100000)
  12.         {
  13.             GamePoolManager.Instance().Spawn("Cube");
  14.             i++;
  15.         }
  16.         }

  17.     void OnGUI()
  18.     {
  19.         if (GUILayout.Button("B->C"))
  20.         {
  21.             GamePoolManager.Instance().DestroyAll();
  22.             Application.LoadLevel("C");
  23.         }
  24.     }

  25.     private void LoadData()
  26.     {
  27.         if(null!=cube)
  28.           GamePoolManager.Instance().createPref(cube.transform,"Cube");
  29.     }
  30. }
复制代码

C 场景 C 挂上脚本 && 绑定 cube 预制
  1. using UnityEngine;
  2. using System.Collections;

  3. public class CLoader : MonoBehaviour {
  4.     public GameObject cube;
  5.     int i = 0;

  6.         // Use this for initialization
  7.         void Start () {
  8.         LoadData();
  9.         }
  10.        
  11.         // Update is called once per frame
  12.         void Update () {
  13.         if (i < 10000)
  14.         {
  15.             GamePoolManager.Instance().Spawn("Sphere");
  16.             i++;
  17.         }
  18.         }

  19.     void OnGUI()
  20.     {
  21.         if (GUILayout.Button("C->B"))
  22.         {
  23.             GamePoolManager.Instance().DestroyAll();
  24.             Application.LoadLevel("B");
  25.         }
  26.     }

  27.     private void LoadData()
  28.     {
  29.         if (null != cube)
  30.             GamePoolManager.Instance().createPref(cube.transform, "Sphere");
  31.     }
  32. }
复制代码

最后组要GamePool单例脚本
  1. public class GamePoolManager{
  2.     private static GamePoolManager _instance;
  3.     private SpawnPool _spawnPool;
  4.     public GameObject go;
  5.     private System.Collections.Generic.Dictionary<string, Transform> _dir;

  6.     private GamePoolManager()
  7.     {
  8.         go = new GameObject("fight");
  9.         go.AddComponent<NotDestroy>();
  10.         _spawnPool = go.AddComponent<SpawnPool>();
  11.         _spawnPool.name = "fight";
  12.         _dir = new System.Collections.Generic.Dictionary<string, Transform>();
  13.     }

  14.     public Transform Spawn(string name)
  15.     {
  16.         Transform tr =null;
  17.         if (string.IsNullOrEmpty(name)) return tr;
  18.         if (_dir.TryGetValue(name, out tr))
  19.         {
  20.             tr=_spawnPool.Spawn(tr);
  21.             tr.parent = null;
  22.         }
  23.             return tr;
  24.     }

  25.     public void DestroyAll()
  26.     {
  27.         //_spawnPool.prefabs.Clear();
  28.         _spawnPool._perPrefabPoolOptions.Clear();
  29.         _dir.Clear();
  30.     }

  31.     public void createPref(Transform tr,string name)
  32.     {
  33.         if (tr != null)
  34.         {
  35.             PrefabPool prefabPool = new PrefabPool(tr);
  36.             
  37.             prefabPool.preloadAmount = 0;      // This is the default so may be omitted
  38.             prefabPool.cullDespawned = true;
  39.             prefabPool.cullDelay = 1;

  40.             _dir.Add(name, tr);
  41.             _spawnPool._perPrefabPoolOptions.Add(prefabPool);
  42.         }
  43.     }

  44.     public static GamePoolManager Instance()
  45.     {
  46.        if (null == _instance)
  47.             _instance = new GamePoolManager();
  48.         return _instance;
  49.     }
  50. }
复制代码



作者: tianhett    时间: 2014-12-28 22:45
涨姿势了。。。。。。。。
作者: HIDEOKOJIMA    时间: 2014-12-28 22:52
Thanks for sharing this one !
作者: acepig    时间: 2015-1-20 10:14

Thanks for sharing this one !
作者: hisamekenji    时间: 2015-1-20 10:23
感谢分享~~~~~~~~~~~




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5