Siki_Unity_3-7_AssetBundle从入门到掌握

Unity 3-7 AssetBundle从入门到掌握

任务1&2&3:课程介绍

AssetBundle -- 用于资源的更新

为了之后的xLua (Lua热更新的框架)打下基础

任务4&5:AssetBundle的定义和作用

AssetBundle的学习 -- 一手学习资源:UnityManual -> AssetBundles -> 教程式的文档

AssetBundle是一个压缩包(也可以认为是一个文件夹)
  包含模型Model、贴图Texture、预制体Prefab、声音AudioClip、甚至整个场景
  在游戏运行的时候可以被加载

这个压缩包被打包出来存在硬盘中,里面包含的文件可以分为两类:serialized file和resource files
  serialized file:资源,如模型、预制体,被打碎放在一个对象中,最后统一被写进一个单独的文件
  resource file:某些二进制资源,如图片、声音,被单独保存,方便快速加载
    -- 一个单独的图片或声音就会被打包成一个.resource文件

压缩包可以使用LZMA和LZ4压缩算法,便于更快的进行网络传输 -- 区别之后会讲

为什么会用到网络传输呢?
  1. 把一些可以下载的资源放在AssetBundle中,而不放在app中,而在需要的时候从网上直接加载资源
    -- 减少安装包的大小
    安装包过大:影响用户体验,或导致用户不想下载
  2. 方便更新
    -- 对于某些模型,如果进行某些活动更新,用户不需要更新安装包
    进入游戏后,检查资源更新,从服务器上下载模型并加载即可
    第一次启动后,或之后有更新时,下载更新包到本地,之后就不用下载了

AssetBundle自身保存着互相的依赖关系
  比如一个包是专门保存模型的,而另一个包是专门保存贴图的,那这两个包之间就会有依赖关系

AssetBundle在加载时,作为一个AssetBundle对象,对象中包含的内容就是AssetBundle压缩包中的内容

任务6:AssetBundle使用流程

https://docs.unity3d.com/Manual/AssetBundles-Workflow.html

1. 指定资源的AssetBundle属性

2. 构建AssetBundle包
  AssetBundle包可以有多个,每个AssetBundle包中可以有多个文件
  Unity会搜寻项目中的资源,如果资源被标记了需要打包,则会被打包到AssetBundle包中

3. 上传AssetBundle包
  一般情况下都会上传到服务器
4. 加载AssetBundle包及其中的资源
  启动游戏之后,游戏会在服务器上检查更新,将更新包下载到本地,加载上面的资源

任务7&8:打包AssetBundle

1. 指定资源的AssetBundle属性

从AssetStore上搜索Material资源

创建一个Cube,拉伸成一个墙壁的形状,将mat资源附加上

制作成一个名为wall的prefab

修改wall prefab的AssetBundle标签,New -> Wall (不区分大小写)
  前面也可以写成 aaa/bbb的格式,表示在aaa文件夹下生成名为bbb的assetbundle文件
    比如:scene/wall
  后缀写成assetbundle,不是必要的,随意填写都行

设置成相同的assetbundle属性的不同物品,会被打包到相同的assetbundle文件中

2. 使用Unity的API进行构建AssetBundle包
  这个API是只有在Editor模式下才运行的

创建Editor文件夹
新建CreateAssetBundles.cs脚本

using UnityEditor;
不继承自MonoBehaviour

BuildPipeline.BuildAssetBundles(string outputPath, BuildAssetBundleOptions option, BuildTarget platform);

string path; // path是以工程的根目录为基础的 -- 输出目录需要已存在,Unity不会自动创建路径
  因此需要进行路径是否存在的判断
  using System.IO;
  if(!Directory.Exists(path)) {
    Directory.CreateDirectory(path);
  }
BuildAssetBundleOptions.None // 表示不去设置该选项
BuildTarget.StandaloneWindows64 // 表示为了window64平台打包的

using UnityEditor;
using System.IO;

public class CreateAssetBundle {

    [MenuItem("Assets/BuildAssetBundles")]
    static void BuildAllAssetBundles() {
        string path = "AssetBundles";
        if (!Directory.Exists(path)){
            Directory.CreateDirectory(path);
        }
        BuildPipeline.BuildAssetBundles(path,
            BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}}

[MenuItem("Assets/BuildAssetBundles")]  // 表示这个方法在菜单栏Assets下创建子菜单BuildAssetBundles

Unity中,Assets -> 点击BuildAssetBundles,就会进行AssetBundle的打包了

Unity中的Project下没有任何变化,
  在系统中打开工程根目录,会发现新建了一个AssetBundles文件夹

wall.assetbundle就是wall的prefab文件
wall.assetbundle.manifest记录了wall.assetbundle的依赖项

AssetBundles是为当前目录
AssetBundles.manifest当前目录生成了哪一些assetbundle文件

.manifest是文本文件,一个assetbundle文件对应一个manifest文件
  记录了对应的assetbundle的依赖,详见任务14

如何删除不用的assetbundle名字
  比如现在发现我们的assetbundle名写错了,重新生成一个assetbundle
  但是设置assetbundle属性的菜单中,会发现原来的assetbundle名字没有被替换,依然存在

  在设置资源的AssetBundle属性的地方,选择remove unused names
  现在,在设置assetbundle属性的菜单里就找不到不用的assetbundle名了

任务9:AssetBundle的加载和使用

3. 上传AssetBundle包
  因为在开发阶段,我们要重复对AssetBundle包进行修改,因此不会进行上传到服务器这一操作

  开发阶段直接将AssetBundle包放在本地,再进行加载

4. 加载AssetBundle包

这里先讲解加载本地的AssetBundle包
加载本地的AssetBundle包和加载服务器上的AssetBundle包所用的API是不同的

现在,将我们的场景下的物品和Project中的prefab清空
  为了更清楚地看到物体是从AssetBundle中加载出来的

创建一个空物体,命名LoadAssetBundle
  添加脚本LoadAssetBundleFromLocal.cs

在Start()中进行加载操作

AssetBundle.LoadFromFile("AssetBundles/scene/wall.assetbundle");
// 需要加后缀

返回值为AssetBundle类型的对象 -- 见任务4&5:
AssetBundle在加载时,作为一个AssetBundle对象,对象中包含的内容就是AssetBundle压缩包中的内容

AssetBundle assetBundle = ...;
GameObject wallPrefab = assetBundle.LoadAsset<GameObject>("Wall");
  // 对象类型为GameObject,名为"Wall",将加载到的资源赋值给GameObject对象
  // 这里的名字"Wall"不能乱写,需要和打包前的名字相同 -- Case-insensitive
Instantiate(wallPrefab);

另一种方法是assetBundle.LoadAllAssets();
  返回的是Object[],
  可以通过foreach将所有Object[]中包含的prefabs都实例化出来

原文地址:https://www.cnblogs.com/FudgeBear/p/9026355.html

时间: 2024-11-02 12:31:57

Siki_Unity_3-7_AssetBundle从入门到掌握的相关文章

R语言快速上手入门

R语言快速上手入门 课程学习网址:http://www.xuetuwuyou.com/course/196 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本教程深入浅出地讲解如何使用R语言玩转数据.课程中涵盖R语言编程的方方面面,内容涉及R对象的类型.R的记号体系和环境系统.自定义函数.if else语句.for循环.S3类R的包系统以及调试工具等.本课程还通过示例演示如何进行向量化编程,从而对代码进行提速并尽可能地发挥R的潜能.本课程适合立志成为数据科学家的

笔记:Spring Cloud Zuul 快速入门

Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了所有其他微服务的实例信息,这样的设计非常巧妙的将服务治理体系中维护的实例信息利用起来,使得维护服务实例的工作交给了服务治理框架自动完成,而对路由规则的维护,默认会将通过以服务名作为 ContextPath 的方式来创建路由映射,也可以做一些特别的配置,对于签名校验.登录校验等在微服务架构中的冗余问题

linux入门基础知识及简单命令介绍

linux入门基础知识介绍 1.计算机硬件组成介绍 计算机主要由cpu(运算器.控制器),内存,I/O,外部存储等构成. cpu主要是用来对二进制数据进行运算操作,它从内存中取出数据,然后进行相应的运算操作.不能从硬盘中直接取数据. 内存从外部存储中取出数据供cpu运存.内存的最小单位是字节(byte) 备注:由于32的cpu逻辑寻址能力最大为32内存单元.因此32位cpu可以访问的最大内存空间为:4GB,算法如下: 2^32=2^10*2^10*2^10*2^2 =1024*1024*1024

JAVA通信系列二:mina入门总结

一.学习资料 Mina入门实例(一) http://www.cnblogs.com/juepei/p/3939119.html Mina入门教程(二)----Spring4 集成Mina http://www.cnblogs.com/juepei/p/3940396.html Apache Mina 入门实例--创建一个MINA时间服务http://loftor.com/archives/apache-mina-quick-start-guide.html MINA2.0用户手册中文版--系列文

Storm入门(四)WordCount示例

Storm API文档网址如下: http://storm.apache.org/releases/current/javadocs/index.html 一.关联代码 使用maven,代码如下. pom.xml  和Storm入门(三)HelloWorld示例相同 RandomSentenceSpout.java /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor lice

浅谈Ubuntu PowerShell——小白入门教程

早在去年八月份PowerShell就开始开源跨平台了,但是一直没有去尝试,叫做PowerShell Core. 这里打算简单介绍一下如何安装和简单使用,为还不知道PowerShell Core on Ubuntu的同学们提供一点小小的入门帮助,谢谢大家支持~ PowerShell Core是由Microsoft开发的运行在.Net Core上的开源跨平台的任务自动化和配置管理系统. 1.   在Ubuntu 16.04上安装PowerShell Core a)         导入公共存储库GP

2.vue.js 入门环境搭建

原文链接:http://blog.csdn.net/luckylqh/article/details/52863026?locationNum=2&fps=1 vue这个新的工具,确实能够提高效率,在经历的一段时间的摧残之后,终于能够有一个系统的认识了,下面就今天的收获做一个总结,也是vue入门的精髓: 1.要使用vue来开发前端框架,首先要有环境,这个环境要借助于node,所以要先安装node,借助于node里面的npm来安装需要的依赖等等. 这里有一个小技巧:如果在cmd中直接使用npm来安

学习mysql的笔记:mysql十大基本入门语句

学习mysql数据库,从最简单的十条入门语句开始.刚开始学习mysql,老师让我们用cmd控制台输入语句,而不是选择用工具输入,这是为了我们能够先熟悉mysql语句. 首先要先进入mysql,语句为:mysql -hlocalhost -uroot -p  然后回车,输入密码. C:\Users\Administrator>mysql -hlocalhost -uroot -p Enter password: ****** 成功进入的话会出现 Welcome to the MySQL monit

Java - Java入门(2-1am)

第一讲.Java入门 1. 计算机语言是人和计算机进行交互的一种工具,人们通过使用计算机语言编写程序来向计算机施令,计算机则执行程序,并把结果输出给用户. 2. 机器语言:由0.1序列构成的指令码组成 如:10000000  加        10010000减          11110000 打印 3. 汇编语言:用助记符号描述的指令系统 如: Mov   A, #10; Mov   B, #20; Add   A,  B; 4. 高级语言: 面向过程的高级语言:程序设计的基本单元为函数

一个入门rpc框架的学习

一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC, 它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所