Notifications
Article
社区交流 | Unity Q&A 第5期
Published 6 days ago
18
0
Unity技术支持工程师陈嘉栋每周都会总结出,过去一周在Unity官方社区交流群中比较有代表性的问题。今天我们将分享第5期的社区Unity Q&A,着重介绍Unity 2018中Scriptable Build Pipeline及构建Assetbundle。
Unity Q&A 系列回顾:
第1期:巧妙设置Texture Type,将ShadowMask内存占用变成之前的1/4
第2期:还原堆栈信息,分析地形系统使用ASTC纹理导致的Crash
第3期 :Unity 2018的LWRP和混合光照
第4期 :在Shader Graph中获取深度图

Scriptable Build Pipeline

问题01:Unity 2018.2中,在资源包管理器中没找到Scriptable Build Pipeline,如何解决?
回答:很多开发者都非常关注Unity2018中的可编程脚本渲染管线Scriptable Render Pipeline,简称SRP。其实Unity2018.2版本中还推出了另一个脚本管线Scriptable Build Pipeline,简称SBP。
但不少朋友可能会发现在Unity 2018的编辑器和资源包管理器都找不到SBP。
安装SBP很简单,我们只需修改工程目录下的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。
如果不使用传统的资源加载API来加载资源呢?了解SBP的开发者,也一定也知道Addressable Asset System,现在让我们在Unity 2018中激活它。
同样我们修改Packages/manifest.json文件,将Addressable Asset System添加到依赖项中。
"dependencies": {
"com.unity.addressables": "0.2.2-preview",
}
这样我们就可以在工程中使用Addressable资源系统了。
注意:目前SBP和Addressable资源系统都还处于预览阶段,也就是说仍然会有大量的修改和变化。
资源参考:
  • 上文示例获取:
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

Standard Assets

问题02:Unity2018.2安装包中没有Standard Asset选项,如果想要安装如何处理?
回答:在Unity2018.2版本中,通过Unity安装程序或Unity Hub来安装Unity时,可以发现Standard Asset选项消失了。
这是因为这套Standard Asset的版本比较老旧,可以追溯到Unity 5.0的版本。因此Unity的新版本会逐渐更换现有的Standard Asset资源。
你可以访问Asset Store资源商店下载老版本的Standard Asset,也可以考虑使用Unity新的2D和3D Game Kit,或者是Unity Learn上的其它示例工程。

资源下载:
  • Standard Assets
https://assetstore.unity.com/packages/essentials/asset-packs/standard-assets-32351
  • 3D Game Kit
https://assetstore.unity.com/packages/essentials/tutorial-projects/3d-game-kit-115747
  • 2D Game Kit
https://assetstore.unity.com/packages/essentials/tutorial-projects/2d-game-kit-107098

Scripting

问题03:我想实现用Attribute对修饰的字段进行依赖注入来创建实例,所以希望这个Attribute能够获取得到它所修饰的字段的类型。
然后在Attribute构建实例的时候,顺便把它所修饰的类型也新建一个返回出去,赋值给它所修饰的这个字段,如何实现?
回答:你可以自定义一个Attribute,然后根据它修饰的对象类型来初始化对象。请参考:
https://answers.unity.com/questions/896763/custom-attributes.html

Graphics

问题04:Unity2018.2中勾选Shader的GPU实例化,发现即使同一光照贴图,如果渲染队列排序中,中间还隔着另外一个对象,也会导致拆分成多个批次。但是用静态批处理就不会有这种现象,如果场景排放的物体交错程度很高,GPU实例化效果就不理想,对这种情况有什么处理方案吗?
回答:这是有可能的,你可以查看Frame Debugger,如果没有合并成功,会有没有合并在一起的原因。例如:使用GPU Instance,但是不同的Mesh或Submesh,就会导致失败。
Unity 2018.1增加了GPU Instance对GI的支持,但是GPU instancing对硬件要求较高,因此对于场景中普遍出现的静态物体建议使用Static batch,这样可以兼顾到低端设备。
对于大量在高端机上出现的物体,例如:大量的草,树木这类物体可以使用GPU Instance,在低端机上可以进行剔除优化,或者不显示。

问题05:Unity可不可以使用球面谐波系数产生高光效果?
回答:球面谐波一般用来提供低频的光照信息,不是用来做高光的。它达不到高光细节的频率,你可以自定义着色器达到,但是高光会变化的非常平缓,建议使用反射球达到高光效果。

Visual Studio Code

问题06:我在Unity中使用Visual Studio Code可为什么不提示也不报错呢?
回答:当你打开的单独的一个cs文件,而不是整个工程就会出现这样的问题,如果正常加载的话,是没有问题的。请参考:
https://code.visualstudio.com/docs/other/unity
问题07:使用Unity 5.6.0f3,在Visual Studio中修改代码后,在Unity编辑器中看到依旧是没有改动的情况?
回答:这种问题通常是由于没有勾选Unity Preference中的Auto Refresh选项,在Unity Preference/General中勾选上即可。

小结

以上就是过去一周Unity官方社区交流群中比较有代表性的问题,其中有你关注的问题吗?
如果你也希望与Unity的技术工程师交流,欢迎加入Unity官方社区交流群:629212643 或访问Unity官方中文论坛(Unitychina.cn)!

Unity China
314
Comments