1.介绍

        1.蓝图

                1.定义:是虚幻引擎自创的一种节点化编程语言。

                2.使用:连接各种变量、函数、事件。

                3.作用:①为Actor创建功能。

                              ②让不同的Actor蓝图相互通信、传输数据。

                4.本质:蓝图在虚拟机层上运行,而虚拟机本质是一种将蓝图解译为C++的独立进程。

                5.优点:①快速构建代码原型,无需其他IDE。

                              ②搭配C++使用时,可将C++中的函数、事件、变量暴露给蓝图,以便非程序员也能调用C++中的功能。

                              ③快速在项目中写出更简洁轻量的代码,无需掌握大量编程知识。

                              ④不局限于创建Actor类,还能创建Gamemode、Game State、      Character、Pawn等各种类。

                              ⑤蓝图的组件、宏、函数库等功能,能够轻松复用各种功能,实现更快、更灵活的设计。

                6.缺点:蓝图Actor可能需要占用更多的算力。

                7.小结:①游戏角色、弹药和其他“轻量级”交互功能采用蓝图实现。

                              ②武器、伤害系统等需访问核心代码的“重量级”交互功能可采取C++实现。

                              ③可通过蓝图扩展C++代码,C++代码可以暴露给蓝图,许多核心功能都能在蓝图中使用。

        2.C++

                1.优点:①可以访问更底层、更广泛、更核心的虚幻功能。

                              ②修改引擎和编辑器的核心功能满足项目需求。

                2.访问源代码:可以编写涉及大量计算的功能或是快速功能,实际开发中可以创建游戏核心系统或是需要大量计算或网络操作的系统。

                3.游戏实例:多人FPS游戏需要快速响应玩家输入,直接访问虚幻引擎的联网代码和内置玩法系统,性能和带宽开销可以大大降低,创造更好更流畅的游戏体验。

                4.小结:兼用两者能让游戏功能整体更健壮。

2.分析现状来开发

        1.问题

                1.哪些功能用C++编写,哪些用蓝图?

                2.如何设计游戏架构?

                3.团队技能在什么水平?

        2.团队分析

                1.设计师或美术师为主的团队:先了解团队常用哪些开发工具,然后用C++编写这些工具,再把它们公开到蓝图中。程序员可通过这种方式为美术师和设计师提供底层功能,确保不会访问不需要的部分。

                2.程序员为主的团队:把重心放在错综复杂的项目功能上,而不是用C++编写大量游戏逻辑。程序员可以添加很多C++代码和功能,然后把变量公开给设计师。设计师和美术师可以使用蓝图来迭代功能,之后再由程序员转换为C++。

                3.独立开发者:擅长什么做什么。

        3.配合方式

                1.实例:以一个武器数据资产为例,武器大部分代码使用C++编写,目的是为了保证网络性能和游戏性能。同时在蓝图中公开了很多变量、常用功能、工具类函数,以便设计师使用。这么做有利于设计师对武器进行自定义,甚至利用公开的工具和变量创造新的武器。程序员只需要为武器编写一种实用的功能,设计师可在这个基础上扩展。

        4.注意事项

                1.何时用C++编写函数和逻辑:蓝图适合编写一些临时或“转瞬即逝”的游戏功能(很多只会短暂出现的小机制)。持续在后台运行的永久功能(进行大量计算和持续计算的功能和机制)最好用C++来编写。

                2.避免构建高开销的蓝图:如果一个蓝图包含大量代码或者这类大开销蓝图被频繁用到,建议用C++替代或者将一部分功能转移到C++中以加快速度。

                3.谨慎使用枚举器和结构体:蓝图支持枚举器和结构体,但它们中的有一些如果是蓝图的一部分,则不能在C++中使用。不是所有枚举器和结构体都有这个限制,如果要在C++中使用就要确保你想使用的枚举器和结构体在C++中可访问。

        5.小结

                1.发挥蓝图和C++的最佳功效时,往往伴随着在两者之间找到平衡。

                2.游戏解构和团队结构都会影响你最终选择的语言类型。

3.利用转换来优化

        1.高开销内容

                1.蓝图原生化功能:如果游戏中长期大量存在这种大开销蓝图,可考虑利用该 功能将其中一部分转为C++。

                2.扩展:可以用C++类来搭建蓝图的基类,然后用蓝图扩展这些基类,以满足性能目标。

                3.优化:虚幻引擎提供了很多优化工具,这些现成工具能帮助你识别哪些功能需要大量算力,进而使用C++来实现持久保存数据功能和大量计算的功能。

        2.何时使用蓝图

                1.优化蓝图开销:禁用蓝图的Tick事件或者降低Tick频率,比如用Timeline或其他事件函数来控制蓝图的生命周期从而减少性能开销。

                2.蓝图原生化功能使用:如果蓝图占用了大量计算带宽,可以考虑启用蓝图原生化。此功能可以将蓝图转换为原生C++代码,小幅提升性能。

                3.开发实例:以C++类为基类,创建蓝图基类,并把C++功能继承到蓝图,这样设计师可以创建蓝图的子类,根据需要进行扩展

        3.小结:尽管开发者会尽量兼用C++和蓝图,但有时候只适合使用其中一种。

4.看类来选择语言

        1.Actor该用什么语言编写:

                1.Game State:因为它负责处理游戏的状态/阶段逻辑,需要进行大量计算或涉及持久计算的游戏功能,最好使用C++实现。考虑到潜在的网络处理逻辑包括客户端和服务器,使用蓝图会影响性能。

                2.Pawn/Character:使用C++编写底层功能,暴露给蓝图,再从蓝图派生子蓝图类,再用蓝图扩展功能。这样就可以充分利用两种语言各自的优势:C++的高效,蓝图的迭代和扩展。

                3.Game Mode:使用C++编写,在服务器端,代码需要有足够强大健壮,才能跟上服务器的速度。

        2.小结:不同资产适合用不同语言实现,这不仅有利于项目开发,还有利于减轻你和团队的工作负担。

5.使用公开来协作

        1.“公开”还是“不公开”:C++中的函数、变量、事件和数据都可以暴露给蓝图,供整个团队访问。将C++暴露给蓝图,就可以在蓝图中调用和/或使用C++函数、变量、事件和数据。

        2.对编程产生的益处:只公开特定的事件和函数,可以让设计师和美术师与程序员的工作解耦。核心代码可以“隐藏”起来,程序员可以在不频繁干扰其他团队成员的情况下工作。

        3.小结:与设计师合作,了解他们的需求,编写出他们需要的复杂底层代码。然后,只公开他们需要的功能。

6.总结

        1.不要过度使用一种语言,单靠一种语言不足以应对所有情况。

        2.用特定语言来创建特定的类可以事半功倍。

        3.结合C++与蓝图可以为团队赋能,使开发流程更加顺利。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐