查看原文
其他

Unity Q&A 第5期 :Scriptable Build Pipeline及构建Assetbundle

陈嘉栋 Unity官方平台 2018-11-15

Unity技术支持工程师陈嘉栋每周都会总结出,过去一周在Unity官方社区交流群中比较有代表性的问题。今天我们将分享第5期的社区Unity Q&A,着重介绍Unity 2018中Scriptable Build Pipeline及构建Assetbundle。


Unity Q&A 系列回顾:


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面部捕捉解决方案课程(第一期)

9月26日晚8点,Unity技术直播课程将带来Facial AR Remote面部捕捉解决方案系列课程的第一期,感兴趣的朋友赶紧预约吧![了解详情...

直播课程:Facial AR Remote面部捕捉解决方案课程(第一期)

直播地址:https://connect.unity.com/events/unitychina-facialar


Unity官方教师培训报名火热进行中

Unity将在10月22-26日,举办为期5天的专业的Unity官方教师培训课程,诚邀广大教师与Unity一同学习分享最新技术![了解详情...

报名地址:

https://connect.unity.com/events/2018jiaoshipeixun


Unity开学季|重磅教育活动来袭

九月开学季,Unity将在南京、南昌、上海开展重磅教育活动,欢迎教育领域的领导、专家、教师团队莅临交流![了解详情...


优惠活动|Unity订阅新起航,开启您的创作之旅

现在访问Unity在线商店(store.unity.com),成功订阅Unity Pro专业版、Unity Plus加强版即可享受全新增值服务组合。11月18日之前订阅,更有指定插件资源限时赠送。[了解详情...]

活动地址:https://store.unity.com/cn


点击“阅读原文”访问Unity官方中文论坛

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存