ue4和unity对比
Posted zhangxiaofan666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ue4和unity对比相关的知识,希望对你有一定的参考价值。
ON THIS PAGE
本指南将从 Unity 用户的视角来介绍虚幻4,并帮助你将 Unity 的开发经验应用到虚幻 4 的世界中。
编辑器
下面分别是 Unity 编辑器和虚幻编辑器的截图,我们用颜色标出了界面中的不同区域,并用相同颜色标出了拥有相同功能的区域。每个区域上还添加了名称,以便你了解它们在虚幻引擎语境中的称呼。虚幻编辑器支持自定义布局,你可以通过拖动各个窗口来移动它们。
编辑资产
在 Unity 中,用户使用 Inspector 选项卡来编辑当前选中的资产。在虚幻 4 中,我们使用 细节 面板来展示当前选中对象的属性,比较复杂的编辑工作则有专门的窗口或选项卡来处理。每编辑一项资产,都会单独打开一个带有选项卡的窗口,类似于网页浏览器。当然这窗口也可以任意拖拽,或者悬浮在其他窗口之上作为独立窗口显示。
术语简表
下表左侧是 Unity 中的常见术语,右侧则是对应的(或差不多的)虚幻 4 术语。虚幻 4 的关键词直接链接到更进一步的虚幻在线文档中。
项目文件和文件
怎么理解项目中的目录和文件?
和 Unity 项目一样,虚幻项目也保存在专门的目录结构中,并且有着自己的项目文件。你可以 双击 .uproject 文件打开虚幻编辑器并加载该项目,或者 点击右键 查看更多选项。项目目录包含不同子目录,保存了游戏的资产内容和源代码,以及各种配置文件和二进制文件。其中最重要的就是 Content 子目录和 Source 子目录。
我的资产应该放在哪里?
在虚幻 4 中,每个项目都有一个 Content 文件夹。它类似于 Unity 项目的 Asset 目录,是你保存游戏资产的地方。假如你要在游戏中导入资产,只需要将资产拷贝到 Content 目录,它们便会自动导入并出现在 内容浏览器 中。当使用外部程序修改这些资产时,编辑器中的资产也会自动更新。
支持哪些常见文件格式?
Unity 支持很多文件格式。虚幻 4 也支持最常见的文件格式,如下表:
场景是如何保存的?
在 Unity 中,你把 GameObjects 放置在场景中,然后将场景(Scene)保存为场景资产文件。虚幻使用 地图文件(Map file),它类似于 Unity 中的场景。地图文件保存了 关卡 的数据、关卡中的对象,光照数据,以及某些关卡特定的设置信息。
如何修改项目设置?
所有项目设置都可以在主菜单的 编辑(Edit) / 项目设置(Project Settings) 中找到。和 Unity 的设置类似,它们允许你设置项目信息(比如项目名称和图标),配置游戏输入绑定,定义运行项目时引擎的行为。你可以在这里 了解更多关于项目设置的单独信息。Unity 还有叫做 "玩家设置" 的部分,在虚幻中,我们叫 "平台设置",你可以在项目设置的 "平台" 分类里找到该设置。
源文件在哪里?
在 Unity 中,用户习惯将 C# 的源文件放在资产目录中。
虚幻 4 的工作机制有点不同。假如项目包含 C++ 代码,你会在项目目录中找到一个 Source 子目录,其中包含各种文件,包括 C++ 源文件(.cpp)和头文件(.h),以及一些编译用的脚本(.Build.cs,.Target.cs)。不过,如果项目只包含蓝图,则项目中没有 Source 目录。
在虚幻 4 中使用 C++ 的最简单做法就是通过编辑器菜单 为项目添加代码(Add Code To Project)(在主菜单的文件菜单中),或者直接用某个模板新建一个 C++ 项目。你可以在 内容浏览器 中直接找到 C++ 类,双击它们能直接在 Visual Studio 或 Xcode 中打开该文件。
从 GameObjects 到 Actors
GameObject 去哪里了?
在 Unity 中, GameObject 是可以放置在地图中的 "东西"。虚幻 4 中对应的概念是 Actor。在虚幻编辑器中,你可以从放置面板直接拖一个空的 Actor 放置到场景中:
你虽然可以通过空 Actor 来制作游戏,但虚幻 4 提供了各类特殊 Actor,并预制了它们的特性,比如 Pawn(用于作为玩家或者 AI 的角色),或者 Character(用于会做动作的生物)。和空 Actor 一样,你可以直接将它们拖拽至场景中,并给它们添加组件,或自定义属性。你之后会学习到更多相关内容,但目前你只需了解虚幻 4 采用 (Gameplay 框架)[(Gameplay/Framework)] 来协同各种特殊的 Actor 一起工作。
虚幻 4 中的 Actor 和 Unity 中的 GameObjects 稍有不同。在 Unity 中,GameObject 属于 C# 类,并且无法直接扩展。在虚幻 4 中,Actor 属于 C++ 类,而且允许你通过继承来拓展和自定义。关于这点,我们以后会具体介绍!
组件在哪里?
在 Unity 中,你可以通过为 GameObject 添加组件来赋予其特定的功能。
在虚幻 4 中,你也可以为 Actor 添加组件。在关卡中放置一个空 Actor 后,点击"添加组件"按钮(位于 细节 面板中),然后选择一个组件来添加。这里让我们创建一把火炬:首先放置一个空 Actor,然后添加一个网格体组件作为基座,再添加一个光源和粒子系统作为它的火焰。
在 Unity 中,GameObject 以列表形式保存组件,但在虚幻 4 中, Actor 以 层级 形式保存它的组件,并且组件之间相互绑定。你可以在上面的例子中看到,光源和粒子与网格模型相互绑定。之后在 复合 Actor 和 复合 GameObject 中会对此进行讨论。
从 Unity 的 Prefabs 到虚幻 4 的蓝图类
Unity 的工作流程是基于 预制件(prefab) 的。在 Unity 中,你一般是创建一系列带有组件的 GameObject,然后基于它们生成 Prefab。然后你在场景中放置 Prefab 的实例,或者在运行时将它们实例化。
虚幻 4 则基于蓝图类来工作。在虚幻 4 中,你一般是创建一个带有组件的 Actor,然后选中它并点击 蓝图 / 添加脚本(Blueprint / Add Script) 按钮(位于 细节 面板中)。然后选择一个位置保存你的蓝图类,点击 创建蓝图(Create Blueprint) 来保存你新建的蓝图!
新建的蓝图类可以在 内容浏览器 中找到。你可以直接 双击 打开编辑它们,也可以将它们拖拽到任意场景关卡中。
Unity中的 Script 组件和 MonoBehaviour 去哪里了?
在 Unity 中,你通过为 GameObject 添加脚本(Script)组件来添加 C# 脚本内容。你通过创建继承自 MonoBehavior 的类来定义脚本组件的功能。
虚幻 4 也有类似的内容。你可以自由创建全新的组件类,并将它应用于任意 Actor。组件类可以使用蓝图脚本创建,也可以用 C++ 创建。
那么在虚幻 4 中如何创建自己的组件类呢?在 细节 面板中,添加组件(Add Component)的下拉框中,可以看到,你可以新建组件,或者选择已经存在的组件:
在 Unity 中,每当你新建一个继承自 MonoBahaviour 的类,你都会得到一个模板文件,其中包含 Start() 函数和 Update() 函数。
在虚幻 4 中,也有一个充当模板的类,其中包含 InitializeComponent() 函数和 TickComponent() 函数,它们和 Start、Update 具有类似的行为。
如果你创建的是蓝图脚本组件,则会看到类似的函数由可视化节点的形式展现:
可编辑脚本的 Actor 蓝图类
虚幻 4 有一项很酷的功能:新建的 Actor 蓝图类会拥有自己的可视化蓝图脚本!这样你就能为整个对象添加逻辑,而不仅仅是单个组件。结合继承结构关系(稍后下文会解释),这会为你在设计游戏时提供很多灵活性。
除了支持蓝图可视化脚本,虚幻 4 还支持通过 C++ 代码来实现功能。 这里对比了Unity和UE4中的代码,还给出了对应的蓝图实现:
UE4 蓝图 |
虚幻 4 蓝图类的扩展性
Unity 的 prefab 和虚幻 4 的蓝图类都可以在游戏中实例化。不过,Unity 的 prefab 在相互嵌套时会产生比较复杂的状况,从而限制其可扩展性。
在虚幻 4 中,你可以让新建的蓝图类继承某个现有的蓝图类,然后通过新的属性、组件和可视化脚本功能来增强它。
比如,在虚幻 4 中,你可以创建一个叫做 Monster 的蓝图类,用它实现基本的怪物功能,比如追击人类。然后你可以再创建一个蓝图类来扩展它,比如 Dragon(会喷火的怪物),或者 Grue(天黑后会吃人的怪物),以及其他 8 种类型。这些 Monster 子类都继承了 Monster 父类的功能,并在此基础上获得了新的能力。
在 Unity 中,你需要创建很多不同的 GameObject prefab 才能实现这点:你要为 Dragon 创建一个prefab,为 Grue 创建一个prefab,诸如此类。假设你希望为所有怪物都添加某个功能,比如添加一个 Speak 组件来让它们说话,在 Unity 中你需要更新所有 10 个 prefab,把功能拷贝粘贴到每个 prefab 中。
在虚幻 4 中,你只需简单地修改 Monster 的蓝图类,为它新增 Speak 的能力,然后就OK了!Dragon,Grue 以及其他 8 种 Monster 的子类都会自动继承这个说话的新功能,并不需要你去一一修改。
好处还不止这些!我们关于蓝图类所说的一切,同样适用于 C++ 类,也同样对 Actor 和 组件 适用。这些系统从设计之初就能支持大规模开发可扩展功能,可以为 10 个开发人员的项目服务,也可以为 100 个人的项目服务。
那么应该用蓝图脚本还是 C++ 代码呢?或者同时使用?
蓝图可视化脚本适合实现简单的游戏逻辑以及按顺序进行的事件。这个系统对策划、美术以及面向可视化编程的程序员是非常好用的,它能以可视化的方式轻松访问并管理游戏内对象。你完全可以仅凭蓝图完成一个游戏的制作。请参考 Tappy Chicken 示例,它是一个完整的范例。
C++ 编程适合用于大型任务,比如编写某个游戏逻辑系统,制作复杂的 AI 行为,或者新增引擎功能。对于已经掌握了 C++ 技能的开发人员来说,可以翻阅一下 在虚幻 4 中的 C++ 编程简述 页面。
大部分的项目都适合混合使用蓝图和 C++。很多开发者都用蓝图来创作游戏原型,因为这个过程容易而且有趣,但之后出于性能优化、项目优化等考量,会把它们迁移到 C++ 中。
蓝图类也能扩展 C++ 类
虚幻 4 的游戏开发中很多令人着迷的过程来存在于程序员用 C++ 实现新的功能,而策划和美术在蓝图中使用这些功能,并提出更多要求!下图是针对一个虚幻 4 的射击游戏项目中实现拾取物品过程时,团队的一种形式,混合了 C++ 类的编程实现,以及蓝图类用于处理行为和表现。
变换(Transform)组件
在 Unity 中,每个 GameObject 都有一个变换组件(Transform Component),用于指定该 GameObject 在世界中的位置、旋转度以及缩放比例。
虚幻 4 也一样,Actor 有一个 Root Component,能够作为场景组件的任意子类。场景组件(Scene Component) 指定了 Actor 在世界中的位置、角度及缩放比例,而这些属性会影响该 Actor 的所有子对象。很多有用的组件都是场景组件的子类,因此让它们具有位置信息是非常有用的!
即便你只放置一个空 Actor,虚幻 4 也会为它创建一个"默认场景根(Default Scene Root)"对象,这是一个最简单的场景组件。当你放置一个新的场景组件时,默认场景根对象会被替换掉。
复合对象
在 Unity 中,你可以通过构建 GameObject 层级以及绑定它们的变换组件来创建复合对象。
在虚幻 4 中,你可以通过让组件按照层级关系相互嵌套,来创建复合游戏对象。
从上图可以看到,你可以让场景组件互相附加来得到一个相互嵌套的层级关系,因为它们都有变换——这点类似于 Unity 中的变换绑定。Actor 组件(所有组件的基类)只能直接附加到 Actor 自己身上。
我是否应该用组件来创造其他一切?
其实这完全取决于你自己,大部分情况下,你应该是结合使用 Actor 类和一些自定义组件。我们先前已经提到过,虚幻 4 已经提供了一些特殊类型的 Actor ,它们附带一定功能,并且包含某些组件。比如一个 Character 总是会包含一个 Character Movement 组件。
引擎中你会很快遇到一些继承自 Actor 的子类,大部分游戏都会用到它们。这里列出了一些与 Actor 相关的最常见的类:
- Pawn - Actor 的一种类型,用于表现一个可供控制的游戏对象,比如玩家操控的角色。玩家或者 AI 通常通过 Controller 来控制并移动 Pawn。
- Character - 一种特殊类型的 Pawn,用于双足类型的角色,并具备一些复杂的功能。
- Controller - 占有并控制一个 Pawn。通过将 Pawn 和 Controller 的分离,我们可以编写 AI Controller,用于控制 Pawn,并且和玩家控制 Pawn 采用相同的接口。
- Player Controller - 一个更为特殊的 Controller,用于从玩家的手柄、触控板、鼠标/键盘获得输入信息,并将这些信息驱动玩家所控制的 Pawn 或者 Character 的行为。
那么所有的东西都是 Actor 咯?
并非如此。Actor 是虚幻 4 中最常见的用于游戏的类,并是唯一能够在 世界 中 生成 的类。因此任何能放置在关卡中的对象都属于 Actor。
另外一个需要知道的关键类是 Object。Object 实际上是所有虚幻引擎的类的基类,包括 Actor 以及其他一些类都是如此。这是一个比 Actor 更加底层的类,但作为虚幻中的类,它仍拥有一些基本功能,比如 反射 和 序列化。Object 是一个非常基础的类,当我们需要定义一个新的类但又并非 Actor 的时候会使用它。比如 Actor Component 是所有组件的基类,而它则是继承 Object 而非 Actor。
虚幻 4 中 Gameplay 框架是什么东西?
好吧,从这里开始事情就开始变得有趣了(酷炫的方向)。Unity 提供了一个干净的框架用于设计游戏,虚幻也做了同样的事情。Unity 中你可以基于 GameObjects 和组件来创建所有东西,而在虚幻中则是基于 Actor 和组件来创建。
不过,虚幻在顶层提供了叫做 Gameplay 框架 的机制,而 Unity 完全没有这类内容。虽然做游戏并非一定要用这个框架,但如果用的话会非常酷!简单来说,假如你能利用一些基础类,并且遵循特定规范,你就能很容易获得一些很赞的功能,否则你自己实现可能要花费很多时间,而且也很困难,或者很难改造。(比如完整的多人游戏支持!)
已有大量的酷炫游戏在开发时采用了虚幻的 Gameplay 框架,所以它很值得你花点时间来了解。没错,你可以自己实现这类框架,这么做完全没问题!但虚幻 4 当前已有数以百计的炫酷开发者在使用它,因此我们花点时间来了解一下。
要使用 Gameplay 框架,你只需要了解一些预制的 Actor 类,比如 Pawn,Character,和 Player Controller,并逐步了解虚幻的网络复制和网络其他功能。现在我们先回到最基本的部分。
如何在虚幻 4 中编写代码
写给 MonoDevelop 的程序员
假如是编写蓝图,你只需要用到虚幻编辑器——所有工具都已包括在内!假如要编写 C++ 代码,你还要在 Windows 平台下载 Visual Studio 的免费版本,如果是 Mac 的话则需要安装 Xcode。当第一次创建一个新项目(或者为已有项目添加代码)时,虚幻 4 将会自动创建 Visual Studio 项目文件。你只需要在 内容浏览器 中双击一个 C++ 的类便能在 Visual Studio 中打开它,或者在主菜单的文件菜单中点击 Open Visual Studio。
虚幻 4 有一点很不同:有时必须手动更新 Visual Studio 项目文件(比如,下载了 UE4 的新版本,或者对源代码文件的磁盘存放位置做了人为改变)。你可以通过在主菜单中点击 Refresh Visual Studio Project 或者在项目目录中 右键点击 .uproject 文件 并选择 Generate Visual Studio project files 便可。
编写事件函数(Start,Update 等)
如果你用过 MonoBehaviors,那你一定熟悉 Start,Update 和 OnDestroy 这类方法。以下是对 Unity 的行为和对应的虚幻 4 的 Actor 和组件的比较。
在 Unity 中,某个基本组件的代码可能是这样:
请记住,在虚幻 4 中,你可以直接为 Actor 写代码而无需创建新的组件来添加代码。这其实是很常见并有意义的。
类似于 Unity 的 Start,OnDestroy 和 Update 函数,虚幻 4 在 Actor 中有类似的方法:
C++:
蓝图:
在虚幻 4 中,组件使用不同的函数。以下是示例:
C++:
蓝图:
注意,在虚幻 4 中调用基类方法很重要。
比如,在 Unity C# 中可能是调用 base.Update(),但在虚幻 4 的 C++ 中我们使用 Super::TickComponent():
你也许已经注意到 C++ 中有些类以 "A" 开头,而其他一些类以 "U" 开头。前缀 "A" 代表它是 Actor 的子类,而前缀 "U" 代表它是 Object 的子类。还有其他一些前缀,比如 "F" 通常表示一个简单的数据结构类,或者其他非 Uboject 类。
在虚幻 4 中编写游戏逻辑代码
好了,现在开始稍微深入一些。我们将探讨游戏创建相关的关键编程话题。因为你了解 Unity,我们将从 C# 用户的角度来解释 C++ 的功能,当然你也可以使用蓝图来完成几乎所有的事情!我们会尽可能提供用 C++ 和蓝图编写的范例。
先说一下一些通用的游戏逻辑编程模式,以及如何在虚幻中实现它们。许多 Unity 中的函数在虚幻中都有类似的函数。我们先从最常见的开始。
实例化 GameObject / 生成 Actor
在 Unity 中,我们使用 Instantiate 函数来新建对象的实例。
该函数可以获取任意一种FairyGUI和NGUI对比