Unity UI性能优化技巧

本文将介绍一些提升Unity UI性能的技巧。更多优化技巧,可以观看下方的视频,内容是Unity工程师Ian Dundore在Unite Europe 2017的演讲《使用Unity性能提升技巧》。
https://v.qq.com/x/page/k0704uoak3j.html

划分画布
问题:UI Canvas上有一个或多个元素变化时,会污染整个画布。
画布(Canvas)是Unity UI的基本组件。它会生成网格来呈现放置在画布上的UI元素,当UI元素变化时,它会重新生成网格并向GPU发起绘图调用,从而显示出UI。

生成这些网格会消耗大量性能。需要将UI元素收集到批处理中,从而尽可能减少绘图调用。因为批处理的生成过程性能消耗较大,通常只在必要时候才重新生成。问题在于,当画布上有一个或多个元素变化时,必须重新分析整块画布,才能得到绘制元素的最优方法。

许多用户将整个游戏的UI都放到一块画布,上面摆放了成百上千个元素。因此当修改其中一个元素时,会产生持续数毫秒的CPU使用量飙升情况。

解决方案:划分画布
每块画布上的元素都与其它画布的元素相隔离,所以我们可以使用工具来切分画布,从而解决Unity UI的批处理问题。

你也可以通过嵌套画布来解决,这样能允许设计师创建大型分层UI,而且不必担心不同内容出现在多个画布上。子画布的内容与父画布和同级画布相互隔离。它们会保持自带几何体,执行自己的批处理。

当使用子画布分离画布时,尝试根据画布更新时间来分组。例如:分离动态元素和静态元素。

Graphic Raycaster的最佳用法
问题:Graphic Raycaster有哪些最佳用法?
Graphic Raycaster组件能够将输入内容转换为UI事件,它会把触屏输入转为事件,然后发送给相关UI元素。每个接收输入内容的画布都需要Graphic Raycaster组件,包括子画布。

尽管该组件名为Graphic Raycaster,但它却不是个光线投射器,默认情况下它只会测试UI图形。该组件会获取特定画布上输入信息相关的UI元素集,然后执行交点测试,它会针对Graphic Raycaster的画布上每个交互式UI元素的RectTransform,检查输入事件发生的位置。

解决方案:关闭静态或非交互式元素的Raycast Target。
例如:有个带文字的按钮,关闭该元素的Raycast Target会直接减少Graphic Raycaster每帧进行的交点测试次数。

111035lb6qqj6aus5qzluz.jpg.thumb

问题:有时候Graphic Raycaster会充当光线投射器使用。
如果将画布上的渲染模式设为世界空间摄像机(Worldspace Camera)或屏幕空间摄像机(Screen Space Camera),此时可以设置阻挡遮罩(Blocking Mask)。

阻挡遮罩决定光线投射器是通过2D物理还是3D物理投射光线,从而了解特定物理对象是否阻挡用户与UI交互。

解决方案:通过2D或3D物理投射光线会消耗不少性能,所以要谨慎使用该功能。
尽量减少Graphic Raycaster的数量,不要将Graphic Raycaster添加到非交互式UI画布上,因为这样做无法检查交互事件。

避免使用Camera.main
问题:世界空间画布需要了解交互事件来自哪个摄像机。
当设置画布进行渲染时,不管该画布是在世界空间还是摄像机的屏幕空间,都可以指定用于为UI中Graphic Raycaster生成交互事件的摄像机。渲染模式为“Screen Space – Camera”的画布需要使用该设置,该设置名为“Render Camera”。

111035x5odnios6scin66x.jpg.thumb

然而在渲染模式为“World Space”的画布上,该设置是可选的,名为“Event Camera”。

111035qjqqcxcjglclll40.jpg.thumb

如果将世界空间画布的Event Camera字段留空,这不意味着该画布不会接收事件。它会使用游戏的主摄像机。为了确定哪个摄像机是主摄像机,该画布会访问Camera.main属性。

111035b152ax15dxmwj6xx.jpg.thumb

根据Unity所使用的代码路径,每帧中每有一个Graphic Raycaster和世界空间画布,该画布会访问7到10次Camera.main。每次访问Camera.main都会调用Object.FindObjectWithTag。这个做法在运行时并不合适。

解决方案:避免使用Camera.main
缓存摄像机的引用,然后创建系统来跟踪主摄像机。如果使用世界空间画布,要指定Event Camera,不要将该属性留空。如果需要修改Event Camera,编写代码来更新Event Camera属性。

避免使用布局分组
问题:每个影响布局的UI元素都会至少执行一次GetComponents调用。
当修改布局系统的一个或多个子元素时,会使布局变脏。修改后的子元素会使拥有该元素的布局系统(Layout System)无效化。

简单介绍一下布局系统:布局系统是一组连续的布局分组(Layout Group),它们在布局元素(Layout Element)之上。布局元素不只是名为Layout Element的组件,它们还包括UI图像、文字和Scroll Rect组件,而且Scroll Rect同时也是布局分组。

回到问题本身,每个使布局变脏的UI元素都会至少执行一次GetComponents调用,该调用会在布局元素父对象上寻找有效的布局分组。找到有效布局分组后,它会继续遍历Transform层级,直到停止寻找分组或是到达层级的根部分,无论先满足哪个条件都会停止寻找过程。因此。每个布局分组会给每个子布局元素的改变过程添加一次GetComponents调用,使嵌套布局分组的性能变差。

解决方案:避免使用布局分组。
使用锚点进行比例布局。在拥有动态元素数量的活跃UI上,考虑编写代码来计算布局,仅在需要时运行该代码,而不是每次发生改变的时候。

巧妙地聚集UI对象
问题:用错误的方法聚集UI对象。
通常情况下,用户通过重置父对象来聚集UI对象,然后再禁用对象,但这样会造成不必要的污染。

解决方案:首先禁用对象,然后将其父对象重置为对象池。
这样操作仅会改变一次原有的层级,但在重置父对象时,要避免二次改变原有的父对象,也不要改变新的层级。如果要从对象池移除对象,首先重置它的父对象,然后更新数据,再启用该对象。

如何隐藏画布
问题:如何隐藏画布?
有时需要隐藏UI元素和画布,要怎样高效完成该任务呢?

解决方案:禁用Canvas组件。
禁用Canvas组件会阻止画布向GPU发起绘图调用,所以该画布不再可见。然而,此时该画布不会丢弃它的顶点缓冲区,它会保留所有网格和顶点,当重新启用时不会触发重构过程,它只会重新绘制画布内容。

此外,禁用Canvas组件不会触发Canvas层级上性能消耗较大的OnDisable/OnEnable回调。禁用子组件时要小心,注意它是否运行性能消耗较大的每帧代码。

UI元素上Animator的最佳用法
问题:如何在UI上使用Animator?
Animator每帧都会改变元素,即使动画中的数值没有变化。Animator没有空指令检查。

解决方案:
只在频繁变化的动态元素上加入Animator。对于很少变化的元素,或是仅响应事件时才变化的元素,请自行编写代码或补间系统,你可以在Asset Store资源商店找到许多补间系统插件。

Unity 2018.3 Shader Graph着色器视图新功能:Lit Master Node

随着Unity 2018.3正式版本的发布,Shader Graph着色器视图为高清晰渲染管线HDRP加入了一个全新的主节点Lit Master,它能够帮助开发者使用到HDRP中许多高级着色器功能。

Unity 2018.3正式版中更新了HD Lit高级功能(HD Lit Advanced Features),简称HD Lit AF,包括:涂层遮罩、晕彩、半透明、次表面散射和各向异性。本文将介绍其中的一些高级功能,并展示如何使用它们在使用Shader Graph着色器视图中的HDRP创作精美的资源。

请访问GitHub下载本文的示例项目,该示例项目包含一个盆景和蝴蝶,项目中大量使用了晕彩和半透明效果。

Shader Graph着色器视图示例项目下载:
https://github.com/natalieburke/ … eDemo_LitMasterNode

115747acg7mejnwgnicwmh

快速入门
在开始创作精美的场景前,我们需要注意二个重要事项:
1、Lit Master Node仅在高清晰渲染管线HDRP中运行。
2、轻量级渲染管线LWRP中没有用于此节点的高级着色选项。如果你只需要PBR表面的基本输入,建议继续使用PBR主节点。

创建HDRP场景的最快速方法是在Unity启动器或Unity Hub上选择High-Definition RP模板。蝴蝶示例项目也使用了HDRP。

115747z89j88k5mmzn98on.png.thumb.jpg

使用High-Definition RP模板创建新项目时,建议将项目中的HDRP版本由4.1.0-preview更新为4.6.0-preview。

更新HDRP版本时,请依次点击Window > Package Manager来启动资源包管理器。然后从资源包列表选择High Definition RP资源包,此时在窗口右上方会有Update to按钮。在该按钮右侧选择4.6.0版本,然后单击Update to按钮。

115747ifi1ii9foxi7g0d7.png.thumb.jpg

使用HDRP项目时,你可以点击菜单Create > Shader > Lit Graph创建全新的HD Lit着色器视图。成功创建后,你会看见一些新的输入选项。

如果你在HDRP中使用过HD Lit材质,这些选项大致上差不多。如果你没有使用过该材质,BentNormal和CoatMask对你来说或许是陌生的概念。

115747drw5rc5q9quqmsbz.png.thumb.jpg

如果将CoatMask值提高到0以上(最大值为1),会为表面添加清晰的“涂层”效果。这意味着对象表面上会有类似封蜡的半透明薄层。

你可以想象一下在网格上绘制环氧树脂涂层的效果,涂层遮罩的一个常见用途是创建材质来模拟汽车涂料外观。

下图的苹果上材质的CoatMask值由0~1逐渐变化效果。

115748rdmdsiuj9aixzxjo

虽然CoatMask是Lit Master Node的默认输入,但请确保仅在该功能对项目非常重要时使用它来实现效果,因为将CoatMask值增大到0以上会增加着色器的性能消耗。

BentNormal允许输入特殊类型的贴图,以改善资源的间接光照(GI)效果。在与AO贴图结合使用时,BentNormal 会提供镜面遮蔽效果,这意味着我们可以向网格上的反射添加遮蔽效果。你可以通过Substance Designer、XNormal或Knald等软件生成弯曲法线贴图。

为了对弯曲法线贴图进行镜面遮罩,必须将着色器设置中的Specular Occlusion Mode(镜面遮蔽模式)设为From AO And Bent Normal(来自AO和弯曲法线)。你可以单击Shader Graph着色器视图主节点右上角的齿轮图标,来访问这些设置。

115748at5ez4ex498hetc4.png.thumb.jpg

镜面遮蔽有四个模式选项:Off(关闭)、From AO only(仅来自AO)、From AO and Bent Normal(来自AO和弯曲法线)和Custom(自定义)。

115749k6ctdprjzpbvyfbz.jpg.thumb

选择Custom 会在主节点创建新输入,从而为用户提供对镜面遮蔽的完整控制。例如:对该输入插入0会禁用所有反射。

主节点的设置菜单和Lit AF选项一起加载。你可以在此选择准备在Shader Graph着色器视图利用的高级材质类型,并设置其它实用的表面信息,例如:表面是不透明还是半透明。

115749b8kn7kk1py8kijna.png.thumb.jpg

修改这些设置会向主节点添加额外输入选项,根据启用的设置组合,你最后可能会得到一个非常庞大的节点以及性能开销很大的着色器。

下图是Lit AF选项展示。

115750cze2g9z2kk9agk0z.png.thumb.jpg

示例项目的高级材质
蝴蝶示例项目大量使用了晕彩和半透明二个高级材质类型。我们首先看看蝴蝶的效果。

蝴蝶的翅膀由细小鳞片的多个图层组成的复杂表面,这些图层会使人眼感觉蝴蝶翅膀呈现粉尘状。鳞片拥有非常高的反射率,并位于几丁质层的表面。

几丁质是一种半透明蛋白质,它是昆虫外骨骼的主要组成部分。这些生物知识在应用于着色模型时,意味着蝴蝶翅膀是半透明的,并具有晕彩效果和金属质感。

晕彩是特定表面的颜色随着表面光照角度变化而逐渐改变的现象,它是仅在HDRP中可用的高级着色功能之一。

下图展示了晕彩的实际效果,我们利用晕彩效果来改变蝴蝶扇动翅膀时的颜色。

115750nd5d2r4gs7ser8de

在将材质类型(Material Type)切换为晕彩(Iridescence)时,会在材质节点出现二个新选项:IridescenceMask(晕影遮罩)和IridescenceThickness(晕影厚度)。

120116en1koqq0fs1tqqtn.png.thumb.jpg

你可以使用这个简单的视图来轻松查看二个新输入的效果。

120116lblmt4zofmmfq01t.png.thumb.jpg

下图是不同晕彩厚度(Iridescent Thickness)值的变化效果。你可以看到晕影遮罩值从0到1(黑色到白色)调节时,晕影效果强度的变化,以及晕影厚度如何改变由晕影效果创建的颜色渐变。

120116epjwczktkddcdemg.jpg.thumb

如果你想在使用晕影时,使效果准确符合物理规则,IridescenceThickness值的单位需要设置为纳米(nm),相关输入的0-1数值范围会重新映射为0-3000nm。

下图是一只大闪蝶,它的翅膀背面是完全不同的颜色和图案。为了实现这种效果,我们在二组翅膀使用了面朝相反方向的法线。

120117c6i6w64ppx56i63f.png.thumb.jpg

为了实现光线穿透翅膀的效果,翅膀底面使用了半透明材质类型进行着色。半透明材质会模拟光线穿过表面的效果,并通过使用厚度图和散射配置文件,改变光线的强度。

120117z8wn989x8axnqdzn.jpg.thumb
120117fpuicdi0s5ncuzn6.png.thumb.jpg

我们有三种材质类型使用散射配置文件:Subsurface Scattering(次表面散射材质)、Subsurface Scattering with Transmission(带有透光效果的次表面散射材质)和Translucent(半透明材质,它只有透光效果)。

120117gnurbq7pzr6pkrtb.jpg.thumb

透光(Transmission)指光线可以完全穿透对象并从另一侧射出。利用透光效果的材质提供了一个选项,通过添加厚度图来调节穿过表面的光线强度。

了解次表面散射的概念及其使用方法,有助于了解如何使用散射配置文件。

次表面散射(Subsurface Scattering)适用于半透明表面。这类表面类型包括:树叶、水果、蔬菜、宝石、布料、牙齿、眼睛和皮肤。当光线进入这些材质的表面时,它会在材质中散射,然后从表面的不同位置射出。

120118x8lgbljrrelrep9v.png.thumb.jpg

利用次表面散射的表面将呈现出整体光照效果的柔化,光线会渗透到附近区域,而且较小的表面细节会变得模糊。

光线在对象中渗透得越远,光照的衰减和散射效果越强。光线可以渗透的“距离”是由厚度图控制的数值,数值越小,次表面散射的效果越明显。

你可以手动绘制厚度图,也可以在Substance Designer或Maya等其它软件生成厚度图。生成厚度图时,需要反转网格表面法线,烘焙环境遮蔽,然后反转环境遮蔽贴图。

散射的总量、角度、产生的颜色以及由光线渗出的颜色都由散射配置文件控制。HDRP中,散射配置文件设置(Diffusion Profile Settings )是一种独特的资源,它保存着散射配置文件。

如果你正使用示例项目,或是通过项目模板创建HD项目,你就已经拥有了散射配置文件设置资源。如果你需要新建该资源,可点击Create > Rendering > Diffusion Profile Settings进行创建。

你需要将其指定到高清渲染管线资源(HD Render Pipeline Asset)。通过点击Project Settings > Graphics > Scriptable Render Pipeline Settings,你可以轻松找到自己的HD资源。

120118aj2nnujs52xbp0n5.png.thumb.jpg

如果设置资源存在,该资源会包含项目正在使用的散射配置文件设置的引用。

120118s969lkcks6ihhqkc.png.thumb.jpg

蝴蝶示例项目包含二个自定义散射配置文件:一个用于翅膀的背面,另一个用于树叶。散射配置文件包含大量自定义选项,可以控制光照如何在网格中散射。

120415w756j67n5o755kv8.png.thumb.jpg

散射距离(Scattering Distance )控制光线散射的强度和颜色。简而言之,这允许你根据对象的材质,控制每个颜色通道上光线的吸收量和反射量。例如:人类皮肤可以显示出红色,因为随着光线的散射,它会呈现皮肤下血液和组织的颜色。

折射率(Index of Refraction)与光进入表面时的弯曲角度相关。折射率是可测量数值,例如:人类皮肤的折射率为1.4,其它多数材质的折射率在1.3~1.5之间。

纹理模式(Texturing Mode)仅适用于使用次表面散射的对象。多数情况下,开发者会使用预散射和后期散射,因为它会使反照率模糊,从而柔化光照的效果。如果反照率由于已有的次表面散射而包含柔化效果,你可以只使用后期散射。

其余选项只会在使用透光材质类型,即Translucent 或Subsurface Scattering with Transmission时可用。修改透光模式(Transmission Mode )将改变阴影使用的逻辑。对于树叶等厚度较薄的物体,你应该仅使用Thin 选项,而对于其它情况,请使用Regular选项。

透光色调(Transmission Tint)是用于透出光线的附加颜色,它会与已有的散射颜色混合。厚度重映射可以让你将0到1的厚度图重新映射到资源适用的范围。

对于较薄的物体,例如:蝴蝶翅膀和树叶,使用Translucency (Transmission only)即可。对于较大或较厚的物体,模拟光线进行散射并从表面其它位置射出的效果也很重要。此时应该使用Subsurface Scattering 或Subsurface Scattering with Transmission。

120415c8ahv97r328p1va5.jpg.thumb

使用Shader Graph改善创作流程
使用Shader Graph着色器视图来实现这些高级着色功能可以大幅减少迭代时间。调整和改善视觉效果需要多次迭代,但是Shader Graph着色器视图的快捷工作流将使该过程更轻松。

120415q6ofoidw6fxndtto.png.thumb.jpg

Shader Graph着色器视图可以减轻特定纹理要求的大部分负担,所以我们只使用三个纹理就能实现理想的视觉效果:散射贴图,主体法线贴图和平铺细节法线贴图。

通过使用Shader Graph着色器视图并进行一些实验,我们发现可以重用散射贴图的通道,并重用法线数据来改变光滑度数值,不必制作额外的纹理。

不必编写代码给Shader Graph着色器视图,带来了快速迭代和实验的自由度。此外它能轻松调整属性和内部数值,实现了强大的迭代能力。例如:如果我们发现经常要修改某个数值,可以右键单击并选择Convert to Property(转换为属性)。现在,当保存着色器后,该属性会出现在通过该着色器创建的任意材质的检视窗口中。

在对蝴蝶的外表进行迭代时,我们最后将许多内部数值公开为属性。这让我们在游戏视图中通过使用准确的光照,后期处理效果和动画效果,来调整蝴蝶。

下面视频中,你可以看到通过公开参数调整蝴蝶视觉效果是多么简单。

观看演示Demo

最后,因为蝴蝶翅膀的二个面很相似,但需要使用不同材质类型和纹理,我们将翅膀逻辑转换为Subgraph(子视图),同时将可定义属性保留为输入。这让我们可以同时编辑翅膀的二个表面,即使它们是二个不同的高级材质类型。

Shader Graph着色器视图实现快速迭代的另一个案例是盆景的树叶。在为盆景树叶选择合适颜色时,我们改变了很多次想法。在构建该场景时,已经到了秋天,为场景营造秋天的氛围会很合适。在尝试许多颜色后,我们最后决定创建由绿色到橙色的过渡,就像树木正处于颜色变化的过程。

我们不想编辑树叶纹理,通过Shader Graph着色器视图,我们可以使用Gradient(渐变)节点来根据树木几何体的世界位置来改变颜色。不同高度的树叶会从Gradient节点接收不同的颜色。我们还添加噪声来破坏Gradient节点的一致性,使盆栽的外表看起来更自然有机。

120416x7u4mmacdvdn7rc7.png.thumb.jpg

所有这些改动都不需要使用纹理制作软件,这也意味着我们不需要烘焙颜色到纹理贴图中,我们可以重复使用贴图中的其它通道来满足灰度纹理的要求,例如:半透明厚度贴图。

如下图所示,通过用属性控制树叶的渐变效果,我们制作出了树叶在一段时间内改变颜色的动画。

120416n33i3ir7773jkigx

结语
HD Lit Shader Graph着色器视图的主节点将为创作利用HDRP高级着色器选项的表面提供更多可能性。我们非常期待看到开发者利用全新HD Lit高级功能选项来实现的场景效果,这些选项已经在Shader Graph着色器视图工作流程中公开。

使用FBX Exporter,进行Unity与3ds Max,Maya的交互

去年我们推出了FBX Exporter,帮助创作者将游戏场景在Unity与Autodesk的3ds Max,Maya之间实现交互工作。现在Unity与Autodesk进行深度合作,本文将介绍Unity如何与多款Autodesk工具Shotgun Software、Revit和VRED实现重要的互通性。

FBX Exporter解决了二个常见的游戏开发用例:
1、在Unity编辑器中对关卡进行建模,然后切换到Maya或3ds Max,使用成品资源来完成关卡制作。
2、在Unity编辑器中录制游戏过程,导出动画到Maya以便动画师进行加工处理,然后返回到Unity,将加工处理后的动画添加到Timeline。

下面,让我们来了解二个用例的详细过程。

导出静态场景
在游戏早期开发阶段,应该避免使用性能消耗昂贵的模型和纹理, 这样可以让游戏设计师专注于设计游戏机制,而不会被游戏最终外观效果分散注意力,所以我们会使用白色或灰色的方块来构建游戏关卡。

理想情况下,建模会在Unity编辑器中完成,从而让设计师能够完全利用Unity丰富的游戏组件。

ProBuilder是进行建模的热门工具,它为游戏设计师提供了实用功能,用来构建墙体、地板、楼梯等简单的几何体或者道具、车辆、角色等动态对象。

132159irzb6346z1yit7na

在绘制关卡时,设计师可以添加物理、导航、游戏脚本、摄像机、音频和输入控制,从而使关卡变得可玩。游戏设计师可以在此阶段快速迭代而无需等待其他部门提供开发资源。

当关卡达到预期的完成阶段时,就可以使用FBX Exporter以FBX格式导出场景或独立对象。

132159u24qalsb2lbuqqqj.png.thumb.jpg

我们将导出的FBX文件可以加载到Maya或3ds Max中,从而让艺术家通过纹理,材质和道具资源添加细节,甚至使用预先制作的模型来替换场景的主要部分。

132200k2a2ad3yeangp0fm.png.thumb.jpg

借助在Maya和3ds Max中使用Unity便捷的DCC集成工具,可以轻松读取或写入FBX文件,不必处理复杂的选项或目录。

集成工具还会进行跟踪,了解应该为每个文件导出哪些对象,并为艺术家提供了一种使用导出内容来更新信息的简单方法。

如下图所示,Unity的DCC集成工具可以在FBX Export Settings中安装。

132200cdgopki0iedd6yig.png.thumb.jpg

FBX Exporter还能实现无损工作流程,自动将改动合并到FBX文件并导入预制件,而且不会破坏关卡设计师添加的所有Unity特定组件,例如:物理设置,导航网格和音频来源。

通常在游戏进行3D处理之前,不会在游戏关卡中强制使用命名规范,这意味建模关卡中的对象名称往往不是最终名称。禁用自动更新程序后,在使用FBX Exporter处理改动的时候,需要将未知FBX对象匹配到对应的Unity游戏对象。

返回到Unity后,迭代过程将会继续,关卡设计师可以将新的FBX文件发送给3D处理部门,3D处理部门也可以继续提供更新后的FBX文件,这样的往返交互过程让艺术家能够使用正确工具进行迭代。

导出动画角色和道具
FBX导出的另一个用例是导出游戏动画,用于制作游戏内影视片段或过场动画。

过场动画通常使用游戏中的相同资源,但是会给动画加入额外的修饰效果。从头开始制作角色动画非常耗时,所以常见方法是在游戏中录制动画,然后在Maya中对动画进行加工处理。FBX Exporter还支持Unity的物理摄像机属性,为动画师提供了Maya中内部场景的精确取景参数。

我们还可以使用Unity Recorder的动画剪辑支持,将游戏过程录制为一个资源。

132200lpgw13rgpp2rizsy.png.thumb.jpg

添加该动画剪辑到Timeline后,可以将其导出为FBX剪辑。

132201fqixsoy7gereiyog

然后,我们可以将FBX剪辑导入Maya,动画师可以使用强大的Maya动画工具集来加工处理以及优化动画。

132201y7uscrrwrm8ex3rr

最后,我们可以将最终动画重新导出为FBX文件,并添加到过场动画的Timeline。

下面的动画往返交互演示视频,将帮助你更好地了解操作过程。

观看动画往返交互演示视频

小结
Unity和Autodesk的合作将迎来巨大机遇,从而对材质互通性带来更多改进,让Unity和Maya,3ds Max具有更紧密的衔接,并增强FBX文件格式的功能。

后续,我们将介绍Unity和Autodesk将如何改进游戏、电影、汽车和AEC(建筑、工程、施工)行业的工作流程。