目录
Basic Scripting with Blueprints
Blueprints Visual Scripting Overview
介绍
蓝图可视化脚本系统(Blueprint Visual Scripting system)是完整的游戏脚本系统(gameplay scripting system),基于节点来创建游戏元素;类似常见的脚本语言,是用于定义引擎中面向对象的类和对象;该系统非常灵活和强大,提供了一般仅供程序员使用的所有概念及工具;
蓝图基本形式是,通过引线将节点Node、事件Event、函数Function、及变量Variable连接起来,以创建复杂的游戏元素(gameplay elements);蓝图是使用节点图表(graphs of Nodes)来实现各种目的(如object construction、individual functions、general gameplay events);
蓝图可执行许多操作,但部分特定制作可能会对性能产生影响,如每 tick 都执行大量操作和复杂的数学计算(可考虑使用C++);蓝图适合创建事件驱动的功能,如处理伤害接收、控制,或其他非每帧调用的操作;
蓝图分类
最常用的两种蓝图是关卡蓝图Level Blueprints、蓝图类Blueprint Classes,其他蓝图还有Blueprint Macros、Blueprint Interfaces;
- Level Blueprints,每个关卡都拥有自己的关卡蓝图;
- 可引用和操作关卡内的Actors;
- 使用Level Sequence Actors控制过场动画;
- 管理关卡流送;
- 还可与关卡内的蓝图类交互,如读取/设置变量或触发自定义事件;
- Blueprint Classes,定义可以作为实例放入地图中的新类或Actor类型;
- 非常适合创建交互资源(如门、开关等),将其拖入关卡即可被构造;如编译蓝图则所有该蓝图的实例均会更新;
蓝图的其他用途:
- 使用Construction Script(只在Actor被放置或更新时计算),创建自定义预设;
- 创建可操作的角色,Pawn是一种蓝图类,其可将角色所需的所有元素结合在一起;
- 使用Blueprint script,创建HUD,可包含事件序列与变量,会被指定到GameMode上;
Blueprint Editor 是用于构造蓝图元素以构建可视化脚本的用户界面,UI会因选择的蓝图类型而异;大部分 蓝图编辑器 的核心功能是用于布置 事件图表(Event Graph)选项卡;
蓝图与C++区别
蓝图是UE自创的一种节点化编程语言,使用上与C++不同,需要连接各种变量、函数、事件等,以此为Actor创建功能;还可借助这些函数和事件,让不同Actor蓝图相互通信、传输数据;
蓝图也并非与C++无关,蓝图在虚拟机上运行,而虚拟机本质是一种将蓝图解译为C++的独立进程;意味着,蓝图Actor可能需要占用更多算力;蓝图是一种节点化的C++编程方法,本质上是一种可视化的C++代码;
蓝图不仅可创建Actor类,还可创建Gamemode、Game State、Character、Pawn等各种类;
使用C++,则可访问更底层、更广泛、更核心的虚幻功能,如可修改引擎,改进管线;
Basic Scripting with Blueprints
蓝图为脚本语言提供了一种可视化的方法;就其本身而言,此系统与标准书面脚本语言有许多细微差别,例如数据类型化变量、数组、结构体等等;执行流的工作方式与在典型脚本语言中一样,但蓝图要求每个节点的显式线性执行;
Variables
变量能以各种不同类型被创建,包括数据类型如Boolean, integer, and float,并常用颜色编码,以便在蓝图中识别;
蓝图变量还可以是用于保存对象、Actor和类等内容的引用类型;
Execution Flow
在蓝图中,要执行的第一个节点是一个事件,然后是从左至右通过白色执行线的执行流;游戏运行时,可以在编辑器中可视化执行流,以便于调试;数据还流经采用匹配变量类型的彩色导线;当节点执行时,将对输入引脚进行评估,反向从右至左跟踪数据线,直到计算出最终结果并将其提供给节点;
带有执行引脚(非纯节点)的节点在执行时存储其输出引脚的值,而不带执行引脚(纯节点)的节点则在每次与其输出相连的节点执行时重新计算其输出;
Connecting Nodes
Events
Flow Control
Nodes
Custom Events
Blueprints Visual Scripting Overview
虚幻引擎中的 蓝图可视化脚本(Blueprint Visual Scripting)系统是使用基于节点创建Gameplay元素的可视化编程语言;基于节点的工作流程为设计师提供了通常只有程序员才能使用的广泛脚本概念和工具;此外,在引擎的C++实现方案中,可用的蓝图特有标记可以让程序员创建基线系统,并让设计师扩展这些系统;
蓝图不是虚幻脚本的替代品;之前利用虚幻脚本进行的游戏编程和其他操作仍然可以通过C++代码进行处理; 同时,蓝图并非刻意为替代虚幻脚本而生,但它们的许多用途确实和虚幻脚本相同,如:
- 扩展类;
- 保存并编辑默认属性;
- 管理类的子对象(如组件)实例化;
期望达到的结果是:gameplay程序员构建基础类,其公开一套有用的函数和属性; 这些基础类形成的蓝图可使用这些函数和属性并进行延展;
UnrealScript (UE3) | Blueprints (UE5) | C++ (UE5) |
.uc file | Blueprint Asset | .h/.cpp files |
UClass | UBlueprintGeneratedClass | UClass |
extends [ClassName] | parentClass | : [ClassName] |
Variable | Variable | UProperty() |
Function | Graphs/Events | UFunction() |
defaultproperties{} | Class Defaults | native constructor |
Default Components | Components List | native constructor |
蓝图类型
蓝图有数种类型,每种均有其独特用法,包括创建新类型编写关卡事件脚本, 或是定义其他蓝图使用的接口和宏;
Blueprint Class
Blueprint Class(蓝图类), 一般缩写为 Blueprint(蓝图),是一种允许内容创建者轻松地基于现有游戏类添加功能的资源; 蓝图 是在虚幻编辑器中可视化地创建的,不需要书写代码,会被作为类保存在内容包中; 实际上,这些类蓝图定义了一种新类或Actor类型,这些Actor可以作为实例放置到地图中, 和其他类型的Actor的行为一样;
Data-Only Blueprint
Data-Only Blueprint(仅包含数据的蓝图)是指仅包含代码(以节点图表的形式)、变量及从其父类继承的组件的类蓝图;仅包含数据的蓝图允许调整及修改继承的属性,但是不能添加新元素;从本质上讲,这些蓝图是原型的替代物,设计人员可以使用它们来调整属性或者设置具有变种的项目;
Data-Only Blueprints (仅包含数据的蓝图) 是在合并的属性编辑器中进行编辑的,但是也可以通过使用完整的 蓝图编辑器 来添加代码、 变量或组件,来将其转换为完整的蓝图;
关卡蓝图(Level Blueprint)是一种专门类型的 蓝图,用作关卡范围的全局事件图表;在默认情况下,项目中的每个关卡都创建了自己的关卡蓝图,可以编辑这些关卡蓝图, 但是不能通过编辑器接口创建新的关卡蓝图;
整个level相关的事件,或关卡内Actor的特定实例, 用于以函数调用或流控制操作的形式触发操作序列;
关卡蓝图还提供了关卡流送和Sequencer的控制机制,以及将事件绑定到关卡内的Actor的控制机制;
Blueprint Interface
蓝图接口(Blueprint Interface)是一个或多个函数的集合 - 只有名称,没有实现-
可以添加到其他蓝图中;任何添加了该接口的蓝图都保证拥有这些函数;接口的函数可以在添加它的每个蓝图中提供功能;在本质上,这类似于一般编程中的接口概念, 它允许多个不同类型的对象通过一个公共接口共享和被访问;简单地说,蓝图接口允许不同的蓝图相互共享和发送数据;
内容创建者可以通过编辑器以与其他蓝图类似的方式创建蓝图接口,但它们仍有一定的局限性,原因在于以下操作不可执行:
- 添加新变量
- 编辑图表
- 添加组件
Blueprint Macro Library
蓝图宏库(Blueprint Macro Library)是一个容器,它包含一组 宏 或自包含的图表,这些图表可以作为节点放置在其他蓝图中;它们可以节省时间,因为它们可以存储常用的节点序列, 包括执行和数据传输所需的输入和输出;
宏在引用它们的所有图表之间共享,但是它们会自动扩展到图表中, 就像它们在编译期间是一个折叠节点那样;这意味着蓝图宏库不需要编译;但是,对宏的更改仅反映在重新编译包含这些图表的蓝图时引用该宏的图表中;
Blueprint Utilities
蓝图工具(简称 Blutility),是用于执行编辑器行为或延展编辑器功能的纯编辑器蓝图;其可将不带参数的Events作为 UI 按键公开,并能执行对 蓝图 公开的任意函数,同时对视口中当前选定的 Actor 集产生作用;
蓝图分析
蓝图功能由诸多元素定义;部分元素默认存在,其余可按需添加;这些元素可用于定义组件、执行初始化和设置操作、对事件作出响应、组织并模块化操作,以及定义属性等行为;
Components Window
蓝图编辑器(Blueprint Editor)中的 组件(Components)窗口允许将组件添加到蓝图;这提供了以下方法: 通过胶囊组件(CapsuleComponent)、盒体组件(BoxComponent)或球体组件(SphereComponent)添加碰撞几何体, 以静态网格体组件(StaticMeshComponent)或骨骼网格体组件(SkeletalMeshComponent)形式添加渲染几何体,使用移动组件(MovementComponent)控制移动;还可以将组件(Components)列表中添加的组件指定给实例变量,以便在此蓝图或其他蓝图的图表中访问它们;
Construction Script
创建蓝图类的实例时,构造脚本(Construction Script)在组件列表之后运行;它包含的节点图表允许蓝图实例执行初始化操作; 构造脚本的功能可以非常丰富,它们可以执行场景射线追踪、设置网格体和材质等操作,从而根据场景环境来进行设置; 如光源蓝图可判断其所在地面类型,然后从一组网格体中选择合适的网格体,或栅栏蓝图可以向各个方向射出射线, 从而确定栅栏可以有多长;
Event Graph
蓝图的EventGraph包含一张节点图表,它使用事件和函数调用来执行操作,以响应与蓝图相关联的Gameplay事件;这被用于为蓝图的所有实例添加公共功能;交互性和动态响应也在这里设置;如光源蓝图可以对伤害事件做出响应,方法是关闭其 LightComponent
,并更改其网格体所使用材质;这将自动为光源蓝图的所有实例提供此行为;
Functions
函数(Functions)是属于特定 蓝图 的节点图表,它们可以从蓝图中的另一个图表执行或调用;函数具有一个由节点指定的单一进入点,函数的名称包含一个执行输出引脚;当从另一个图表调用函数时,输出执行引脚将被激活,从而使连接的网络执行;
函数 和 宏 两者在外部完成相同目标:
- 宏拥有宏图表,函数拥有函数图表;
- 均可使用本地变量;宏使用没有特定的命名,只保存数值的"匿名"本地变量;
- 均适用于封装重复使用和清晰功能;
- 函数会被实际调用,宏是替换;
- 宏可放置隐藏节点,宏无法实现类覆写功能;
总之,如需要在各处重复使用一些快速的功能,最好使用宏;但如需调整蓝图子项中的行为,或需从另一个蓝图直接进行访问,则最好使用函数!
Variables
变量(Variables)是保存值或引用世界场景中的对象或Actor的属性;这些属性可以由包含它们的 蓝图(Blueprint)通过内部方式访问,也可以通过外部方式访问,以便设计人员使用放置在关卡中的蓝图实例来修改它们的值;
- Local variables,只会出现在定义的范围中,因此,函数中的本地变量仅限该函数可见,其他函数、事件图表都不可见;
- Class variables,需从蓝图中多处进行访问的内容,因此,诸如对网格体或其他组件的引用,或需要公开以便从其他蓝图访问的变量;