unity-------------------打包BuildAssetBundles的使用
unity5打包机制下,一种资源打ab和资源管理的方案。
1.打ab:
1.设置平台
2.清楚所有资源的assetbundlename:
string[] abNameArr = AssetDatabase.GetAllAssetBundleNames();
AssetDatabase.RemoveAssetBundleName(abNameArr[i],true);
3.创建ab目录
4.根据配置把需要打包的资源找出来,对每一个setAbName
5.调用BuildPipeline.BuildAssetBundles(ab文件夹路径,BuildAssetBundleOptions.DeterministicAssetBundle,EditorUserBuildSettins.activeBuildTarget);
6.完成,但这里要对第4点做一些说明,因为依赖资源:
我们可以选择一种简单粗暴的方式处理依赖资源:搞几个公共依赖assetbundle,把一些公共资源打到这几个公共ab中,具体就是:
在第4步,我们设置一个资源的abName后,对其依赖进行:
string[] deps = AssetDatabase.GetDependencies(sourcePath);
if (deps[i] 需要打入公共依赖1)
AssetImporter aIt = AssetImporter.GetAtPath(deps[i]);
aIt.assetBundleName = 公共依赖1.assetBundle.
if (deps[i] 需要打入公共依赖2)
...
其他的依赖就不必继续分离了,即打到各个资源的ab里,虽然会增加ab的大小,但依赖资源管理会方便很多。
2.资源管理:
先加载各个公共依赖到内存,并且一直引用这不unload,其他正式资源加载时自己加载对应的ab即可,无需加载依赖了。
具体代码如下:(启动游戏先加载公共依赖,一样的加载方式)
//原始资源引用
UnityEngine.Object m_ResGameObj = null;
//3个异步加载句柄:
//资源包加载句柄,引用www加载ab时结果
WWW m_LoadHandle = null;
//资源包加载请求,引用loadfromfileasync和loadfrommemoryasync的结果
AssetBundleCreateRequest m_Request = null;
//资源加载请求,引用loadassetasync结果
AssetBundleRequest m_AssetRequest = null;
//资源包,引用各种加载出来的资源包
AssetBundle m_AssetBundle = null;
//资源相对路径且没有后缀,作为基础路径,方便后续的各种拼接
public string V_AssetPath = null;//是否采用异步
public bool V_UseAsync = true;
//加载优先级
public int V_Priority = 0;
/// <summary>
/// 加载图片只能用www方式
/// </summary>
/// <param name="path">绝对路径</param>
/// <returns></returns>
IEnumerator LoadBundleImpImage(string path)
{
m_LoadHandle = new WWW(PathHelper.GetInstance().F_AddFilePro(path));
yield return m_LoadHandle;
if (m_LoadHandle != null && string.IsNullOrEmpty(m_LoadHandle.error) && m_LoadHandle.assetBundle != null)
{
m_AssetBundle = m_LoadHandle.assetBundle;
string[] assets = m_AssetBundle.GetAllAssetNames();
m_ResGameObj = m_AssetBundle.LoadAsset(assets[0]);
}
else if (m_LoadHandle != null && string.IsNullOrEmpty(m_LoadHandle.error) && m_LoadHandle.texture != null)
{
m_ResGameObj = m_LoadHandle.texture;
}
if (m_LoadHandle != null) m_LoadHandle.Dispose();
m_LoadHandle = null;
}
/// <summary>
/// 加载资源imp
/// </summary>
/// <returns></returns>
IEnumerator LoadResImp()
{
ResourceRequest request = Resources.LoadAsync(V_AssetPath);
yield return request;
if (request != null && request.asset != null)
{
m_ResGameObj = request.asset;
}
m_AssetBundle = null;
}
/// <summary>
/// 加载bundle
/// </summary>
/// <param name="path">绝对路径</param>
/// <returns></returns>
IEnumerator LoadBundleImp(string path)
{
m_Request = AssetBundle.LoadFromFileAsync(path);
yield return m_Request;
if (m_Request != null && m_Request.assetBundle != null)
{
m_AssetBundle = m_Request.assetBundle;
string[] assets = m_AssetBundle.GetAllAssetNames();
m_AssetRequest = m_AssetBundle.LoadAssetAsync(assets[0]);
yield return m_AssetRequest;
m_ResGameObj = m_AssetRequest.asset;
F_SendFinishEvent();
m_Request = null;
m_AssetRequest = null;
}
}
//加载入口
public void StartLoadAsset()
{
string absolutePath = GetPersistentAssetPath();
if (V_UseAsync)
{
string abPath = string.Empty;
if (PathHelper.GetInstance().F_CheckFileExists(absolutePath))
{
abPath = absolutePath;
}
if (abPath.EndsWith(PathHelper.ABFile))
{
AssetManager.GetInstance().StartCoroutine(LoadBundleImp(abPath));
}
else if (abPath.EndsWith(".jpg") || abPath.EndsWith(".png"))
{
AssetManager.GetInstance().StartCoroutine(LoadBundleImpImage(abPath));
}
else//加载安装包里的文件,或者编辑器下加载资源使用
{
AssetManager.GetInstance().StartCoroutine(LoadResImp());
}
}
else
{
//同步加载
try
{
if (m_ResGameObj == null)
{
m_AssetBundle = null;
if (AssetManager.GetInstance().F_IsLoadByAb() &&
absolutePath.EndsWith(PathHelper.ABFile))
{
m_AssetBundle = AssetBundle.LoadFromFile(absolutePath);
}
if (m_AssetBundle != null)
{
string[] assets = m_AssetBundle.GetAllAssetNames();
m_ResGameObj = m_AssetBundle.LoadAsset(assets[0]);
}
else
{
m_ResGameObj = Resources.Load(V_AssetPath);
}
}
}
catch
{
}
}
}
//原始资源引用 UnityEngine.Object m_ResGameObj = null; //3个异步加载句柄: //资源包加载句柄,引用www加载ab时结果 WWW m_LoadHandle = null; //资源包加载请求,引用loadfromfileasync和loadfrommemoryasync的结果 AssetBundleCreateRequest m_Request = null; //资源加载请求,引用loadassetasync结果 AssetBundleRequest m_AssetRequest = null; //资源包,引用各种加载出来的资源包 AssetBundle m_AssetBundle = null; //资源相对路径且没有后缀,作为基础路径,方便后续的各种拼接 public string V_AssetPath = null;//是否采用异步 public bool V_UseAsync = true; //加载优先级 public int V_Priority = 0; /// <summary> /// 加载图片只能用www方式 /// </summary> /// <param name="path">绝对路径</param> /// <returns></returns> IEnumerator LoadBundleImpImage(string path) { m_LoadHandle = new WWW(PathHelper.GetInstance().F_AddFilePro(path)); yield return m_LoadHandle; if (m_LoadHandle != null && string.IsNullOrEmpty(m_LoadHandle.error) && m_LoadHandle.assetBundle != null) { m_AssetBundle = m_LoadHandle.assetBundle; string[] assets = m_AssetBundle.GetAllAssetNames(); m_ResGameObj = m_AssetBundle.LoadAsset(assets[0]); } else if (m_LoadHandle != null && string.IsNullOrEmpty(m_LoadHandle.error) && m_LoadHandle.texture != null) { m_ResGameObj = m_LoadHandle.texture; } if (m_LoadHandle != null) m_LoadHandle.Dispose(); m_LoadHandle = null; }
/// <summary> /// 加载资源imp /// </summary> /// <returns></returns> IEnumerator LoadResImp() { ResourceRequest request = Resources.LoadAsync(V_AssetPath); yield return request; if (request != null && request.asset != null) { m_ResGameObj = request.asset; } m_AssetBundle = null; }
/// <summary> /// 加载bundle /// </summary> /// <param name="path">绝对路径</param> /// <returns></returns> IEnumerator LoadBundleImp(string path) { m_Request = AssetBundle.LoadFromFileAsync(path); yield return m_Request; if (m_Request != null && m_Request.assetBundle != null) { m_AssetBundle = m_Request.assetBundle; string[] assets = m_AssetBundle.GetAllAssetNames(); m_AssetRequest = m_AssetBundle.LoadAssetAsync(assets[0]); yield return m_AssetRequest; m_ResGameObj = m_AssetRequest.asset; F_SendFinishEvent(); m_Request = null; m_AssetRequest = null; } }
//加载入口 public void StartLoadAsset() { string absolutePath = GetPersistentAssetPath(); if (V_UseAsync) { string abPath = string.Empty; if (PathHelper.GetInstance().F_CheckFileExists(absolutePath)) { abPath = absolutePath; } if (abPath.EndsWith(PathHelper.ABFile)) { AssetManager.GetInstance().StartCoroutine(LoadBundleImp(abPath)); } else if (abPath.EndsWith(".jpg") || abPath.EndsWith(".png")) { AssetManager.GetInstance().StartCoroutine(LoadBundleImpImage(abPath)); } else//加载安装包里的文件,或者编辑器下加载资源使用 { AssetManager.GetInstance().StartCoroutine(LoadResImp()); } } else { //同步加载 try { if (m_ResGameObj == null) { m_AssetBundle = null; if (AssetManager.GetInstance().F_IsLoadByAb() && absolutePath.EndsWith(PathHelper.ABFile)) { m_AssetBundle = AssetBundle.LoadFromFile(absolutePath); } if (m_AssetBundle != null) { string[] assets = m_AssetBundle.GetAllAssetNames(); m_ResGameObj = m_AssetBundle.LoadAsset(assets[0]); } else { m_ResGameObj = Resources.Load(V_AssetPath); } } } catch {
} } }
unity-------------------打包BuildAssetBundles的使用的更多相关文章
- 实力封装:Unity打包AssetBundle(大结局)
→→前情提要:让用户选择要打包的文件←← 大结局:更多选择 Unity打包AssetBundle从入门到放弃系列终于要迎来大结局了[小哥哥表示实在写不动了o(╥﹏╥)o]... 经过上一次的教程,其实 ...
- UNITY 打包安卓APK
1,安装JDK.这个直接下就行了. 2,安装android sdk相关.这个比较蛋疼,官网是被墙的.有些网站的包还是需要访问墙外下载的.关键是找对那个能用的包(对我来说就是不FQ). http://p ...
- unity 打包资源及网络请求资源包
第一步 导包 在Assets新建一个Editor目录 新建一个Test类 using UnityEngine; using System.Collections; using UnityEditor; ...
- unity 打包apk安装失败
Unity 打包Apk安装失败,错误提示:安卓未完成. 解决方案:检查BundleID是否一致
- SDK,JDk,Unity打包安卓apk
SDK:软件开发工具包(缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. ...
- unity打包iOS上线归纳
1.去https://developer.apple.com登陆账号去生成打包用的签名文件,生成一个测试用的和一个上线发布用的签名文件 注意:签名文件绑定id必须和应用绑定包命一致,iOSapp唯一性 ...
- 实力封装:Unity打包AssetBundle(一)
说明:这是一系列循序渐进的教程,今天先介绍最简单的AssetBundle打包方式. 这是一个由在Unity中需要加载模型而引发出来的一系列坑,为了填坑花了不少时间,如果有需要在Unity中自定义菜单, ...
- 实力封装:Unity打包AssetBundle(二)
→前情提要:Unity最基本的AssetBundle打包方式. 第二种打包方式 Unity提供的BuildAssetBundles API还有一个重载形式,看下面↓↓ public static As ...
- Unity打包/读取AssetBundle资源全教程
Unity 资源AssetBundle打包 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar ...
- Unity打包同一文件Hash不一样
问题起因 游戏开发基本都会涉及到资源版本管理及更新,本文记录我在打包过程中遇到的一小问题: 开过中常用于标记资源版本的方法有计算文件Hash.VCS的版本等. 在Unity中对同一个资源文件进行多次打 ...
随机推荐
- django rest_framework入门五-认证和权限
1.django User实体 django自带了用户验证模块,django/contrib/auth/models.py定义了用户实体,代码如下: class AbstractUser(Abstra ...
- 在 Yosemite 装 Jave 的方法. ( 适用于 OS X 10.10 )
因为并非所有用户都用得着 Java ,所以在默认状态下 OS X 不预装 Java , 如果你需要的话可以手动安装. 1. http://support.apple.com/kb/DL1572到苹果官 ...
- DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了
[概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定.这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天 ...
- LeetCode: Balanced Binary Tree 解题报告
Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a he ...
- 【神经网络】BP算法解决XOR异或问题MATLAB版
第一种 %% %用神经网络解决异或问题 clear clc close ms=4;%设置4个样本 a=[0 0;0 1;1 0;1 1];%设置输入向量 y=[0,1,1,0];%设置输出向量 n=2 ...
- Auty 2017——WebMonitor接口线上检测平台
[本文出自天外归云的博客园] Auty 2017——WebMonitor接口检测平台 前篇 接口本地检测平台 本篇 接上篇,在本地检测平台的基础上,去掉本地服务,改功能为线上使用.好处是项目可以多人访 ...
- java中定义enum示例
/** * Enumeration for the message delivery mode. Can be persistent or * non persistent. Use the meth ...
- 2. EM算法-原理详解
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 概率 ...
- mac上使用zsh配置环境变量
Mac配置环境变量的地方 一./etc/profile (建议不修改这个文件 ) 全局(公有)配置,不管是哪个用户,登录时都会读取该文件. 二./etc/bashrc (一般在这个文件中添加系统级环境 ...
- <要做股市赢家:杨百万>读书笔记
书在这里 和这里: 要注意的是,并不是政府每出台一个政策股价就要变.如果听到各种消息,市场却没有反应,就不要去做这个聪明人.有消息后应该密切关注市场反应,看成交量.价格的变化等等,再作决定.总之,关键 ...