Unity3D开发者快速上手Unreal Engine 4指南
Unity3D引擎定位于“游戏开发大众化”,在近年来的手机游戏开发热潮中备受瞩目,拥有广泛的用户基础。EPIC官方专门撰写了一篇文档:Unreal Engine 4 For Unity Developers。下面,我将结合自己学习这两款引擎的体会,进行经验总结。
如果你已经熟悉Unity引擎,现在想掌握UE4,可以从两个不同角度看待你在Unity开发中积累的知识。
作为两款国际水准的现代3D游戏引擎,它们的设计思路有一定相似性,但这种相似仅体现在大方向上,具体细节乃至设计出发点都存在诸多差异。两套引擎背后的设计哲学不同,应用思路也有很大差别。你可以通过本文介绍的两个引擎的相通之处,快速认识UE4,但仍需以全新的学习心态对待UE4。
编辑器对照
Unreal Editor和Unity乍看区别明显,仔细观察会发现它们有一些相似之处,官方文档中的图可作为很好的参照。
1. “Viewport视图”
相当于Unity的Scene视图,用于显示当前所编辑关卡的3D渲染场景。Unreal Editor中没有Game视图,但支持PIE(Play In Editor)。当点击工具栏中的“►播放”按钮时,Viewport会显示当前游戏运行状态,此时其功能相当于Unity的Game视图。
2. “内容浏览器”(Content Browser)
与Unity的Project视图基本相当,用于管理项目中的所有资源(asset)和游戏逻辑代码(包括Blueprint和C++)。在Unity的Project视图中,选中一个资源后可通过Inspector视图调节其属性,部分资源还可通过特定编辑器编辑,如Animation。而在UE4中,所有资源都有各自的编辑器,双击任何资源即可打开特定的独立编辑器,包括静态模型编辑器、Persona骨骼动画编辑器、UMG UI编辑器(Unreal Motion Graphics UI Designer)、Cascade粒子编辑器等。
3. “世界大纲视图”(World Outliner)
相当于Unity中的Hierarchy视图,二者都用于显示当前关卡中的所有对象,并可在列表中选中、编辑。同样支持PIE模式,即游戏运行状态下动态生成的对象也会显示在此处,直观便捷。Unity的Hierarchy视图可呈现、组织GameObject的层次结构,在Unity中常使用空的GameObject当作文件夹;在UE4中,可通过创建文件夹来组织关卡编辑的层次结构。两个引擎的组件模型和对象组织方式存在差异,后续会单独说明。
4. “细节”视图(Details)
它起到一部分Unity的Inspector视图的作用。在Unity中,Inspector视图可显示关卡中的对象(Hierarchy视图中的)的组件及其数据,还能显示项目资源(Project视图中的)的属性;而Unreal Editor的“细节”视图只能显示关卡中的对象(世界大纲视图中的)的组件及其数据,无法显示项目资源(内容浏览器中的)的属性。资源的属性编辑需通过双击资源文件,在独立的编辑器窗口中进行。
项目与资源管理
UE4的项目(Project)和Unity一样,用于管理项目中的所有资源和代码。UE4中的项目内容通过“内容浏览器”查看,相当于Unity的Project视图。内容浏览器中的目录结构与磁盘上的目录结构对应,这一点和Unity相同。
导入UE4项目的所有资源都会被转换成.uasset格式(本质上是特定类型UObject的序列化),而Unity会保存文件的原格式(.fbx、.tga、.png等)。因此,处理UE4资源时,需保存好原格式文件,在资源更新时可使用“重新导入”功能。
项目打包发布时,UE4和Unity都是从关卡列表开始查找所有资源引用,形成最终发布版本。在Unity中,通过Build Settings添加需要发布的关卡;程序运行时动态调用的、非关卡引用的资源可放入固定命名的“Resources”“StreamingAssets”目录中。在UE4中,可通过“项目”的“打包”设置管理发布的关卡列表和固定包含的资源目录。点击菜单“编辑”→“项目设置”,打开项目设置页面,具体选项如下:
- 项目->打包:List of maps to include in a package build
- 项目->打包:Additional Directories to cook
若在“项目设置”页面未找到这两个选项,注意右侧页面底部中间位置有一个向下的小三角指示,点击即可打开高级选项列表。
对象组件模型
Unity和UE4都是基于组件结构的引擎,游戏对象由一系列可重用的组件搭配组合而成。二者思路起点一致:在Unity中,关卡是GameObject的集合,编辑器保存为Scene文件;在UE4中,关卡是Actor的集合,存盘成Map文件。
但后续思路差异较大。在Unity中,所有对象都是GameObject类型,class GameObject没有派生类,也不能从中派生,所有游戏对象的功能都由Component提供,包括游戏脚本MonoBehavior派生类也是Component。而在UE4中,不禁止从Actor派生,也可使用ActorComponent及其派生类对象组建Actor,并且引擎允许扩展Actor来实现对象的特定功能。实际上,UE4提供了一系列Actor的派生类,如Pawn、Controller等,通常需要继承这些类来实现额外功能或调节底层行为,这些继承类构成了UE4的Gameplay Framework。
对象层次结构组织
在Unity中,所有的GameObject都包含一个Transform组件,Transform组件可定义父子关系,从而形成GameObject的父子关系,子对象的Transform在父对象的空间中定义,父对象Destroy时,子对象也会自动Destroy。
在UE4中,Actor是一个空壳,除实现网络功能外,没有太多具体功能,甚至没有Transform。Actor支持父子结构关系,ActorComponent也支持父子对象结构。Actor有一个RootComponent,它可以是SceneComponent及其派生类的实例。SceneComponent包含Transform(即位置、旋转、缩放),RootComponent的Transform决定了Actor的Transform。SceneComponent可以有子组件,子组件的Transform在父组件的空间中定义。
需要注意的是,SceneComponent并不等同于Unity的Transform。Unity的Transform本质上是一个4x4的矩阵,加上父子关系管理,没有派生类;而SceneComponent代表一类组件,是各种可见组件的基类(严格来说,其子类PrimitiveComponent承担此角色),有较深的类派生体系。
关于Prefab
在Unity的工作流程中,Prefab是核心功能之一。在UE3时代,有一个Archetype实现类似功能。在UE4中,可通过Blueprint实现类似功能:编辑好一个Actor后,将其转换成Blueprint class,就相当于一个Prefab。在后续关卡编辑中,可将这个Blueprint class拖放到关卡中创建新实例;修改这个Blueprint class时,关卡中的所有实例对象都会随之改变。
具体而言,上述过程利用了Blueprint的Construction Script功能。在关卡中编辑好一个Actor后,点击“细节”视图中的“蓝图/添加脚本”按钮,将创建一个新的Blueprint class。在“世界大纲视图”中,该对象的类型显示变为“编辑XX Blueprint”。不过,Blueprint并非Prefab,其功能远比Prefab强大,目标是让非编程人员在内容制作上有更大的把控力,几乎能达到程序员的水平。
本次总结先到这里,后续会根据进展陆续分享更多UE4的经验。