纳金网
标题:
关于使用PoolManager 的教程(转载)
[打印本页]
作者:
王者再临
时间:
2014-12-28 17:43
标题:
关于使用PoolManager 的教程(转载)
在开发项目中使用
unity3d
只带的 Resource.Load 在游戏中频繁加载游戏资,必然导致游戏卡顿。
于是就有了使用PoolManager 的想法,但是怎么使用好PoolManager 特别是通过代码来管理。
这里给出一个例子。
现在模拟 3 个场景 A B C A 是游戏进入画面 , B 是游戏登录后的主界面, C 是游戏战斗场景等....
【界面展示】
2014-12-28 17:43 上传
下载附件
(7.04 KB)
点击 Start 按钮切换场景到 B (登录成功 主UI界面)
2014-12-28 17:43 上传
下载附件
(5.35 KB)
点击 B->C 到战斗场景
2014-12-28 17:43 上传
下载附件
(8.91 KB)
------------------------------
【创建过程】
A 场景中 A 挂上脚本
public class ALoader : MonoBehaviour
{
void OnGUI()
{
if (GUILayout.Button("Start!"))
Application.LoadLevel("B");
}
}
复制代码
A 场景 ClinetApp 加上 脚本
public class ClientApp : MonoBehaviour
{
// Use this for initialization
void Start () {
GamePoolManager.Instance();
DontDestroyOnLoad(this);
}
}
复制代码
B 场景 B 挂上脚本 && 绑定 cube 预制
public class BLoader : MonoBehaviour {
public GameObject cube;
int i = 0;
// Use this for initialization
void Start () {
LoadData();
}
// Update is called once per frame
void Update () {
if (i < 100000)
{
GamePoolManager.Instance().Spawn("Cube");
i++;
}
}
void OnGUI()
{
if (GUILayout.Button("B->C"))
{
GamePoolManager.Instance().DestroyAll();
Application.LoadLevel("C");
}
}
private void LoadData()
{
if(null!=cube)
GamePoolManager.Instance().createPref(cube.transform,"Cube");
}
}
复制代码
C 场景 C 挂上脚本 && 绑定 cube 预制
using UnityEngine;
using System.Collections;
public class CLoader : MonoBehaviour {
public GameObject cube;
int i = 0;
// Use this for initialization
void Start () {
LoadData();
}
// Update is called once per frame
void Update () {
if (i < 10000)
{
GamePoolManager.Instance().Spawn("Sphere");
i++;
}
}
void OnGUI()
{
if (GUILayout.Button("C->B"))
{
GamePoolManager.Instance().DestroyAll();
Application.LoadLevel("B");
}
}
private void LoadData()
{
if (null != cube)
GamePoolManager.Instance().createPref(cube.transform, "Sphere");
}
}
复制代码
最后组要GamePool单例脚本
public class GamePoolManager{
private static GamePoolManager _instance;
private SpawnPool _spawnPool;
public GameObject go;
private System.Collections.Generic.Dictionary<string, Transform> _dir;
private GamePoolManager()
{
go = new GameObject("fight");
go.AddComponent<NotDestroy>();
_spawnPool = go.AddComponent<SpawnPool>();
_spawnPool.name = "fight";
_dir = new System.Collections.Generic.Dictionary<string, Transform>();
}
public Transform Spawn(string name)
{
Transform tr =null;
if (string.IsNullOrEmpty(name)) return tr;
if (_dir.TryGetValue(name, out tr))
{
tr=_spawnPool.Spawn(tr);
tr.parent = null;
}
return tr;
}
public void DestroyAll()
{
//_spawnPool.prefabs.Clear();
_spawnPool._perPrefabPoolOptions.Clear();
_dir.Clear();
}
public void createPref(Transform tr,string name)
{
if (tr != null)
{
PrefabPool prefabPool = new PrefabPool(tr);
prefabPool.preloadAmount = 0; // This is the default so may be omitted
prefabPool.cullDespawned = true;
prefabPool.cullDelay = 1;
_dir.Add(name, tr);
_spawnPool._perPrefabPoolOptions.Add(prefabPool);
}
}
public static GamePoolManager Instance()
{
if (null == _instance)
_instance = new GamePoolManager();
return _instance;
}
}
复制代码
作者:
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