博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity框架与资源打包
阅读量:5937 次
发布时间:2019-06-19

本文共 2436 字,大约阅读时间需要 8 分钟。

对象池

一种通用型的技术,在其他语言中也会用到

  1. 线程池、网络连接池,池是一个思想,将不用的东西暂时用池存起来,等到再次使用的时候再调出来用,节省CPU的调度
  1. 对象
    C#的任何一个类都可以实例化一个对象Object

Unity中的游戏对象GameObject

  1. 思路
    最开始的时候,池中没有对象,需要生成。用完之后放到池中。再次使用的时候再从池中获取

3.1 回收对象

把对象放到池中

3.2 获取对象

从池中获取对象

3.3 代码实现

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool

{

region 单例

// 声明单例

private static ObjectPool Instance;

///

/// 获取单例
///
/// The instance.
/// Res path.
public static ObjectPool GetInstance(string resPath = "")
{
if (Instance == null)
{
if (resPath != "")
Instance = new ObjectPool(resPath);
else
Instance = new ObjectPool();
}
Instance.UpdateResourcePath(resPath);
return Instance;
}
// 构造函数
private ObjectPool()
{
prefabs = new Dictionary();
pools = new Dictionary>();
}
private ObjectPool(string resPath)
{
prefabs = new Dictionary();
pools = new Dictionary>();
resourcePath = resPath;
}

endregion

region 对象预设体资源管理

// 资源加载路径

private string resourcePath;
// 用字典存储所有的预设体
private Dictionary prefabs;
// 更新预设体加载路径
private void UpdateResourcePath(string resPath)
{
resourcePath = resPath;
}

// 获取预设体

private GameObject GetPrefab(string prefabName)
{
// 如果包含预设体,直接返回
if (prefabs.ContainsKey(prefabName))
return prefabs[prefabName];
// 如果不包含预设体,添加新的预设体,并返回
return LoadPrefab(prefabName);
}
// 加载预设体
private GameObject LoadPrefab(string prefabName)
{
// 拼接路径
string path = "";
if (resourcePath != "")
{
path += resourcePath;
}
// 加载预设体
GameObject obj = Resources.Load(path + prefabName);
// 存入字典
if (obj != null)
prefabs.Add(prefabName, obj);
// 返回
return obj;
}

endregion

region 对象池

// 对象池

private Dictionary> pools;

///

/// 回收对象
///
/// Object.
public void RecycleObject(GameObject obj)
{
// 非激活
obj.SetActive(false);
// 获取对象名称
string objName = obj.name.Replace("(Clone)", "");
// 判断有无该类对象池
// 如果没有,实例化一个子池
if (!pools.ContainsKey(objName))
pools.Add(objName, new List());
// 存入
pools[objName].Add(obj);
}

///

/// 获取对象
///
/// The object.
/// Object name.
/// Pool event.
public GameObject SpawnObject(string objName, System.Action poolEvent = null)
{
// 声明一个输出结果
GameObject result = null;
// 如果有池,并且池中有对象
if (pools.ContainsKey(objName) && pools[objName].Count > 0)
{
result = poolsobjName;
pools[objName].Remove(result);
}
// 如果没有池,或者池中没有对象,需要生成
else
{
// 拿到预设体
GameObject prefab = GetPrefab(objName);
if (prefab != null)
result = GameObject.Instantiate(prefab);
}
// 激活
result.SetActive(true);

// 执行事件

if (result && poolEvent != null)
poolEvent(result);

// 返回结果

return result;
}

endregion

}

转载地址:http://dittx.baihongyu.com/

你可能感兴趣的文章
博客作业03--栈和队列
查看>>
H5小游戏的坑点小结
查看>>
foxmail同步QQ邮箱里的所有文件夹
查看>>
下载网站原代码步骤
查看>>
11.2---字符串数组排序,删除变位词(CC150)
查看>>
IIS启动网站
查看>>
SQL Server 的 6 种隔离级别
查看>>
EnumDescription
查看>>
css3之calc()
查看>>
Search a 2D Matrix II
查看>>
Linux-FTP
查看>>
php写日志函数
查看>>
开源性能测试工具Locust使用篇(二)
查看>>
开源 CMS系统 / SNS系统 / BBS系统
查看>>
LeetCode--007--整数反转(java)
查看>>
K - Ignatius and the Princess IV
查看>>
Latex学习(标题,子标题)
查看>>
matlab练习程序(最大流/最小割)
查看>>
CentOS安装中文支持
查看>>
Java内部类详解
查看>>