0x00 前言

在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享。主要涵盖了Scriptable Build Pipeline、Standard Assets、Scripting、Graphics、VS/VS Code等领域,其中会着重介绍一下Scriptable Build Pipeline以及使用Scriptable Build Pipeline流水线来打包Assetbundle的相关话题。

0x01 Scriptable Build Pipeline

Q:我安装了最新的2018.2.1f1,不过在Package Manager里没找到Scriptable Build Pipeline,请问是需要什么设置吗?

A:有很多朋友都十分关注Unity2018中的Scriptable Render Pipeline,可能大家更喜欢作外貌协会的成员吧。其实除了关注度很高的Scriptable Render Pipeline,Unity2018.2版本中还推出了另一个Scriptable的Pipeline,即Scriptable Build Pipeline。

但是不少朋友可能会发现一个问题,即在Unity 2018.2的Editor中找不到Scriptable Build Pipeline的模块,甚至在Package Manager中也没有发现Scriptable Build Pipeline的package。

其实安装Scriptable Build Pipeline十分简单,我们只需修改工程目录下的Packages/manifest.json文件即可,在 “dependencies”这项添加对SBP的依赖。

{
"dependencies": {
"com.unity.scriptablebuildpipeline": "0.2.0-preview"
}
}

这样,我们就能将SBP安装到我们的工程中了。

接下来,我们就可以调用SBP的API来构建大家都很熟悉的Assetbundle了。

新的构建接口叫做ContentPipeline.BuildAssetBundles,它定义在UnityEditor.Build.Pipeline这个命名空间下。它的函数签名如图:



可以看到,所需的参数为BuildParameters、BundleBuildContent以及BundleBuildResults,并且会返回一个ReturnCode,供我们查看构建的状态,例如Success、Error、Canceled等等。

其中BuildParameters主要提供了一些构建参数,比如构建的目标平台、输出路径、压缩格式等等。BundleBuildContent则是供SBP来使用被构建为Assetbundle的Asset列表。BundleBuildResults则保存了脚本编译以及AssetBundle构建的一些比较详细的结果。

与之对应,SBP仍然保留了传统的Build Pipeline,在这里它的名字叫做LegacyBuildPipeline.BuildAssetBundles,用法和之前的构建脚本一样。

所以,我们就可以写一个简单的脚本来分别使用二者构建一个Assetbundle,并在运行时进行加载。

我们可以发现一个很有趣的结果,那就是使用SBP构建的Asetbundle与传统的构建方式相比,是不生成mainfest文件的。

除此之外,另外一个很大的不同在于,如果我们要使用传统的AssetBundle加载接口来加载AssetBundle资源的话,使用SBP构建的AssetBundle在loadasset时要传入该Asset的完整路径,而不能只是该Asset名字。

当然传入完整的路径来加载Asset稍显复杂,并且我们也想要能够在脚本中直接指定需要打包的Asset,这时我们就可以利用AssetBundleBuild来定义AB包的数据了。并且利用AssetBundleBuild数组来创建一个BundleBuildContent实例。



其中AssetBundleBuild的assetNames字段中指明的Asset会被构建到这个bundle中。

除此之外,addressableNames字段的值可以代替之前完整的Asset路径来加载对应的Asset,不过我在0.2.0 Preview版本上进行测试时这个字段还有一些bug,向开发反馈之后也很快被修复了,之后的版本中应该可以正常执行相关的操作了。

Addressable Asset System

如果不使用传统的资源加载API来加载资源呢?听说过Scriptable Build Pipeline的朋友,也一定或多或少的听过Addressable Asset System。Addressable Asset System其实也在Unity 2018.2发布了,我们采用和Scriptable Build Pipeline类似的方式来激活它吧。

同样我们要来修改一下 Packages/manifest.json文件,将Addressable Asset System添加到依赖项中。

"dependencies": {

      "com.unity.addressables": "0.2.2-preview",
}

这样我们就可以在工程中使用Addressable资源系统了。

但是需要注意的是,目前SBP和Addressable资源系统都还处于preview阶段,也就是说仍然会有大量的修改和变化。

上面的小例子可以在这里获取:

https://github.com/chenjd/SBP_AssetBundles_Demo

SBP的文档可以点击下面的链接来查看:

https://docs.unity3d.com/Packages/com.unity.scriptablebuildpipeline@0.0/api/index.html

Addressable资源系统的文档可以点击下面来查看:

https://docs.unity3d.com/Packages/com.unity.addressables@0.2/manual/index.html

0x02 Standard Assets

Q:Unity2018.2 安装包中没有standard asset 选项。如果想要安装standard asset需要通过什么途径?

A:在Unity2018.2版本中,通过Unity安装程序或Unity Hub来安装Unity时,可以发现standard asset选项消失了。

这是因为这套standard asset的版本比较老旧,可以追溯到Unity5.0的版本。因此Unity的新版本会逐渐更换现有的standard asset资源。

当前可以选择去Asset Store上下载老版本的Standard Asset,也可以考虑使用Unity新的2D、3D Game Kit,或者是Unity Learn上的其他示例工程。

0x03 Scripting

Q:我现在想实现用Attribute对修饰的字段进行依赖注入来创建实例,所以我希望这个Attribute能够获取得到它所修饰的字段的类型。

然后在Attribute构建实例的时候,顺便把它所修饰的类型也新建一个返回出去,赋值给它所修饰的这个字段,请问如何实现?

A:你要做的其实就是自定义个Attribute然后根据它修饰的对象类型用它来初始化对象。你可以参考一下这篇文章:https://answers.unity.com/questions/896763/custom-attributes.html

(深圳-Starsky)

0x04 Graphics

Q1:Hi,大家好!咨询一个问题,有使用U3D2018.2 GPU instance 的吗?我测试了一下勾选shader的GPU实例化,发现即使在同一灯光贴图,如果渲染队列排序中,中间还隔着另外一个对象话,也会导致拆分成多个批次。但是用静态批处理就不会有这种现象,如果场景排放的物体交错程度很高,GPU实例化效果就不理想,你们对这种情况有别的处理方案吗?

A:有可能,你可以查看frame debugger,如果没有合并成功的话,会有没有合并在一起的原因。比如使用GPU Instance但是是不同的mesh或submesh,就会失败。

使用GPU Instance的并不少。而且2018.1增加了GPU Instance对GI的支持。但是GPU instancing对硬件要求较高,因此对于场景中普遍出现的静态物体建议使用static batch可以兼顾到低端设备,对于大量在高端机上出现的物体,例如大量的草,树木,这类物体可以使用GPU Instance,在低端机上可以进行剔除优化,或者不显示。

Q2:问一下大佬们Unity可不可以使用球面谐波系数产生高光效果?

A1:思路错了,SH一般用来提供低频的光照信息,不是用来做高光的。

A2:SH达不到高光细节的频率,你自己写shader硬要这么做可以,但是高光会变化的非常『平缓』。(北京-人丑就要多读书)

A3:达不到。Unity的SH就三阶最高了。为什么不用反射球?(上海-CGBull )

0x05 VS/VS Code

Q1:大家好,我在Unity中使用vs code可为什么不提示呢?而且也不报错。



这里无法引用到UI。

A:你打开的应该是单独的一个cs文件,而不是整个project。如果正常加载的话,是没有问题的。

你可以参考一下这个文档:https://code.visualstudio.com/docs/other/unity

Q2:又没人遇到过unity5.6.0f3 在vs里面修改代码后在editor里面看任然是没有改动的情况?



两边代码不一致的情况如上面的截图所示。

A:这种问题通常是由于你没有勾选Unity Preference中的Auto Refresh选项。这个选项在Unity Preference/General中。

勾选上即可。

0x06 后记

好了,以上就是想和大家分享的几个在群里讨论的小问题。

再次,欢迎大家加入我们这个讨论干货的官方技术群,交流分享呀。

Unity官方社区交流群:629212643

-EOF-

最后打个广告,欢迎支持我的书

Unity 3D脚本编程:使用C#语言开发跨平台游戏

聊聊2018.2的Scriptable Build Pipeline以及构建Assetbundle的更多相关文章

  1. 使用 Build Pipeline View 插件图表展示Jenkins job依赖关系

    使用 Build Pipeline View 查看Jenkins的Job的依赖关系图表 安装 Build Pipeline View 插件下载地址 下载后再jenkins的"插件管理&quo ...

  2. Scriptable Render Pipeline

    Scriptable Render Pipeline SRP的核心是一堆API集合,使得整个渲染过程及相关配置暴露给用户,使得用户可以精确地控制项目的渲染流程. SRP API为原有的Unity构件提 ...

  3. Java Build Path(Java 构建路径)

    Java构建路径用于在编译Java项目时找到依赖的类,包括以下几项: 源码包 项目相关的 jar 包及类文件 项目引用的的类库 我们可以通过使用 Java 项目属性对话框中的 Java Build P ...

  4. Android Gradle Plugin指南(五)——Build Variants(构建变种版本号)

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 6. Build Vari ...

  5. Jenkins+pipeline+参数构建+人工干预确定

    Jenkins+pipeline+参数构建+人工干预 实现了以下功能 1. 可以选择环境,单选:可以选择需要发布的项目,多选 2.发布过程可视化 3. 可以人工干预是否继续发布. 初始化配置需要很久, ...

  6. [Feature] Build pipeline

    准备数据集 一.数据集 Ref: 6. Dataset loading utilities[各种数据集选项] 第一部分,加载原始iris数据集的数据: 第二部分,先增加一行,再增加一列: #%% pa ...

  7. Scriptable render pipeline unity

    https://www.youtube.com/watch?v=zbjkEQMEShM LWRP https://blogs.unity3d.com/cn/2018/02/21/the-lightwe ...

  8. 可编程渲染管线(Scriptable Render Pipeline, SRP)

    原文链接 可编程渲染管线处理数据的流程可分为以下3大阶段 1. 应用阶段 这个阶段大概会由CPU处理4件事情.首先会对模型数据进行可见性判断.模型数据由顶点位置.法线方向.顶点颜色.纹理坐标等构成.然 ...

  9. 使用Jenkins pipeline流水线构建docker镜像和发布

    新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...

随机推荐

  1. 二十一、Hadoop学记笔记————kafka的初识

    这些场景的共同点就是数据由上层框架产生,需要由下层框架计算,其中间层就需要有一个消息队列传输系统 Apache flume系统,用于日志收集 Apache storm系统,用于实时数据处理 Spark ...

  2. 关于checkpoint

    Ⅰ.Checkpoint 1.1 checkpoint的作用 缩短数据库的回复时间 缓冲池不够用时,将脏页刷到磁盘 重做日志不可用时,刷新脏页 1.2 展开分析 page被缓存在bp中,page在bp ...

  3. Java元编程及其应用

    首先,我们且不说元编程是什么,他能做什么.我们先来谈谈生产力. 同样是实现一个投票系统,一个是python程序员,基于django-framework,用了半小时就搭建了一个完整系统,另外一个是标准的 ...

  4. Elasticsearch笔记二之Curl工具基本操作

    Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ...

  5. baseFileWriter.go

    package blog4go import ( "fmt" "os" "sync" "time" ) const ( ...

  6. CString 转化成 const char* 类型

    写程序的时候经常会遇到无法将“CString”转换为“const char *”的错误,这里我找到了一个解决办法,与大家分享下: CString cs = _T("); ) * ; char ...

  7. BZOJ_2956_模积和_数学

    BZOJ_2956_模积和_数学 Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数 ...

  8. BZOJ_5249_Luogu_P4364_[2018多省省队联测]_IIIDX_九省联考2018_JLOI2018_线段树

    BZOJ_5249_[2018多省省队联测]IIIDX_线段树 Description [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐 ...

  9. selenium处理iframe定位于切换问题解决办法

    首先还是围绕以下几个方面来看: 1.什么是iframe? 2.为什么我们要定位iframe? 3.我们怎样定位iframe,与切换iframe? 1.什么是iframe? ♦ b/s架构都使用ifra ...

  10. JQuery 将div中的内容替换掉

    $("#div2").children().replaceWith($("#userText").val());谷歌没有效果. $("#div2&qu ...