Unity5 VS UE4

1649 篇文章 11 订阅
1623 篇文章 22 订阅

Unity5 VS UE4

Unity3D教程手册(墨客er) · 2015-08-12 20:58

Unity5 VS UE4



UE4和Unity5都是非常受开发者欢迎的游戏引擎,那么到底它们之间有什么不同呢?如何做出选择呢?下面这篇文章是一名独立游戏开发者Maik Klein,根据自己的开发经验给出的总结意见。


调试


调试可以帮助你判断,在应用程序的运行过程中发生了什么。


在UE4中,只需要在Debug模式下按下F5即可(只需要按下F5就可以在编辑器中启用Debug模式)。你可以随时修改代码,但是在调试期间,不能在VS中进行编译。你可以在编辑器中设置断点,对代码进行编译。


调试功能甚至可以使用于网络游戏,这一点非常棒。想象如下场景,四个客户端一个服务器,并且你在一个所有客户端都会调用到的函数中打了断点,这个断点将会被触发4次,随时都可以查看任何你想要的值。


Unity的调试功能不如UE4方便。使用UnityVS插件,它可以将VisualStudio与编辑器或者编译好的可执行程序相结合。但是,调试的过程会缓慢一些,从点击Play按钮到实际进行运行模式大概需要10秒钟的时间。


每次只能调试一个实例,如果是网游,这是非常麻烦的问题,UnityVS不支持调试时编辑代码。


稳定性


我认为Unity和UE4都有一些不稳定。


仅两天的时间,我的Unity项目变的糟糕并且很难修正,花费了不少时间,我找到了原因,因为我写了一个自定义工具放在Standalone游戏的asset文件夹中,从而导致了一些非常奇怪的错误发生,有些时候,我正在编辑器中编写脚本,Unity居然崩溃了。


UE的编辑器经常会崩溃,有时会检测不到Blueprint的变化。对于C++也会存在相同的情况,但是至少可以直观的找到到底是哪里出了问题。比如,编辑器的的编译按钮消失不见。


操作不当的时候UE4也会经常崩溃。比如,忘了做空指针检查然后访问了空指针,所以需要经常进入调试模式,否则会得到很奇怪的提示。


但在Unity中代码还没有崩溃过,在Unity中你访问了空指针,它会记录下来。


项目升级


项目升级对于UE4来说是短板,每次Epic发布小版本升级,都会出现各种出乎意外的问题。


我的建议是等待并且使用与最新版本至少相差一个的版本。如:最新版本是4.9,你可以从4.7升级到4.8版本。因为至少这个时候,一些常见的问题会发现出来。建议不要升级到最新的版本,除非最新的版本有一些特有功能。


我并没有在Unity中升级过项目,但是我推测一些问题仅会发生在主要版本的升级上。


开源


开源对于我来说是非常重要的,遇见问题自己可以解决。并且对于了解API的工作原理也很有帮助,坦白说Visual Studio中的百万级的C++代码量实在是太大了。但是有的游戏框架的源码已经非常好了,我现在经常研究。


与UE4不同的是,Unity是闭源的。


举个例子:Unity最近发布了UNET,适用于Unity的多人解决方案。附带了类似于NetworkManagerHUD原形脚本一样的脚本,提供了一个简单的GUI。你可以启动服务器,或者作为客户端连接到服务器,但是如此简单的脚本实现都是不可见的。


编码


UE4使用自定义的C++方案,编写C++时主要使用很多宏指令,这些宏指令会生成的一些代码提供给UE4的Header Tool,它会生成一些代码。


UE4有些陷阱需要注意。例如,如下代码:


UFooComponent* FooComponent;

....

FooComponent = CreateDefaultSubComponent(TEXT(“Foo"));


这个指针将会被重置为null,需要像这样注释宏指针。


UPROPERTY()

UFooComponent* FooComponent;


Unity使用自定义的C#解决方案,我了解到他们正在使用IL充血UNET,并且我确信他们对MonoBehaviors做了同样的事情,因为我找不到Start的方法。


在Unity中可以写成这样:


[SyncVar]

float health;


它会将值从服务器同步到客户端。


在UE4中写法如下:


UPROPERTY(Replicated,Reliable)

float Health;

...

DOREPLIFETIME(AFooSomething, Health);


悲催的是,Unity仍停留在.Net3.5,不久以后可能会被IL2CPP所替代,但目前仍旧是使用.Net3.5。


Unity的游戏框架很底层,你有绝对的自由去做任何你想做的。


UE4强制你使用它的游戏框架,它可以适应很多游戏流派,但限制了架构上的自由。UE4游戏框架使用了大量继承,这很死板。


好处是你可以从头开始随意创建自己的素材。


在Unity中你必须使用GameObject,然后才可以为其加上MonoBehaviours。


UE4有类似的东西叫做Actors和ActorComponents,主要是可以使用Actor的子类。


比如,可以创建:


class AMonster: public AActor


然后在运行时,检查一些角色是不是怪物:


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


在Unity中你可能这样创建怪物组件:


public class Monster: MonoBehevaior

Monster monster = gameObject.GetComponent<Monster>();


还有一种选择,使用标签:


gameObject.tag = “Monster";


但是我非常不喜欢这样使用字符串。


示例


Unity和UE4都有很多学习资料,但是大多数都是关于如何使用引擎的。基本上没有高级的编码示例。


Epic Games举办的Unreal Tournament(Unreal开发大赛)是UE4的一大亮点,可以从中学习Epic内部是如何使用UE4的。


网络


UE4的网络工作流是非常棒的,只需要点击play,编辑器会自动生成多个游戏实例并连接它们。


Unity并没有用于多人游戏的工作流。于我而言,C#的主要优势是它的编译速度,但是在Unity中,如果你想要多个游戏实例的话,需要单独编译出一个游戏,编译创建那些二进制文件需要花一些时间。


这就是我自己写了一个超级编辑器脚本的原因,它能产生4个游戏实例,将他们绑定到我的第二个监听器,启动编辑器作为服务器,并连接4个客户端。


你可以在这里找到这个脚本:https://github.com/MaikKlein/UNetHelpers


总之,UE4的网络和Unity的UNet感觉很像,但是UNet带有附加功能。Unity有一个中转服务,NAT穿透,一个大厅系统,使用它创建主服务器很简单。Unity也可以收取少量费用,在AWS云上帮你托管游戏。这个服务对一小部分用户甚至是免费的,对于像我一样的独立开发者来说很诱人。


我可以托管我的demo游戏和朋友一起玩。在UE4中,没有NAT穿透,所以需要开放一些端口,但是至少在UE4中你可以创建专属服务器。


在Unity中可以在不同的频道发送消息。比如,你可以在频道0发送位置更新消息,重要一点的消息在频道1发送,也可以在特定频道设定消息协议。比如,你可以将频道0设置为不可靠的,将频道1设成可靠的。


相比之下UE4使用单独的属性来标志是否可靠,并为创建的所有角色创建一个频道,然后使用FObjectReplicator来复制属性。


你可以使用 GetNetPriority来控制角色的优先级。


定价


UE4没有任何附加条件,但是会从你的收益中获取分成。


Unity有两个不同的版本,个人版和专业版。个人版基本上没有附加条件,但是你一年的收益要低于10万美元,且不能自定义启动画面,也没有黑色的编辑器界面,专业版包含一系列服务。


我发现在Unity个人版中不能定制启动画面很烦人。我其实并不关心我的用户是否能看到Unity的启动画面,我关心的是使用Unity UNet开发我不得不创建一个单独的游戏,这意味着每次要测试一些东西都必须观看启动画面。


我觉得Unity应该允许在开发项目时禁用启动画面。


社区


Unity的论坛可能比UE4数量更多。Unity在Reddit的话题数量比UE4多2.7倍,当你遇见一些常见的问题的时候,从社区获得解答,是一个非常有利的事情。


原文作者:Maik Klein

本文由蛮牛社区(manew.com)墨客er翻译发布。

蛮牛社区(manew.com)分享最新的游戏研发和虚拟现实相关技术内容。

蛮牛译馆现公开招募"蛮牛译员",欢迎想要报名的网友在下方留言调戏小编呦~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
5G PDU(Packet Data Unit)的会话建立流程如下: 1. UE(User Equipment,用户设备)通过RRC(Radio Resource Control,无线资源控制)连接到NR(New Radio,新无线电)网络。 2. UE发送RRC连接请求给gNB(gNodeB,5G基站),包括UE的身份信息和所需服务。 3. gNB接收到RRC连接请求后,验证UE的身份信息,并为UE分配一个唯一的标识符,称为GUTI(Globally Unique Temporary Identifier,全局唯一临时标识符)。 4. gNB发送RRC连接确认给UE,包含GUTI和其他必要的参数。 5. UE接收到RRC连接确认后,使用GUTI向AMF(Access and Mobility Management Function,接入和移动管理功能)发送Initial UE Message,请求建立5G会话。 6. AMF接收到Initial UE Message后,将UE的请求发给SMF(Session Management Function,会话管理功能)。 7. SMF根据UE的请求,分配一个唯一的标识符,称为SUPI(Subscription Permanent Identifier,订阅永久标识符),并将SUPI与UE的GUTI进行关联。 8. SMF为UE分配一个PDU会话标识符(PDU Session ID),用于标识UE的数据传输会话。 9. SMF将PDU会话标识符和其他必要的参数发送给AMF。 10. AMF将PDU会话标识符和其他必要的参数发送给gNB。 11. gNB接收到PDU会话标识符后,将其发送给UE。 12. UE接收到PDU会话标识符后,使用该标识符建立与gNB之间的数据传输会话。 13. 数据传输会话建立完成后,UE可以通过该会话与网络进行数据通信。 以上是5G PDU会话建立的简要流程,具体的流程可能会根据网络架构和协议版本有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值