RedZero9 发表于 2023-3-3 21:55

写给Unity开发者的Unreal Engine开发指南 (扫盲)

写在前面的话


本篇的标题其实起源于UE引擎的官方文档,如果感兴趣可以跳转去看官方文档。Unreal Engine for Unity Developers 。 如果对更多的UE基础感兴趣也可以跳转到Understanding the Basics 地址去学习UE的入门。

从毕业开始到现在,我一直就在游戏行业里,也算是一个游戏从业的老兵了。而过去的十多年一直在使用Unity引擎开发移动游戏。随着市场对引擎改造的需求越来越大,移动设备的性能越来越好,加上堡垒之夜的成功等各种因素的促进,使得Unreal引擎在开发中重度的移动游戏的比重越来越大。而对于诸如TPS,无缝大世界等热门的技术又有完全的解决方案,自然会有很多游戏公司开始尝试使用UE进行项目开发。

目前本人在过去的1年多时间里也使用UE引擎完成了一个高仿真数字人项目的开发,并取得了良好的反馈。相关的技术方案已经在朝夕光年的内部做过完整的分享。但可惜的是,出于技术保密原因,原定于UOD2022大会上进行的技术分享被临时取消了。



从字节出来以后,目前担任一个Unity项目的技术负责人,未来会新开坑一个Unreal 引擎的的新项目。众所周知,Unreal的技术要比Unity难招,一方面是因为Unreal入门确实较难,另外一方面则是市面上Unreal技术开发的同学存量真的不多。

所以我更倾向于内部转岗或者招聘高潜的Unity开发者进行自主培养。这就涉及了如何高效学习Unreal引擎了。那么也就终于聊到我们本篇文章的目的了:如何从Unity开发者向Unreal开发者转型。

我不会说太多的代码或者引擎的使用/代码细节,那需要非常长的学习过程。而是从更宏观一点的方向来讲一讲引擎之间的异同和开发理念上的差别。

核心概念迁移


我想大部分人学习一个新鲜事物的时候,都是比照法:即尝试使用一个已有的概念去套新的概念,包括我自己也是这么学习的。这种方法确实也是比较有效的,比如下面这两个引擎的界面。相同颜色的部分其实就是相同的功能用途。


Unity使用 Unity Hub管理引擎版本和项目,而Unreal 使用Epic Games Launcher 来管理引擎版本和项目。





Unity使用 Package Manager 管理插件,而Unreal使用Plugins 管理插件。




一些常用的Unity概念和它在Unreal中的对应部分。



更多的相近概念和对应的代码写法可以直接参考UE官方文档Unreal Engine for Unity Developers,这里不做罗列了。

核心差异


最显著的差异应该就是众所周知的开源和闭源的关系了。虽然Unity也将编辑器部分的代码开源了,但这种开源和闭源的核心思路会决定它的技术发展路线和商业模式,甚至是开发团队的组建思路。
这里可以先贴一下两个引擎的开源地址。
Unity :https://github.com/Unity-Technologies/UnityCsReference
Unreal:https://github.com/EpicGames/UnrealEngine
不过由于Unreal 的仓库是一个私有仓库,需要做一些额外的事情来获取权限。参考如下官方文档https://docs.unrealengine.com/5.1/en-US/downloading-unreal-engine-source-code/ 。或者一个更简洁的教程 下载ue4源码引擎+编译 。

[*]引擎编辑器实现不同。

[*]Unity引擎的核心模块是C++部分的引擎代码,这部分是闭源的。而Unity的编辑器是用C#代码写的,如果编辑器要调用或者暴露C++核心代码和接口的话,需要使用到一个xxx.bindings.cs文件来映射C#和C++。比如Unity中最基础的类UnityEngine.Object,在编辑器层就有一个对应的bindings类和和他对应。







[*]而Unreal则不同,Unreal Engine是一个完整独立的引擎,Unreal Editor也是用Unreal Engine写出来的。




[*]技术激进程度不同

[*]由于是引擎源码开源,UE在技术的迭代上更为激进。往往跨度一个小版本就会出现很多东西不兼容的情况。UE的理念是,“所有东西我都给你了,如果你觉得不好用,可以自己改”。基于这个理念,UE总是偏向于集成最新的技术方案,哪怕它当下只是一个未稳定或者未经过验证的版本。甚至上一个版本的方案在下一个版本就出现不兼容,删除或者重制的情况。
[*]而Unity作为闭源的引擎则会优先考虑稳定性和可用性。因为它没有一个开源的生态社区,所有的功能都得自己来实现,并且保证稳定性和可用性。比如备受诟病的AssetBundle系统和Animator系统,都已经是老古董了。比如DOTS的先进理念也无法得到广泛使用。



[*]当运动员又当裁判

[*]现在的Unreal引擎和自己开发的《堡垒之夜》相互成就。我个人认为这是一个非常正向的循环。将引擎的最新特性运用到自己游戏上进行白鼠实验,再从游戏开发的角度反馈需要的增删改的引擎特性,二者互相迭代和成就。更为重要的是,它给了所有开发者一个强有力的引擎能力的证明,特别是针对TPS类型和大世界类型的游戏项目,可以说有拿来即用的方案(PS:《堡垒之夜》挣的钱,有很大一部分用来维持Epic Games送的游戏了)。比如 最新的5.1引擎版本的特性就已经用在自己的游戏上了。UE5.1新功能在《堡垒之夜:大逃杀》第四章中的实战测试
[*]Unity在这方面就稍微欠缺一些。诚然Unity现在有很多技术经理和专业团队进驻在大型项目协助项目组进行开发。但他们都专注于服务某一个项目,或者解决单个项目开发的难点。没有一个全局的视角来看全行业的问题,统筹性的解决痛点。诸如UGUI,TextMeshPro等好评的模块也是招安个人开发者来重写的。而即使是UGUI从4.7版本到现在也是好多好多年了(同样吐槽一下UE的UMG 和 Slate)。



[*]引擎定位不同

[*]作为老牌的游戏引擎,UE自己并没有赶上移动游戏开发的红利。痛定思痛之后,大破大立完成了3代到4代的引擎转换,甚至引擎的授权模式也进行了变更。但对于5年前的移动设备来说还是太沉重了。所以在当下移动游戏的开发上,Unreal跟Unity走的是两个极端往中间迭代的道路。UE从重->轻,Unity从轻->重。而在当下这个节点上,二者交汇在一起,大家都具备手游的开发能力了。
[*]就目前的情况而言,立项使用Unreal开发的移动游戏基本还是中重度为主,大多为TPS,FPS或者大世界项目;中轻品类的游戏则几乎被Unity承包的。但也不是说Unity不能做重度游戏,比如原神、王者也都是Unity的重度项目,只不过这些中大型项目都需要配备专业的引擎团队来移植或者实现新的功能需求。



[*]技术服务不同

[*]正是因为二者的引擎定位不一样,导致他们在后续的官方服务和支持上的策略也不一样。因为闭源的关系,Unity的开发者或者项目无法自己修改引擎,甚至绝大多数的Unity技术人员是不了解它的黑盒机制的。那么这就为Unity衍生出了以源码为核心的技术服务。帮助项目解决业务层无法解决的问题,或者移植最新的特性到低版本。当然UE其实也有驻场的优化服务,但大都提供引擎侧的正确使用又或者是深度的战略合作。另外Unreal对于个人和中小型团队和项目是有资助计划的,有兴趣的可以了解一下。虚幻MegaGrants资助计划详细申请指南 。
[*]另外一个不得不提的就是性能优化和工具。移动设备鉴于其资源的有限性,运行过程需要做大量的性能平衡才能让游戏平稳流畅。Unity引擎在当前市场下拥有两家非常成熟的企业和优化服务(官方:UPR - Unity专业性能优化工具和UWA:UWA | 致力于游戏VR和AR应用提供项目研发解决方案 | 简单优化、优化简单| 侑虎科技),而Unreal截止目前为止,只有UWA有在跟进,提供一个初版的工具。虽然Unreal也在不断迭代性能分析工具,但相比于UPR而言,还是欠缺系统性的流程和工具。



[*]游戏启动流程不同

[*]这可能是Unity开发者转向Unreal开发,理念偏差最大的一个部分了。对于Unity开发而言,我只需要新建任意一个继承自Monobehavour的类,然后将它绑定在初始场景的任意GameObject上,通过在Start Awake Update等函数中填充自己自定义的逻辑,就可以完成Unity游戏的启动流程。也就是说 Unity可以任意定制启动和初始化流程,带来自由的同时也需要开发者自己去构建合理的启动流程。
[*]而Unreal不同,它已经指定了启动流程。但开发者是可以通过继承和配置子模块来重写自己在某一个流动流程中的逻辑。比如任何一个游戏启动都会使用到Gamemode,区别在于你可以重新覆写这些虚拟函数。当然。这从侧面要求开发者前期必须弄明白很多的类的用途和初始化的阶段,也是初学者难以快速掌握的部分。





关于Unreal的初始化流程和相关的类,可以参考大钊的《GamePlay架构》系列 《InsideUE4》GamePlay架构(一)Actor和Component,或者等我后续文章来介绍。


[*]开发语言

[*]诚如上面所述,二者的核心都是C++写的,区别在于编辑器层面的部分。Unity的编辑器是C#完成的,过去支持的脚本有C#,UnityScript(和JS的区别只是因为后缀名相同)和boo语言。考虑到语言本身的特性和开发者学习的成本,Unity目前只推荐使用C#进行开发。由于C#是借助于ILR虚拟机实现的跨平台,相比于C++的原生编译自然在性能上就落后不少。但这也是Unity目前能通过ILRuntime完成C#代码热更的重要手段。当然接入其他的脚本语言,比如JS,Lua等又是另外一回事了,不细说。
[*]Unreal 说是用C++实现的,倒不如说是使用U++(Unreal C++)实现的。其对原生的C++语言做了大量的封装,最典型的比如反射,以及一些共享指针等实现。最著名的莫过于蓝图这种连连看的开发方式,让爱的人特别爱(写逻辑,写原型上手简单,不需要太多专业知识),让恨的人也特别恨(C++接口部分和调试等)。除此之外,也是可以接入其他的脚本语言的。另外Unreal有着严格的代码规范,比如类名如果写错会直接编译报错。https://docs.unrealengine.com/5.1/zh-CN/epic-cplusplus-coding-standard-for-unreal-engine/   除了包装了复杂的C++之外,Unreal甚至可以直接在代码实现中使用原生的OC或者安卓代码。







带来自由的同时,也带来了极大的开发痛苦。。。

[*]开发耗时和成本不同

[*]因为Unreal大部分时候定位为中大型项目,这类项目本身的开发周期就十分的漫长。
[*]因为是开源的引擎,项目需要为它准备一个引擎团队(团队视项目规模的大小而定),而Unity因为闭源的关系反而不会优先考虑引擎团队(中大型的Unity项目或者大厂都还是会配备引擎团队的)。
[*]涉及到引擎维护,就涉及到代码编译。尤其是像Unreal这种大体量的引擎,但凡改动一行引擎代码,编译时长基本2个小时起步。
[*]Unreal使用的C++开发,尤其又经过了它自己的封装之后,入门相对较难;Unreal转手游领域还没有到一个普遍的程度,从业者相较于Unity也较少,人员招聘难也难,当然价格也就会贵一些。


文章的最后,提供一些学习Unreal 的途径:

[*]官方文档,目前最新是5.1版本,对于新手而言,建议从最新版本开始。https://docs.unrealengine.com/5.1/en-US/
[*]B站账号,每年都有各种城市巡演和著名的UOD大会,提供最新的技术和项目实践。虚幻引擎官方的个人空间-虚幻引擎官方个人主页-哔哩哔哩视频
[*]论坛,遇到问题可以到上面寻找答案,不过确实不要抱太大希望。https://forums.unrealengine.com/tags/c/international/simplified-chinese/61/unreal-engine
[*]新闻页,了解最新动态和技术,以及更多的免费插件和资源。https://www.unrealengine.com/zh-CN/feed
[*]不过最推荐的还是下载官方的Demo,并在网上搜索相关的Demo技术解析。



好了,这里起个头,又挖了个大坑。。。下一篇,准备聊一下Unreal Engine 5的启动流程。如果感兴趣,请转发、点赞和收藏,并在评论区“催更”~ 视大家的支持程度来加快更新频率~~

Baste 发表于 2023-3-3 22:03

第一个支持浩哥!

Doris232 发表于 2023-3-3 22:05

正好需要[害羞]

zt3ff3n 发表于 2023-3-3 22:15

浩哥我爱你

ChuanXin 发表于 2023-3-3 22:20

浩哥yyds

KaaPexei 发表于 2023-3-3 22:25

吹更!

Baste 发表于 2023-3-3 22:28

芜湖[赞同]

xiangtingsl 发表于 2023-3-3 22:32

支持!![爱]

c0d3n4m 发表于 2023-3-3 22:35

催更催更~

franciscochonge 发表于 2023-3-3 22:43

浩哥 无敌~[爱]
页: [1] 2 3
查看完整版本: 写给Unity开发者的Unreal Engine开发指南 (扫盲)