查看: 2212|回复: 4
打印 上一主题 下一主题

[其他] 关于使用PoolManager 的教程(转载)

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-12-28 17:43:57 |只看该作者 |倒序浏览
在开发项目中使用 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. }
复制代码


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

100

主题

3

听众

7683

积分

高级设计师

Rank: 6Rank: 6

纳金币
2378
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-12-28 22:45:22 |只看该作者
涨姿势了。。。。。。。。
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-12-28 22:52:42 |只看该作者
Thanks for sharing this one !
回复

使用道具 举报

0

主题

1

听众

1888

积分

助理设计师

Rank: 4

纳金币
0
精华
0

活跃会员

地板
发表于 2015-1-20 10:14:33 |只看该作者

Thanks for sharing this one !
回复

使用道具 举报

0

主题

6

听众

3697

积分

中级设计师

Rank: 5Rank: 5

纳金币
504
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2015-1-20 10:23:11 |只看该作者
感谢分享~~~~~~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-1-26 04:07 , Processed in 0.071043 second(s), 35 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部