Unity5新的AssetBundle系统使用心得

Unity的AssetBundle系统是对资源管理的一个扩展,动态更新,网页游戏,资源下载都是基于AssetBundle系统的。但是不得不说,这个系统非常恶心,坑很深。至于有多深,请看这篇文章: http://www.cnblogs.com/ybgame/p/3973177.html

原先的AssetBundle系统需要自己写一大坨导出的代码(BuildPipeline),这个新手会无从下手,老手也经常会被坑到。想正确处理好资源的依赖关系从而保证资源完整而又不会产生重复资源,确实不是一件非常容易的事情。

Unity5新的AssetBundle系统大大简化了这一操作。Unity打包的时候会自动处理依赖关系,并生成一个.manifest文件,这个文件描述了assetbundle包大小、crc验证、包之间的依赖关系等等,是一个文本文件。加载资源的时候Unity会自动处理好其依赖包的加载。

打包代码简化为一个函数(其实也没什么必要了,因为流程固定了,做成内嵌的菜单选项也没什么影响)

BuildPipeline.BuildAssetBundles(outputPath);

执行这个函数,它会自动打包工程目录下的所有的assetbundle,函数足够智能,它只会打包有修改的资源。

如何添加一个AssetBundle呢?

很简单,在资源属性窗口底部有一个选项,这个地方设置AssetBundle的名字。它会修改资源对应的.meta文件,记录这个名字。 AssetBundle的名字固定为小写。另外,每个AssetBundle都可以设置一个Variant,其实就是一个后缀,实际AssetBundle的名字会添加这个后缀。如果有不同分辨率的同名资源,可以使用这个来做区分。

我手头的模型资源非常多,所以我又写了个脚本自动遍历prefab的meta文件,添加AssetBundle名字。有一个需要注意的地方就是.meta文件貌似权限问题,无法直接写入,需要删除原文件,然后使用新的文件替换。。

# -*- coding: utf-8 -*-
import os, sys, shutil;

EXT_LIST = ['.prefab.meta', '.png.meta', '.jpg.meta'];

def doWork(path):
    for root, dirs, files in os.walk(path):
        for file in files:
        	for ext in EXT_LIST:
	            if file.endswith(ext):
	                fullPath = os.path.join(root, file)
	                fullPath = fullPath.replace('\\', '/')
	                prefabName = fullPath.replace(path, '');
	                prefabName = prefabName[:prefabName.find('.')] + '.data';

	                fileData = [];
	                fp = open(fullPath, 'r');
	                for line in fp:
	                	if line.find('assetBundleName:') != -1:
	                		fileData.append('  assetBundleName: ' + prefabName.lower() + '\n');
	                	else:
	                		fileData.append(line);
	                fp.close();
	                # os.remove(fullPath);
	                # return;
	                fpw = open(fullPath + '.tmp', 'w');
	                fpw.writelines(fileData);
	                fpw.close();
	                os.remove(fullPath)
	                shutil.copy(fullPath + '.tmp', fullPath);
	                os.remove(fullPath + '.tmp')
	                break;

doWork(r'Assets/Resources/Prefab/')
os.system('PAUSE')

c#编辑器扩展(与python代码功能一样,喜欢哪个用哪个)

public class ExportAssetBundles : Editor
{
    // 设置assetbundle的名字(修改meta文件)
    [MenuItem("Tools/SetAssetBundleName")]
    static void OnSetAssetBundleName()
    {

        UnityEngine.Object obj = Selection.activeObject;
        string path = AssetDatabase.GetAssetPath(Selection.activeObject);

        string[] extList = new string[] { ".prefab.meta", ".png.meta", ".jpg.meta" , ".tga.meta" };
        EditorUtil.Walk(path, extList, DoSetAssetBundleName);

        //刷新编辑器
        AssetDatabase.Refresh();
        Debug.Log("AssetBundleName修改完毕");
    }

    static void DoSetAssetBundleName(string path)
    {
        path = path.Replace("\\", "/");
        int index = path.IndexOf(EditorConfig.PREFAB_PATH);
        string relativePath = path.Substring(path.IndexOf(EditorConfig.PREFAB_PATH) + EditorConfig.PREFAB_PATH.Length);
        string prefabName = relativePath.Substring(0, relativePath.IndexOf('.')) + EditorConfig.ASSETBUNDLE;
        StreamReader fs = new StreamReader(path);
        List<string> ret = new List<string>();
        string line;
        while((line = fs.ReadLine()) != null) {
            line = line.Replace("\n", "");
            if (line.IndexOf("assetBundleName:") != -1) {
                line = "  assetBundleName: " + prefabName.ToLower();

            }
            ret.Add(line);
        }
        fs.Close();

        File.Delete(path);

        StreamWriter writer = new StreamWriter(path + ".tmp");
        foreach (var each in ret) {
            writer.WriteLine(each);
        }
        writer.Close();

        File.Copy(path + ".tmp", path);
        File.Delete(path + ".tmp");
    }

    [MenuItem("Tools/CreateAssetBundle")]
    static void OnCreateAssetBundle()
    {
        BuildPipeline.BuildAssetBundles(EditorConfig.OUTPUT_PATH);

        //刷新编辑器
        AssetDatabase.Refresh();
        Debug.Log("AssetBundle打包完毕");
    }
}
时间: 2024-12-07 18:55:36

Unity5新的AssetBundle系统使用心得的相关文章

Linux系统理解以及Linux系统学习心得

原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Linux系统的理解 1.加载Linux内核准备:在加载基本输入输出模块(BIOS)之后,从磁盘的引导扇区读入操作系统的代码文件块到内存中,之后开始整个系统的初始化. 2.main.c的start_kernel函数是整个操作系统的入口,这也与Linux是基于C语言的特性相符,start_kernel具体做的动作很多

Unity3D 4.6 新的UI系统

在Unity3D 4.6版本中,终于增加了新的UI系统.虽然从功能,效果等方面来讲,跟NGUI还有一定的差距,但NGUI毕竟是收费插件,对于游戏商用来说有一定的制约. 下面我们来看看,Unity3D 4.6中新的UI系统吧. 如上图所示,我们可以看到在GameObject菜单中,已将3D Object,2D Object和UI分类了. UI中,我们可以看到Panel,Button,Text,Image,RawImage,Slider,Scrollbar,Toggle,InputField,Can

Unity 5 全局光照GI与新的烘焙系统初探

GI是啥 Realtime GI,实时全局光照,听上去就是一个非常高大上的词,但是越高大上就越令人心生敬畏,因为世上没有免费的午餐,越好的效果意味着越多的消耗,对于移动平台来说,这样的消耗受不受的起呢?首先来说说GI是干啥的,非常粗略的来描述下,如果说我们以前的光照系统就是由光源 - 物体 - 视点组成的话,那么全局光照系统就是由光源 - n多环境反射光 - 物体 - 视点.就是说GI额外包括了环境反射光的计算,它可以使得渲染出来的场景物体间的光影交互更为真实. 如果是离线烘焙的话,n多的环境反

联想小新:预装linux系统刷win7系统

以U盘安装为例: 1.在windows系统下制作win7的U盘启动盘(可用 UltraISO 制作). 2.将U盘插入联想小新的usb接口,开机,按Fn+F2进入BIOS. 3.Boot--Boot Prioriry--Legacy First : Fn+F10 保存退出 :Fn+F12进入U盘启动开始安装win7: 4.过程中会出现"windows无法安装到这个磁盘,选中的的磁盘采用GPT分区形式."的问题,解决方案: 按shift+Fn+F10打开diskpart命令符,然后依次输

Unity5 新功能解析--物理渲染与standard shader

Unity5 新功能解析--物理渲染与standard shader http://blog.csdn.net/leonwei/article/details/48395061 物理渲染是UNITY5最大的亮点之一,物理渲染的采用绝对是下一个世代游戏的热点,UNITY5的大范围使用是一个可喜可贺的事情,关于什么是物理渲染,本人曾经写过一篇博客专门讨论,详见http://blog.csdn.net/leonwei/article/details/44539217. 物理渲染和当今的主流光照计算最大

微群控新媒体营销系统硬件搭建细节问题

现在朋友圈比较流行的微群控新媒体营销系统看起来很好,但是实际上在前期硬件搭建的时候,还是需要注意很多细节问题的,要不然,可能最后系统不好运行起来,也不好实现自己想要的效果,在这里,奥创软件研究院为大家分析下一些注意事项. 首先要注意的,就是USB hub 硬件设备的选择,最好要选择传输稳定的,不管是USB 3.0 或者2.0都可以,但是一定要稳定,而且最好是独立供电的,这样当你通过电脑连接50个甚至100个手机的时候,就可以避免由于电压不够导致的经常断线等问题. 接下来要注意的,就是电脑主板的选

[Unity3D]Unity4新的动画系统Mecanim

Unity4.X中添加的新的动画系统取代了原来3.X的旧的动画系统,新动画系统Mecanim也是官方推荐的,使得我们写较少的代码来实现连续的动画效果. 效果图 Unity3.X中动画系统播放动画 使用播放play()或淡入淡出播放CrossFade() 例如: animation.Play("name"); animation.CrossFade("name"); 也可以做成队列动画,然后播放,例如: animation.PlayQueued("name&

cnetos6,centos7添加新网卡,系统不识别的解决办法

今天做实验的时候,需要为虚拟添加一块新网卡,可系统怎么也识别不到,各种百度,google,各种重启都不成功 我以为只要新添加一块系统就会识别到的,可实事并非如此 总结:要重新写新网卡配置文件,并修改HWADDR,否则会报LSB的错误 下面是我的解决方法: 1.新添加网卡后执行ifconfig,系统并没有识别到 #ifconfig 2.获取新增网卡的真实mac #ip addr 3.复制eth0到eth1并修改配置文件 #cd /etc/sysconfig/network-scripts #cp

Unity3D 4.6 新的UI系统啊

在Unity3D 4.6版本中,终于增加了新的UI系统.虽然从功能,效果等方面来讲,跟NGUI还有一定的差距,但NGUI毕竟是收费插件,对于游戏商用来说有一定的制约. 下面我们来看看,Unity3D 4.6中新的UI系统吧. http://travel.tianya.cn/travelPlan/showPlan?planId=8413297 http://travel.tianya.cn/travelPlan/showPlan?planId=8413298 http://travel.tiany