开发者社区> 二哈卖豆腐> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Unity框架与资源打包

简介: 对象池一种通用型的技术,在其他语言中也会用到 池线程池、网络连接池,池是一个思想,将不用的东西暂时用池存起来,等到再次使用的时候再调出来用,节省CPU的调度 对象C#的任何一个类都可以实例化一个对象Object Unity中的游戏对象GameObject 思路最开始的时候,池中没有对象,需要生成。
+关注继续查看

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


  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

}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
动态资源技术JSP|Java与Html的美好相遇
前言JSP可以用简单易懂的方式表示为:Html+Java=JSP,JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过t...
56 0
收藏的博客 -- Nginx+Lua,OpenResty相关资源
收藏的博客 -- Nginx+Lua,OpenResty相关资源
67 0
uni-app 开源资源汇总
如下是使用 uni-app 的开源案例,我们相信还有更多优秀案例,没有被我们采集到,欢迎大家到 项目案例征集 提交。
8530 0
Unity是怎么打包APK文件的
大家看过一些第三方组件的接入文档都知道,在Unity里面有几个特殊的文件夹是跟打包APK有关的。首先我们就来了解一下,这些文件夹里面的内容是经历了哪些操作才被放到APK里面的呢? 在Unity的Assets目录下,Plugins/Android无疑是其中的重中之重,首先我们先来看一个常见的Plugins/Android目录是什么样子的。
4551 0
Unity读取AssetBundle资源全教程(所有读取方式)
读取/加载 AssetBundle 资源的多种方式 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) ...
1986 0
C#开源框架
原文:C#开源框架 Json.NET  http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。
1347 0
C/C++ 框架,类库,资源集合
很棒的 C/C++ 框架,类库,资源集合。 Awesome C/C++ Standard Libraries Frameworks Artificial Intelligence Asynchronous Event Loop Audio Biology Compressi...
1929 0
[unity3d]加载模型资源
将模型资源加载到场景中显示 1.从本地加载 void OnGUI() { if (GUILayout.Button("click")) { StartCoroutine(getmodel(...
945 0
访问动态链接库中的C++类和资源
面我们来介绍如何访问动态链接库中的C++类和资源。其具体操作步骤如下:(1)创建一个基于对话框的工程,工程名称为“AccessDll”。设计对话框资源如图1所示。 图1  对话框资源设计窗口(2)定义一个名称为CTextDlg的抽象类,因为需要访问动态链接库中的CTextDlg类,因此客户端需要定义一个框架,即抽象类CTextDlg。
879 0
112
文章
0
问答
文章排行榜
最热
最新