【译文】Unreal Engine 4 vs Unity 5 (一)

2015年08月18日 13:34 0 点赞 0 评论 更新于 2025-11-21 17:25

原文作者:Maik Klein 原文地址:https://maikklein.github.io/2015/07/20/Unreal-vs-Unity/

调试

调试对开发者而言至关重要,通过调试可以了解应用程序的运行过程。

在UE4中,按下F5即可在编辑器中启动调试模式。在此过程中,可随时修改代码,但不能在Visual Studio中进行编译。不过,能在编辑器中设置断点并进行编译。值得一提的是,调试功能还可用于网络游戏。例如,有4台客户端和1台服务器,在一个被所有客户端调用的函数上设置断点,该断点会触发4次,开发者能随时检查所需的值。

Unity也具备调试游戏代码的能力,但不如UE4流畅。它有一个名为UnityVS的插件,可加载于编辑器或某一程序中。然而,在部分机器上调试速度较慢,如加载UnityVS到编辑器并进入播放模式可能需要10秒钟。此外,Unity的调试只能针对一个实例,若正在创建网络游戏调试实例,这会带来不便,而且UnityVS不允许编辑正在调试的代码。

稳定性

Unity和UE4都存在一定的不稳定性。

在Unity方面,仅用了两天时间,项目就出现问题且难以修正。经排查,原因是在Standalone游戏的asset文件夹中放置了一个自定义工具,这引发了一些奇怪的错误。有时在编辑器中编写脚本时,Unity也会崩溃。不过,在Unity中访问空指针时,代码不会崩溃,而是会记录下来。

UE4的编辑器也经常崩溃,有时检测不到Blueprint的变化,C++代码也存在类似情况。但至少能较为直观地找到问题所在,例如编辑器的编译按钮消失不见。此外,操作不当时UE4也容易崩溃,如忘记做空指针检查并访问空指针,因此需要经常进入调试模式,否则会得到奇怪的提示。

项目升级

项目升级是UE4的短板。每次Epic发布小版本升级,都会出现各种意外问题。建议等待一段时间,并使用与最新版本至少相差一个的版本。例如,若最新版本是4.9,可从4.7升级到4.8版本,因为此时一些常见问题通常已被发现。除非最新版本有特定的功能需求,否则不建议直接升级到最新版本。

关于Unity,作者未进行过项目升级,但推测问题可能主要出现在主要版本的升级上。

开源

开源对于开发者来说非常重要,遇到问题时可以自行解决,同时也有助于了解API的工作原理。虽然Visual Studio中的C++代码量巨大,但能拥有游戏框架的源码已十分难得,作者经常对其进行研究。

与UE4不同,Unity是闭源的。例如,Unity最近发布的适用于多人游戏的UNET,附带了类似NetworkManagerHUD原形脚本的脚本,提供了一个简单的GUI,可用于启动服务器或作为客户端连接到服务器,但这些简单脚本的实现代码是不可见的。

编码

UE4

UE4采用自定义的C++方案,编写C++代码时会大量使用宏指令,这些宏指令会生成一些代码供UE4的Header Tool使用,Header Tool也会生成部分代码。使用UE4时需要注意一些陷阱,例如以下代码:

UFooComponent* FooComponent;
// ...
FooComponent = CreateDefaultSubComponent(TEXT("Foo"));

上述代码中的指针将会被重置为null,需要使用宏指针注释,正确的写法如下:

UPROPERTY()
UFooComponent* FooComponent;

Unity

Unity使用自定义的C#解决方案。作者了解到Unity正在使用IL充血UNET,并且推测对MonoBehaviors也做了类似处理,因为找不到Start方法。在Unity中,可使用如下代码实现值从服务器到客户端的同步:

[SyncVar]
float health;

在UE4中,实现相同功能的代码如下:

UPROPERTY(Replicated, Reliable)
float Health;
// ...
DOREPLIFETIME(AFooSomething, Health);

目前,Unity仍停留在.Net3.5版本,不久后可能会被IL2CPP替代。Unity的游戏框架较为底层,开发者拥有绝对的自由去实现各种功能。而UE4强制开发者使用其游戏框架,该框架虽能适应多种游戏流派,但限制了架构上的自由,且大量使用继承,较为死板。不过,在UE4中可以从头开始随意创建自己的素材。

在Unity中,必须先使用GameObject,然后为其添加MonoBehaviors。UE4中有类似的Actors和ActorComponents,主要可使用Actor的子类。例如,在UE4中创建怪物类:

class AMonster: public AActor

在运行时检查某个角色是否为怪物:

AMonster* Monster = Cast<AMonster>(SomeActor);

在Unity中创建怪物组件的方式如下:

public class Monster: MonoBehaviour
Monster monster = gameObject.GetComponent<Monster>();

此外,Unity还可使用标签来实现类似功能:

gameObject.tag = "Monster";

但作者不喜欢使用字符串标签的方式。

示例

Unity和UE4都有丰富的学习资料,但大多是关于如何使用引擎的,高级的编码示例较少。Epic Games举办的Unreal Tournament(Unreal开发大赛)是UE4的一大亮点,开发者可从中学习Epic内部是如何使用UE4的。

网络

工作流

UE4的网络工作流非常出色,只需点击play,编辑器会自动生成多个游戏实例并连接它们。而Unity没有专门用于多人游戏的工作流。C#的主要优势是编译速度快,但在Unity中,若需要多个游戏实例,需单独编译出一个游戏,创建二进制文件需要花费一定时间。作者为此编写了一个超级编辑器脚本,可产生4个游戏实例,将它们绑定到第二个监听器,启动编辑器作为服务器,并连接4个客户端,该脚本可在这里找到。

网络功能

UE4和Unity的UNet在网络功能上有相似之处,但UNet有附加功能。Unity有中转服务、NAT穿透和大厅系统,使用它创建主服务器较为简单,还可支付少量费用在AWS云上托管游戏,该服务对部分用户免费,对独立开发者很有吸引力。在UE4中,没有NAT穿透功能,需要开放一些端口,但可以创建专属服务器。

在消息发送方面,Unity可以在不同的频道发送消息,例如在频道0发送位置更新消息,在频道1发送重要消息,还可在特定频道设定消息协议,如将频道0设置为不可靠的,将频道1设成可靠的。相比之下,UE4使用单独的属性来标志是否可靠,并为创建的所有角色创建一个频道,然后使用FObjectReplicator来复制属性,还可使用GetNetPriority来控制角色的优先级。

定价

UE4没有附加条件,但会从开发者的收益中获取分成。

Unity有个人版和专业版两个版本。个人版基本没有附加条件,但要求开发者一年的收益低于10万美元,且不能自定义启动画面,也没有黑色的编辑器界面。专业版则包含一系列服务。作者认为在Unity个人版中不能定制启动画面比较烦人,尤其是在使用Unity UNet开发时,每次测试都要观看启动画面。作者建议Unity允许在开发项目时禁用启动画面。

社区

Unity的论坛数量可能比UE4更多,在Reddit上的话题数量比UE4多2.7倍。当遇到常见问题时,从社区获取解答是非常有帮助的。

作者信息

洞悉

洞悉

共发布了 3994 篇文章