Unity3d引擎定位在“游戏开发大众化”,在近年的手机游戏开发热潮中着实火了一把,拥有广大的用户基础。EPIC官方还专门写了一篇文档:
Unreal Engine 4 For Unity Developers:https://docs.unrealengine.com/latest/INT/GettingStarted/FromUnity/index.html
下面本人就自己个人的一些学习这两款引擎的一些体会,做一些经验总结。
如果你已经熟悉了Unity引擎,现在想要掌握UE4,可以从两个不同的角度来看待你在Unity开发上积累的知识:
作为两个国际水平的现代3d游戏引擎,他们两个的设计思路有一定的相似之处。这种相似,只是大方向上的,具体的细节,甚至是设计的出发点都有很多差异。
两套引擎背后的设计哲学是不同的,应用思路其实差别也很大。你可以通过本文描述的两个引擎的相通的地方,对UE4有一个快速的认识。然后,还是需要把瓶子里的水倒空,当作是一个全新的学习历程来看待UE4。

编辑器对照
Unreal Editor和Unity乍看上去区别很大,仔细看一下,发现他们还是有一些相似之处的,从官方文档中的图可以作为一个很好的比照。

  • “Viewport视图”,相当于Unity的Scene视图,显示当前所编辑的关卡的3D渲染场景。在Unreal Editor中没有Game视图,但是它也支持PIE(Play In Editor)。当你点击工具栏中的“►播放”按钮时,Viewport就会显示当前的游戏运行状态了,变成Unity的Game视图了。
  • “内容浏览器”(Content Browser),与Unity的Project视图基本相当,内容浏览器管理你项目中的所有资源(asset)和游戏逻辑代码(包括Blueprint和C++)。
    在Unity的Project视图,你可以选中一个资源,通过Inspector视图来调节其属性,而有些资源可以通过特定的编辑器来编辑,例如Animation。而在UE4,所有的资源都有自己的编辑器,你可以双击任何一个资源,打开特定的独立编辑器,包括静态模型编辑器,Persona骨骼动画编辑器,UMG UI编辑器(Unreal Motion Graphics UI Designer),Cascade粒子编辑器等等。
  • “世界大纲视图”(World Outliner),相当于Unity中的Hierarchy视图。它们都是显示当前关卡中的所有对象,并可以在此列表中选中、编辑;同样支持PIE模式中(即在游戏运行状态下),动态生成的对象也会显示在这里,非常直观。
    就像它的名字一样,Unity的Hierarchy视图,可以呈现、组织GameObject的层次结构;在Unity中我们经常使用空的GameObject来当作文件夹使用,在UE4,你可以通过创建文件夹来组织关卡编辑的层次结构。两个引擎的组件模型、对象组织方式有一些差异,后面还会单独说一下。
  • “细节”视图(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的经验。