Ylisar 发表于 2022-2-11 18:11

Unity Editor 资源使用的Tips[入门]

本文使用 Zhihu On VSCode 创作并发布

前言

Unity Editor以易用,门槛低,以及跨平台在商用引擎中占据大量市场份额,这篇文章主要从编辑器使用角度重点讲其如何做到方便使用者(主要是美术人员)资源的复用来减轻使用者重复设置的负担。这些使用特性也提示我们,如果要为Unity扩展插件,或者自研引擎开发编辑器也应该吸取这些优良的设计,实在的提高使用者的工作效率。其中资源复用是指:编辑器内部或游戏运行时中一些可以随时加入,并且进行二次改动的美术资源(美术素材),或者一些可以再次使用的数值参数,或者整体的标准场景,或者使用者个人偏好的资源集合设置等。这些资源除了运行时需要提交版本控制仓库外,多数都可以为使用者个人设置,方便个人定制。本文使用提问的方式来设置使用场景,通过回答这个问题来解释这些Tips的使用方法。
Q1:我希望能将我提交的美术资源打包成一个我可以控制的对象,在我流程下游的人只需要使用我的资源,并不用关注我资源内部的细节?

A1:Prefab 功能

这里我们可以使用Unity提供的预制件(Prefab)来达到这个目标,Prefab表现为项目Project下的资源文件,它可以被运行时使用。目前的Unity版本支持Prefab的嵌套(将多个Prefab聚集表现出另外一个Prefab),Prefab的变种(Prefab的二次改动,保存为新的Prefab文件),以及在Scene场景中有容许对Prefab的内容进行临时修改(这些变动数值保存在Scene内,增加Scene加载时间)。以下我们举例来说明Step 1:场景模型美术制作了一棵树的资源,一般通过FBX导入这个美术资源自带的所有信息,有经验的项目组一般会在FBX导入过程中定制开发导入流程,直接生成Prefab,下次更新FBX就会自动更新这个Prefab,这样方便DCC制作人员更多关注DCC工具内部,制作更好的资源。Step 2:场景编辑一般以这几个理由嵌套使用Step 1提供的Prefab,1、将不同的树包装成一个小树林,用来占用一小片面积,提高编辑效率2、预计某些地方会有与人交互的树,先包装Step 1生成的Prefab 定义为Action Tree,然后等真正的需求落实的时候,只需要替换这个引用的prefab即可( 不用在大场景中仔细搜索可太方便了)3、嵌套引用Step 1,通过外部包裹一个Prefab的逻辑是这样的,我们用一个简单粒子效果来说明直接生成变种的差别以下是特效美术制作的原始Prefab的设置图:注意到此处提供了特效的默认设置 15 1 1


初始Prefab 特效美术提供


以下是生成的嵌入原始Prefab的新的Prefab,由使用者创建,如图,特效的设置为 15 2 2修改了后面的两个参数


初始Prefab 特效使用者提供


以下是特效美术更新参数了Prefab,更新1,将默认参数修改为 30 3 1



初始Prefab 特效使用者提供


以下再打开嵌套Prefab,我们可以发现特效的设置部分已经同步过来了,并且没有覆盖我们的定制内容 参数为 30 2 2



初始Prefab 特效使用者提供无修改


明白以上的变种与嵌套是使用Prefab的使用重点,prefab更多是资源组合方式,并不显著影响效率,可以大胆规划使用。我们可以设置简单规则:1、使用者创建自己的Prefab,如果资源来自上游,需要上游提供一个Prefab,嵌套使用(Prefab沟通原则)2、正式创建的Prefab都可能被下游流程的人员所使用(公开服务原则)3、嵌套Prefab在执行Ovrrides的Apply时,不得覆盖上游提供的Prefab的内容(权限原则)
通过上述三个简单原则,就可以方便不同身份的美术之间协同制作的流程了。
Q2: 我是一个特效制作者,我需要在制作特效中选用美术素材中的图集或者模型,我希望有一个可以方便预览,方便操作界面来显示这些备用的素材。

A2:Favorites功能

可以使用Unity Editor的Project的Favoriates功能,这个是编辑器内部设置,并不会影响到其他人的操作,请放心使用。具体操作如下:1、选择合适文件夹拖入Favorites下面。



拖入Favorites示意图


2、在搜索栏添加搜索项,比如搜索Texture,然后点后面的星星图标,然后改名为Texture就会展示当前文件夹下的所有贴图了。


设置过滤项并且重命名


依次处理添加其他类型的搜索项3、创建多个Project 窗口,并设置Two Column Layout,将这些Project窗口浮动 这样就展现了几个可以选择资源的界面了,在使用是只在这几个窗口中拖拽资源即可。



展示资源选取界面


当然这些Favoriates窗口的设置你也可以删除。
Q3 程序开发了一个非常棒的功能,它提供了一个复杂的设置界面,我花了很多时间调整了其中的一个配置,我希望在场景中的多个场景对象上都从这个配置开始,然后根据当前场景对象所处位置针对性的调整一下。(简单的说,我只是不想从头调参数,先从一个或者多个可用的参数配置中开始调起)

A3--1, Preset功能

在Unity 2020之后,Unity编辑器提供了一个叫Preset的东西来将任何可以在Inspector中的一些参数保存成可用配置,这个功能就如它的名字一样,叫做“预设”。 这些预设是可以提交到版本管理仓库中的(放在Assets目录下)。Preset实现了类型的匹配,不是相同的组件不会显示这个组件下的预设,以及正常的创建,删除等操作。我们用HDRP中的Decal来说明这个功能1、 我们先设置一个Decal Projector,并将组件Decal Projector的设置保存成预设。这里为了测试,我们还设置了Transform的预设(这个本来没必要)



设置Decal Projector的Preset


2、我们发现所有的Preset都丢在Assets目录下。目前Preset只能放在Assets下面。



Assets下所有可用的Preset


3、在Decal Projector中点开 Preset界面,发现只有匹配的preset才会出现选择不同的preset,对应设置会同步在Inspector界面中,关闭这个界面即为应用设置。



调用可用的Preset


A3——2,component copy/paste功能

我们也可以直接使用inspector界面中的copy component以及paste component values(组件已经存在了,同步设置)或者paste component as New( 添加一个复制的组件)
对比这两个方案,第一个方案功能类似实现了paste component values的功能,但它的优点是将配置从Scene界面上脱离出来变成了可以多人复用的设置模板,对于像后期处理等需要大量经验的参数设定,可以提前准备好预设,供其他人使用。
Q4:我们是一个类似跑地图的游戏,美术通常需要制作大量的美术场景来提供游戏体验(比如塔防类的游戏),作为场景编辑者,我希望在制作场景的时候就能够快速体验到游戏内容(Edit-Play 循环),有没有方法实现这个目标?

A4:使用Scene Additive模式分割功能模块/SceneTemplate功能

Unity的Scene View默认提供了FPS的操作。但是如果需要添加一些游戏场景特有的设置,一般有以下几种用法。1、使用Scene Additive,美术只负责美术的部分(art scene),抽一个游戏逻辑的场景(logic scene),叠加在美术上,要求美术不得修改这个,在运行时,美术根据已有的逻辑来验证art scene是否匹配。这种用法比较适合策划团队比较强,能够快速完成完备的策划案,美术只提供视觉目标。但是一般来说中间状态比较普遍,策划需要美术场景来验证玩法,美术提供的场景设计也需要导出一些数据提炼出来供logic scene使用。使用Scene Additive的方式在很多项目做团队划分方案已经很普遍了,当然Unity提供Additive 模式并不只是这个用途的。Unity也提供了另外一种方案SceneTemplate更像场景模板的样子。2、在Unity 2020及之后的版本提供了将一个普通的场景保存为SceneTemplate,场景模板,设置好的场景模板可以在New Scene中可以选择这个scene模板,我之前在做Visual Effect Group特性说明的时候,我为了减少重复的Scene设置,将其中一个场景设置为SceneTemplate,其他Scene都从这个开始,对于VEG测试的粒子 我就可以写一些简单脚本 将新做的资源直接连过去 就能进行测试了。方法2,目标是部分复用设置,并且开放使用权限,对于每个使用者来说,它都能够提供完整的体验过程,这样比严格限制logic/art scene更方便发现bug,提高迭代效率,对于团队比较小,这种方式可能会更适合。



场景模板功能的设置


Q5:我是一个项目流程标准制定者,我希望我的标准能够通过一个验证场景直观的告诉使用者问题出现在哪里,这个标准验证场景,我不容许有除了我容许的修改,我应该怎么提供这种场景给不同的项目?

A5:使用Packages的Samples

这里的目标是场景级别的不容许修改,并且这个场景只是流程的质检员,并不在运行时中使用。1、比较直接的想法是在载入Additive Scene时在Editor模式下时刻注意修改操作的回退,这个是需要写代码以及标记对应的场景不可修改的。2、这里我们可以使用Unity的PackageManager提供的Sample功能来提供标准场景下载使用,并且这个场景的资源不会导入打包流程(除非特意为之)。当使用者修改了这个sample场景的备份,你都可以直接删除这个场景,重新下载。对应方法2,操作就是将流程质检的代码封装成一个package,通过unity的package manager安装即可。以下用Animation Rigging的Samples来说明这种资源不可修改,以及资源不会主动包含在项目打包流程中的情况



Package的Samples


如何在PackageInfo.json文件中添加Sample配置,以下是Animation Rigging的PackageInfo信息,注意"samples"配置
{
"name": "com.unity.animation.rigging",
"displayName": "Animation Rigging",
"version": "1.0.3",
"unity": "2020.2",
"unityRelease": "0a16",
"description": "Animation Rigging toolkit using Unity's Animation C# Jobs",
"keywords": [
    "Animation",
    "Rigging",
    "Constraints"
],
"category": "Animation",
"dependencies": {
    "com.unity.burst": "1.3.4",
    "com.unity.test-framework": "1.1.14"
},
"relatedPackages": {
    "com.unity.animation.rigging.tests": "1.0.3"
},
"upmCi": {
    "footprint": "c4c7a5d6c483c0c00c8f2d3f7fa50c812ee80ea6"
},
"repository": {
    "url": "https://github.cds.internal.unity3d.com/unity/com.unity.animation.rigging.git",
    "type": "git",
    "revision": "536ae6adeb6f1066ee89b6938f6ba5828ea92e5f"
},
"samples": [
    {
      "displayName": "Animation Rigging Constraint Samples",
      "description": "Import ConstraintSamples.unitypackage to see basic setup and usage of animation rigging constraints.",
      "path": "Samples~/ConstraintSamples"
    }
]
}
以上内容我是根据unity默认提供的功能结合使用者的一些需求,给出的解决方案,未完待续
页: [1]
查看完整版本: Unity Editor 资源使用的Tips[入门]