穷凶极恶虚幻蓝图

  • 坦 白 从 宽 抗 拒 从 严
  • 蓝图是傻逼,我也是傻逼

专业术语

  • 实例:所有在场景Level里实际存在的物体个体,如:“小明”,意义是所指
  • 类/蓝图类:封装到内容浏览器里的抽象的概念,如:“学生”,意义是能指
  • 实例永远是类/蓝图类的派生,“小明”永远是“学生”的派生

蓝图种类

关卡蓝图

  • 关卡蓝图相当于面向过程(POP)式的编程
  • 一个关卡Level只能有一个关卡蓝图
  • 关卡蓝图可以对场景里的物体实例(包括蓝图类)进行操纵

蓝图类

  • 蓝图类相当于面向个体(OOP)式的编程
  • 蓝图类可以在Content内容浏览器里右键创建(Blueprint Class)
  • 创建时需要选择一个父类,如果要放在场景里,至少要继承自Actor
  • 蓝图类也可以通过C++类派生
  • 蓝图类也可以通过实例(包括蓝图实例)转换:
    • 1:先选择所有需要封装到蓝图类的实例
    • 2:点击Details窗口右上角的构建蓝图按钮
    • 3:在弹出的窗口里编辑蓝图名称与路径
    • 4:选择Harvest Component封装组件,将所有选中实例转换为蓝图的组件
    • 5:选择继承的父类
    • 6:确定

蓝图基础

  • 蓝图节点的数据与执行是从左至右进行的,节点的左边是输入区,右边是输出区

MyBlueprint窗口

  • MyBlueprint窗口是最重要的窗口,在这可以创建一些基本蓝图结构:
    • Garph图表
      • 图表下会显示其包含的事件
    • Function方法(函数)
    • Macro宏
    • Variable变量
    • Event Dispatcher事件与委托
  • 在蓝图里按右键呼出Palette节点菜单,也可以在Window窗口里打开菜单窗口

Garph图表

  • 图表就是蓝图片段,不过是将蓝图拆开,能够方便查看和管理罢了

Variable变量

  • 在给新建的变量设置初始值时,需要编译一次才能设置
  • Details细节面板里的Variable Type变量类型里可以更改类型
  • MyBlueprint窗口里,变量最右边的眼睛可以点击,睁眼暴露闭眼不暴露
  • 变量拖入蓝图中会选择Get还是Set

Function方法

  • 方法有方法自身的蓝图,蓝图里必须有方法节点返回节点,可以设置参数与返回值
  • 带返回值的方法没有执行引脚,无返回值的方法有执行引脚
  • MyBlueprint窗口里,默认的ConstructionScript就是构造函数

快捷键

  • alt切断连接
  • ctrl桥接引脚
  • ctrl + W复制节点

引脚类型

  • 白色箭头引脚:执行引脚

    • 白色流程线由一个执行引脚引出
    • 后面会跟上一大串void无返回值的方法,这些方法的执行受执行顺序的影响
    • 一个节点只能连一个输入执行,但可以输出多个执行
  • 彩色圆形引脚:数据引脚

    • 布尔型:深红色
    • 整型:青色
    • 浮点型:草绿色
    • 字符串:玫红色
    • 一般结构体:深蓝色
    • 三维向量结构体:黄色
    • 三维旋矩结构体:浅紫色
    • 方位矩阵结构体:橙色
    • 物体类型:湖蓝色
    • 枚举类型与字节类型:深绿色

Boolean Integer Float String Structure

Vector Rotator Transform Actor Enumeration

  • 彩色菱形引脚:引用引脚

  • 红色方形引脚:事件引脚

数据类型转换

  • 蓝图内的数据类型转换是自动完成的,例如下列转换节点

测试节点

  • Print String打印字符串节点
  • 相当于GEngine->AddOnScreenDebugMessage()方法

事件节点

  • 搜索关键词:Event
  • 节点菜单里搜索Event可以快速放置事件节点
  • 事件节点题头是红色的,没有输入的执行引脚,只有输出的
  • 事件节点在不同蓝图中有所限制,渊源是c++代码里的事件方法
  • 事件节点是指令的发起者
  • 常用的事件节点有:
    • BeginPlay初始化事件,游戏开始后第一帧调用一次
    • Tick更新事件,游戏开始后每一帧都调用
    • EndPlay结束事件,游戏结束那一帧调用一次
    • Destroyed销毁事件,实例被销毁时调用一次
    • Input输入事件,事件名为按键名
      • 在蓝图类中输入,必须要争取到player controller玩家控制器的同意(Enable Input)
    • Collision碰撞事件,有碰撞与覆盖之分
    • Mouse Input鼠标交互事件

流程控制

  • 搜索关键词:Flow Control

Delay延时

  • 执行到Delay节点时会将执行阻塞Duration秒钟
  • 快捷键:D+鼠标左键
  • Delay有两种版本:

Branch分流

  • 根据布尔值Condition来判断执行True还是执行False
  • 快捷键:B+鼠标左键

Do X次数限制

  • Do X能限制执行的次数,通过Reset来重置限制
  • 快捷键:O+鼠标左键(Do Once)N+鼠标左键(Do N)
  • Do X系列有三种:

FlipFlop开关式

  • 能让执行信号折返于AB之间

Gate门限

  • Gate能通过多个执行引脚控制总执行的通过与否
  • MultiGate则类似于更加灵活的Flip Flop
  • 快捷键:G+鼠标左键(Gate)M+鼠标左键(MultiGate)

Sequence拆分

  • 将一条执行线拆成多条,并按顺序执行
  • 快捷键:S+鼠标左键

Loop循环

  • 循环有三种:For循环、带Break的For循环、While循环

数组

  • 搜索关键词:Array

访问元素

  • Get有两种,区别是输出的引脚形状不同
  • 对值的引用的修改可以忽视形参实参的限制

获取方法

  • 重要的方法有:
    • Length获取长度
    • Is Empty是否为空

执行方法

  • 重要的方法有:
    • Add添加元素
    • Clear清除元素
    • Insert插入元素
    • Remove移除元素

数组遍历

  • 两种方法来遍历数组:
  • 快捷键:F+鼠标左键(For Each Loop)

结构体

定义结构体

  • 结构体可以在Content内容浏览器里右键创建(Structure)
  • 在设置窗口里添加并设置结构体里的元素与初始值

拆开与重组

  • 所有的结构体都适用Break方法与Make方法

蓝图与访问

关卡蓝图获取关卡实例

  • 先在场景中选择一个Actor实例(假设叫“BP_Test_1”)
  • 到关卡蓝图里右键选择Create a Reference创建实例引用
  • 进行各种Get和Set操作

蓝图类获取关卡实例

  • 当然是使用Get All系列了
  • Get All系列成员:
  • 还可以在蓝图类中创建某类型的变量,暴露后在场景实例中指认
  • 如果不指认就使用此变量造成空指针异常,蓝图不会崩溃会报错,而C++会崩溃

碰撞

关卡蓝图中(实例)碰撞事件引用

  • 使用实例引用时可以选择创建基于该引用的事件

蓝图类中(组件)碰撞事件引用

  • 对组件右键可以获取其委托的事件,并放到蓝图中

碰撞事件

  • On(Actor/Component)BeginOverlap进入覆盖(触发)
  • On(Actor/Component)EndOverlap离开覆盖(触发)
  • On(Actor/Component)Hit碰撞

射线

  • 射线通道在ProjectSettings里的Collision里设置
  • 常用射线函数有:

    • TraceByChannel通道检测
    • TraceByProfile文件检测
    • TraceForObjects物体组检测
  • 套用上面的常用函数,射线检测还有形状之分:

    • Line线型
    • Box盒型
    • Capsure胶囊体型
    • Sphere球型
  • 套用前面两者,射线检测还有数量之分:

    • Single单射线检测(省略Single)
    • Multi多射线检测
  • 套用前面三者,打个比方:多射线球形文件检测 = MultiSphereTraceByProfile

时间轴

  • Timeline节点能创建一个可编辑的时间轴节点
  • 双击该节点进入编辑界面
  • 在编辑界面中可以新建多个不同类型的轨道,轨道名对应节点输出类型
  • 同时时间轴能在My Blueprint窗口找到

界面

  • 创建一个UI文件Widget Blueprint
  • 在任何蓝图里都能将UI文件加入到视口显示
  • 多个UI文件可以互相覆盖显示

类降级

  • 通过Cast方法进行类的临时降级处理(俗称“做儿子”)
  • 这里做个示例:
    • 新建BP_ActorParent类继承自Actor
    • 新建BP_ActorSon1BP_ActorSon2都继承自BP_ActorParent
    • 假使BP_ActorParent是游戏的底层类
    • 若蓝图类Son1中定义一个Son2类型的暴露变量来访问场景中的Son2类型实例
    • 不如直接定义一个parent类型的变量来直接赋值
    • 但是父类无法直接调用子类的成员或重写方法,这时就使用类降级Cast的方法来做

自定义事件

自定义事件定义

  • 在蓝图中右键搜索Add Custom Event来定义事件

自定义事件调用

  • 输入Call关键字来调用触发事件的方法
  • 使用Execute Console Command指令行能远程调用事件
  • 蓝图类可以通过此方式调用关卡蓝图内逻辑
  • 但是关卡蓝图不能通过此方式调用蓝图类内逻辑

委托机

  • My Blueprint窗口里可以新建委托机Event Dispatcher
  • 委托机的作用是同时控制多个事件的执行

委托机命令

  • 委托机拖入场景中有几种命令:
    • Call触发委托机
    • Bind将事件绑定到委托机
    • Unbind事件解绑
    • Unbind All解绑所有
    • Event快速创建一个自定义事件
    • Assign在创建一个自定义事件的同时,绑定到委托机

委托机触发

  • 委托机就能解决关卡蓝图调用蓝图类逻辑的问题
  • 下图即在关卡蓝图里调用蓝图类实例的委托机的方法
  • UI按钮响应也能通过委托机来做

委托机绑定函数

  • 使用CreateEvent来更灵活地绑定委托机

接口

定义接口

  • 创建蓝图接口文件Blueprint Interface
  • 在接口里定义函数

蓝图类实现接口

  • 在需要调用的类里的Class Settings里添加接口调用
  • 判断一个类是否实现了接口,使用Does Implement Interface节点

使用接口

  • 通过搜索Call来呼出接口函数和事件
  • 在其他蓝图内调用此蓝图类里实现接口的方法
  • 在该实现接口的蓝图类的My Blueprint窗口里能发现可重写的接口方法事件,见下图
  • 双击重写方法,或者右键该方法选择Convert Function To Event转换成事件
  • 重写方法是局部的,而转换的事件不是
  • 可以在任何地方调用此函数
  • 当其他蓝图类访问该蓝图类身上的接口方法事件时,该蓝图类内的事件就会执行

  • 多个蓝图类实现同一个接口,每个蓝图中可执行不同的方法

委托机与接口的差异

  • 委托机只能在一个蓝图类中被定义使用,其他蓝图类可以调用该蓝图类的委托机中绑定的事件
  • 接口能跨蓝图类使用,其他蓝图类可以调用实现接口的任意蓝图类中的接口事件