Unity 数据管理 [转自羽化]
转载网址:http://blog.csdn.net/libeifs/article/details/7310962
1. 简介物件组成
2. AssetBundle
3. 打包和读取
1.简介物件组成
这是羽化做的一个粗略图,其中各个组成部分除了工程以外都能通过AssetBundle打成一个后缀名为.unity3d的外部资源包,通过Unity自身的高压技术,最多能节约60%~70%的资源容量。
2.AssetBundle
官方有自带的AssetBundle的例子,羽化通过这个例子改成了自己的一个小工程,通过AssetBundle的打包处理的好处在于把自身的依赖关系包括数据结构合理的分配完整,这样不需要开发者自己去给下载或者加载的资源控制路径,大大降低了开发大型在线游戏的门槛,同时越来越细的封包可以减少游戏的总体大小,资源最大化利用,对于小游戏也带来了很大帮助,可惜按照官方的说法是目前不能完全支持移动端。
AssetBundle具体使用方法在手册上写得很详细,圣典里也有详细的中文说明,羽化就不多说废话,需要注意的是AssetBundle的读取,虽然资源基本上都是用简单读取,但在特殊情况下会去读取特定unity3d包中的特定贴图,或者说是模型,这里就必须注意打包的结构,因为读取出来的是一个Object数组,可以使用Load读取特定资源。
3. 打包和读取
打包方式是在Project视图下选择AutomatedExportResources,过程是自动完成,Unity的Editor类中提供了很多有趣的方法可以实现不同的打包操作,官方只给了手选打包和自动打包两种,但都不够智能。
AutomatedExportResources.js
<SPAN style="FONT-SIZE: 16px">@MenuItem("Assets/Auto Build Resource Files")
static function ExportResource ()
{
System.IO.Directory.CreateDirectory("AssetBundles");
var options = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets;
BuildPipeline.PushAssetDependencies();
/*Effects*/
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Texture/Effects/Hit/Hit1.tga"), null, "AssetBundles/Data/Texture/Effects/Hit/Hit1.unity3d", options);
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Texture/Effects/Hit/Hit2.tga"), null, "AssetBundles/Data/Texture/Effects/Hit/Hit2.unity3d", options);
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Model/Effects/Hit/Hit1.fbx"), null, "AssetBundles/Data/Model/Effects/Hit/Hit1.unity3d", options);
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Model/Effects/Hit/Hit2.fbx"), null, "AssetBundles/Data/Model/Effects/Hit/Hit2.unity3d", options);
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Material/Effects/Hit/Hit1.mat"), null, "AssetBundles/Data/Material/Effects/Hit/Hit1.unity3d", options);
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Material/Effects/Hit/Hit2.mat"), null, "AssetBundles/Data/Material/Effects/Hit/Hit2.unity3d", options);
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Prefab/Effects/Hit/Hit1.prefab"), null, "AssetBundles/Data/Prefab/Effects/Hit/Hit1.unity3d", options);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Prefab/Effects/Hit/Hit2.prefab"), null, "AssetBundles/Data/Prefab/Effects/Hit/Hit2.unity3d", options);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Prefab/Effects/Hit/Hit3.prefab"), null, "AssetBundles/Data/Prefab/Effects/Hit/Hit3.unity3d", options);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Standard Assets/Data/Prefab/Effects/Hit/Hit3.prefab"), null, "AssetBundles/Data/Prefab/Effects/Hit/Hit3.unity3d", options);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PopAssetDependencies();
这是羽化的打包代码,可以看出羽化做了一个两层依赖,当然可以做更多,但写起也就更加复杂,这种打包实现的是预设与其他物件分离,其他物件包括材质球、模型、贴图,材质球中包含着色器和属性信息,贴图往往是一张tga,模型是一个FBX,这样打包羽化认为基本上是最省配置,但要注意加载的时候,在有预设的情况下,最后先下载材质球再下载模型。
Prefab.js
<SPAN style="FONT-SIZE: 16px">var download : WWW;
var url = "packed_resource.unity3d";
var resourcePath = "Lerpz";
var guiOffset = 20;
var assetBundle : AssetBundle;
var instanced : Object;
function StartDownload () {
if (url.IndexOf ("file://") == 0 || url.IndexOf ("http://") == 0)
download = new WWW (url);
else if (Application.platform == RuntimePlatform.OSXWebPlayer || Application.platform == RuntimePlatform.WindowsWebPlayer)
download = new WWW ("../AssetBundles/" + url);
else if (Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.WindowsEditor)
download = new WWW ("file://" + Application.dataPath + "/../AssetBundles/" + url);
yield download;
assetBundle = download.assetBundle;
if (assetBundle != null)
{
// Alternatively you can also load an asset by name (assetBundle.Load("my asset name"))
var go : Object = assetBundle.mainAsset;
if (go != null)
{
instanced = Instantiate(go);
}
else
Debug.Log("Couldnt load resource");
}
else
{
Debug.Log("Couldnt load resource");
}
}
function OnGUI()
{
GUILayout.Space(guiOffset);
GUILayout.BeginHorizontal();
if (download == null)
{
if (GUILayout.Button("Download " + url))
StartDownload();
}
else
{
if (download.error == null)
{
var progress = parseInt(download.progress * 100);
GUILayout.Label(progress + "%");
if (download.isDone && GUILayout.Button("Unload Resource") )
{
// Destroy the instantiated object
Destroy(instanced);
// Dispose the WWW class
// (This happens automatically from the GC, but you can do it explicitly to make sure it happens early on)
download.Dispose();
download = null;
// Unload the whole asset bundles and any loaded assets
assetBundle.Unload (true);
assetBundle = null;
}
}
else
{
GUILayout.Label(download.error);
}
}
GUILayout.EndHorizontal();
}</SPAN>
预设下载和其他下载差不多,只是预设中多了一步实例化。
Unity 数据管理 [转自羽化]相关推荐
- Unity 数据管理
开发环境 Window7 Unity3D 3.5.0 MB525defy Android 2.2.1 羽化的第二十六篇博客,春节回来后工作就十分繁忙,一直没时间来整理博客,Unity升级到了3.5没 ...
- unity镜头边缘羽化_【JTRP】屏幕空间深度边缘光 Screen Space Depth Rimlight
氵一篇最近群友聊到的新边缘光,使用深度计算,相对于传统边缘光可能更适合硬表面. https://github.com/Jason-Ma-233/JasonMaToonRenderPipelinegit ...
- unity镜头边缘羽化_【后期修图】如何利用Ps中的自适应广角滤波器校正镜头失真?...
当用广角镜头拍摄对象时,透视问题通常以线条的形式出现,这应该是直的,但看起来是弯曲的和扭曲的.这通常被称为桶形失真,其主要发生在广角镜头中,因为图像的放大率越远,主体离镜头的光轴越远.简单来说,这意味 ...
- Unity Shader - 羽化效果
原图 效果图 代码1: //ps的羽化shader // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToCli ...
- Unity通过Shader遮罩实现边缘羽化和异形视频播放
使用SpriteRenderer播放视频时,自定制遮罩形状,实现羽化边缘,异形视频效果,并可跟随SpriteRenderer修改颜色和透明度 Shader "Custom/VideoMask ...
- [Unity] Unity中实现羽化功能的shader
GLSL->ShaderLab,原GLSL代码来自http://blog.csdn.net/panda1234lee/article/details/52199296, 由于shaderLab的 ...
- 最全面的Unity游戏开发指南视频教程 第2卷
最全面的Unity游戏开发指南视频教程 第2卷 流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小 ...
- Unity 3D网络游戏实战 pdf
Unity 3D网络游戏实战(全) 目录: 掌握Unity3D基本元素 1.1 简单的游戏 1.1.1在场景中创建一个立方体 1.1.2编写可以使立方体运动的程序 1.1.3测试游戏1.1.4总结1. ...
- 【Unity开源项目精选】Entitas:Unity DOTS的先行者
洪流学堂,让你快人几步.你好,我是你的技术探路者郑洪智,你可以叫我大智. Entitas Entitas是Unity官方推出DOTS之前的一个开源ECS框架.不过自从Unity官方启动DOTS以来,E ...
最新文章
- 戈峻:英特尔推动嵌入式教育 意在双赢
- 竞赛 | 上汽拿出了2000辆车的真实数据集,千万级投资+直接录用机会等你来战!...
- 缓存初解(四)---Ibatis的缓存配置+Ehcache
- 使用Golang时遇到的一些坑
- 行业思考 | 酷炫动效是否利于你的产品设计?
- jvisualvm安装Visual GC插件
- C++ 菱形虚继承 通过指针来寻找继承过来的成员变量
- java阻塞锁_java – 阻止锁与非阻塞锁
- SpringSocial业务系统与社交网站的绑定与解绑
- java 百度爬虫_零基础写Java知乎爬虫之先拿百度首页练练手
- MySQL版本升级5.6到5.7版本
- Jasypt 开源加密库使用教程
- oracle 11g压缩分区表,ORACLE 10g和11g压缩分区表操作脚本
- mysql建表指定表空间_Oracle中建表和指定表空间
- Windows操作系统原理笔记
- 日常问题解决之JAVA标签打印设置纸张大小
- 读数学建模国赛优秀论文的笔记
- java md5加密64位_MD5加密的Java实现
- docker打包镜像--go语言编写的http项目
- 跟Kaggle做泰坦尼克乘客生存分析