【UE引擎】(二)虚幻蓝图基础
一. 虚幻引擎安装与源码版本获取
1.1 虚幻引擎安装
- 打开www.unrealengine.com网站,点击登录→注册
- 虚幻引擎免费使用,如果想要使用 Launcher(登录器)必须注册 Epic 帐号
- Epic 帐号也是获取源码的必要途径。是获取商城资源,官方项目的必须凭证

-
下载Epic Games Launcher,发行许可版本进行安装

- 主页:活动新闻和游戏发布新闻
- 商城:游戏商城
- 游戏库:下载和购买的游戏
- 虚幻引擎
- 虚幻引擎:引擎相关新闻
- 学习:学习案例和资料
- 虚幻商城:资源商城
- 库:引擎版本下载、我的工程、保管库
- Twinmotion:快捷简便的实时建筑可视化
- UE5: 获取 UE5 引擎,和对 UE5 的介绍学习(现在已经发布了不止5.0,时间真快啊)

- 下载虚幻引擎:高版本虚幻引擎对电脑性能要求高,所以在基础阶段学习,4.27版本就够用了

1.2 源码获取
- 注册 GitHub 账号
![]()
- 关联 GitHub 账户和 Epic Games 账户
![]()
- 完成后,将收到一封来自 Epic Games 的电子邮件,点击此邮件中的加入 @EpicGames 按钮,完成 GitHub 账户和 Epic Games 账户的关联流程
-
![]()
![]()
-
解压下载好的压缩包后,打开 Setup.bat 文件开始下载(下载中断,下次打开会继续下载,巨久,可以睡觉了)
![]()
![]()
- 安装完成后,点击 GenerateProjectFiles.bat 文件(生成 Project 项目文件)
![]()
- 使用源码构建引擎
![]()
![]()
- 源码文件夹参考内存大小:
![]()
二. 虚幻编辑器
2.1 虚幻编辑器
- 关卡编辑器
- 静态网格体编辑器
- 材质编辑器
- 蓝图编辑器
- 物理资源编辑器
- 行为树编辑器
- 粒子编辑器
- UMG UI 编辑器
- 字体编辑器
- 过场动画编辑器
- 动画编辑器
- Sound Cue 编辑器(声音工具)
- Control Rig 编辑器(动画工具)
- 媒体编辑器
- nDisplay 3D Config 编辑器
- DMX Library 编辑器
- Persona
- Matinee
2.2 关卡编辑器
- 界面
- 菜单条(菜单项内容)
- 工具条(常用工具的快速访问)
- 引擎提供的常用Actors(快速创建引擎提供的Actors)
- 视口(场景 \ 资产的效果可视化)
- 世界大纲视图(展示当前关卡中所有的Actor)
- 内容浏览器(包含当前工程的所有资产)
- 详细信息(展示当前选中Actor的设置参数信息)

- 工具条
- Save Current 保存当前关卡(将当前关卡进行存储,并不存储资产)
- Source Control 源码管理(版本控制工具,用于团队间协同开发的资产管理)
- Modes 模式(编辑器模式:含地形编辑、植物编辑、笔刷编辑、网格体绘制)
- Content 内容(快速打开 / 跳转到内容浏览器)
- Marketplace 市场(打开Launcher中的资产市场)
- Settings 设置(快速访问世界场景设置、项目设置、插件、预览等)
- Blueprints 蓝图(提供在世界中创建和编辑蓝图的方法,关卡蓝图在此选项中)
- Cinematics 过场动画(用于制作CG影视动画)
- Build 构建(用于预处理构建场景资源,例如光影烘焙,地图导航,阴影,全局光照信息)
- Play 播放(运行游戏)
- Launch 启动(直接将工程推送到某一终端平台,在平台启动当前关卡)
- (C++编译,编译UE的C++工程)

- 工具条 - Play 播放
- Selected Viewport 选中的视口(当前窗口运行,速度最快的启动方式)
- Mobile Preview 移动设备预览(移动端预览运行,目的是在当前视图窗口之外,给定一个移动设备的分辨率,以快速调整视口分辨率,只修改了窗口的运行分辨率)
- New Editor Window(PIE) 新建编辑器窗口(以低帧率进行渲染,编辑模式启动一个新的编辑器窗口,方便进行功能测试调试,查看关卡信息)
- VR Preview VR预览(连接VR设备可用)
- Standalone Game 独立模式( 启动独立进程运行游戏,最接近于真实的程序运行,此模式将脱离编辑器,所有资产重新加载,启动速度最慢)
- Simulate 模拟(以真实帧率进行渲染,处于编辑模式模拟无操控的游戏运行,F8可以切换到操控模式)
- Current Camera Location 当前相机位置(在当前相机位置生成玩家)
- Default Player Start 默认玩家起点(在默认玩家出生点生成玩家)
- Number of Players 玩家数量(可测试多人联机游戏)
- Net Mode 网络模式
- Play Standalone (将启动一个独立游戏,不会创建和连接服务器)
- Play As Listen Server(编辑器将同时用于服务器和客服端,基于客户端数量打开额外实例)
- Play As Client(编辑器将用作客户端,将在场景后方启动服务器,以进行连接)
- Advanced Settings 高级设置(快速打开编译偏好中关卡偏好的Play设置)

- PlaceActor 工具栏
- Recently Placed 最近放置(包含了最近放置的最多 20 种类型的滚动历史记录)
- Basic 基础(包含常见的通用类型,诸Actor、角色、点光源等)
- Lights 光照(包含所有光照类型)
- Cinematic 过场动画(包含动画制作的类型)
- Visual Effects 视觉效果(包含常用的视觉类型, 或渲染相关类型, 包括雾、贴花等)
- Geometry 几何体(包含所有画刷图元类型)
- Volumes 体积 (包含所有放置体积类型)
- All Classes 所有类(包含所有放置的Actor类型)

-
Viewport Options 视口选项
- Realtime 实时(开启实时渲染,但会消耗计算机性能)
- Show FPS 显示帧数 (显示画面渲染帧率和耗时,控制台命令:Stat FPS)
- Show Toolbar 显示工具栏
- Field of View 视场(调节相机的视口角度)
- Far View Plane 远景平面(用作远景平面的距离,设为0即可启用一个无限距离的远视平面)
- Screen Percentage 屏幕百分比
- Game View 游戏视图(隐藏场景中的坐标轴、碰撞体、光照标记等)
- Bookmarks 书签(用来存储视口角度,以快速跳转该视口)

- 观察
- Perspective 透视(近大远小,轮廓感,就是我们平常用眼睛观察世界的感觉)
- Orthographic 正交(没有近大远小,没有聚焦)
- 正交模式是相对于世界坐标系进行观察的
- 正交模式一般用来调整位置关系

- View Mode 视图模式(一般用来后期做调试优化使用)
- Lit 光照(常规观察模式)
- Brush Wireframe 线框(所有的物体不渲染材质,只渲染模型线框)
- Reflections 反射(查看反射高光关系)
- LOD(用来显示当前视口中的物体的LOD等级)

2.3 虚幻资产
|
分类 |
类型 |
|
3D模型 |
fbx/obj |
|
贴图 |
png/jpge/bmp/tga/dds/exr/psd/hdr |
|
声音 |
wav |
|
字体 |
ttf/otf |
|
视频 |
mov/mp4/wmv |
- 注:还有一些资产可以通过加载插件进行导入,如abc(Alembic)文件,可通过Alembic Groom Importer插件进行导入
- Alembic文件一般可用来制作人物头发,动物毛发等
- 资产操作:Shift + End
2.4 虚幻坐标系
- 虚幻中使用直角坐标系
![]()
- 坐标系构成法则为左手法则
![]()
- 红色轴被标定为X轴,我们称红色箭头指向的方向为正方向
- 绿色轴被标定为Y轴,我们称绿色箭头指向的方向为右方向
- 蓝色轴被标定为Z轴,我们称蓝色箭头指向的方向为上方向

- 世界坐标系(绝对位置)
- 物体坐标系
- 相机坐标系(相机视角)
- 使用坐标系的嵌套可以方便解决物体旋转问题
三. 虚幻光
3.1 光源分类
- Directional Light 定向光源(固定光)
- 无位置信息,有照射方向信息,所有的阴影照射均是平行效果
- 太阳光
- Point Light 点光源
- 向各个方向均匀发光,随着距离出现衰减
- (一般可用来制作无照射方向的光源)灯泡,烛光,篝火,炮弹爆炸光
- Spot Light 聚光源
- 以锥形空间为照射模型,朝着锥桶方向进行均匀照射,随着距离进行衰减
- (一般制作带有光束特点灯光)手电筒,探照灯,汽车灯光
- Rect Light 矩形光源
- 从一个定义好宽度和高度的矩形平面向场景发出光线
- (矩形面积的任意类型光源)电视,显示器屏幕,吊顶灯具,壁灯
- Sky Light 天空光照(静态光)
- 获取场景中一定距离以外的部分将他们作为光照应用于场景中
- 天空光需要重建光照信息,才会进行捕捉计算
- 远处的大气,云,群山
- (材质光:不会进行光照计算)

3.2 光源移动特性
- Movab(可移动光源)
- 在场景运行时可以位移,旋转
- 产生完全动态的光源和阴影,不会产生间接光照,不需要构建(烘焙),消耗较大
- Static(静态光源)
- 运行时不可以做任何改变或移动的光源,不产生光照
- 只应用于光照贴图计算,只影响静态物体,消耗最低,必须进行构建(烘焙),只和静态物体产生交互,对动态物体不产生阴影,由光亮子照亮动态物体
- 一般用于移动平台,烘焙场景氛围,用途有限
- Station(固定光源)
- 固定位置不变的光源,但是光源其他信息可以被变更(颜色亮度信息),可以产生阴影
- 效率折中,质量最好,中等可变性,中等性能消耗
- 固定光源即产生直接光照也产生间接光照

- 定向光源:固定光
- 天空光源:静态光
- 直接光照:光源本身发射,直接照射到物体表面,体现的光照结果
- 间接光照:光源照射到物体表面,是通过反射关系产生的光照,也是真实世界的光照重要组成部分
3.3 构建光照(烘焙)
- 构建光照的目的:计算间接光照关系,产生间接光照缓存
- 在场景运行前期将场景中的光照关系进行提前计算,以防止在运行时态再计算关照关系,从而提升运行时的效率目的
- 构建光照的优点:在运行时态获得更加真实的光照关系,免去了运行时计算光照的开销。虚幻中静态光和固定光都需要构建光照
- 构建光照可以获得间接光照缓存(光的颜色贴图)

3.4 重要的光照体积
- 光量子
-
可以在编辑器视口中查看光照贴图采集,均匀分布于场景中,进行光照采集
![]()
-
- 间接光照缓存(Indirect Lighting Cache)
- 全局光照(Lightmass)可以生成静态物体上的间接光照信息,场景中的动态对象需要一种接收间接光照的方法
- 当前场景中的光照贴图缓存(烘焙后获得)

-
- Packed Light and Shadow Map 可调光照贴图的分辨率

- 将光照信息进行精细化计算,LIV可以调整发射光量子范围,允许集中在需要详细间接光照的区域进行收集,而在重要体积外的地方获取低质量的间接反射光照

四. 蓝图初步
4.1 蓝图概述
- 蓝图是虚幻中的一种可视化编程语言
- 采用图形化的方式构建,简化了编程中的逻辑构建的复杂度(线性逻辑)
- 美术策划人员可以在没有任何编程基础的前提下,进行逻辑编写

4.2 蓝图种类
- 关卡蓝图(不可复用,一对一关联关卡中物体)
![]()
- 蓝图类(可以复用)
- Actor蓝图
- GameMode蓝图(属于Actor对象蓝图,游戏逻辑)
- GameState蓝图(属于Actor对象蓝图,游戏状态)
- PlayerCotroller蓝图(属于Actor对象蓝图,玩家控制器)
- 动画蓝图
- 组件蓝图
- (组件优于继承,防臃肿)
- UMG蓝图
- …
- Actor蓝图

4.3 Actor 蓝图
- 虚幻中将场景的所有对象体均定义为是一个 Actor
- Actor 是一种基本类型的对象,存在于场景中的物体需要从 Actor 进行扩展衍生
- 可以将 Actor 直接放到场景中,也可以在世界中生成 Actor
- 虚幻中常见的 Actor:摄像机,触发器,各种体积,静态网格,骨骼网格,Player Start 等
4.4 认识蓝图
- 蓝图节点(逻辑节点,函数节点)
- 在节点右边叫逻辑输出引脚,左边叫逻辑输入引脚。注意逻辑引脚都是白色
- 输入参数引脚
- 逻辑执行线或是执行线
- 输出参数引脚

- 如何阅读蓝图:
- 蓝图是从左向右进行输出执行,所以找到白色的执行线的顶端,从顶端向下阅读即可
- 遇到节点,执行节点对应操作逻辑
- 遇到流程控制节点,调整执行流程
4.5 日志输出
- 日志可以帮助我们提供运行时态的程序信息,并进行输出,通过日志可以直观的查看到对象状态,以反馈数据内容(一般数据内容是不具象的)
- 还可以使用日志打印来判定当前逻辑是否执行
- print 节点:
![]()
五. 3D数学基础与虚幻物理系统
5.1 向量
- 向量
- 向量(也称为欧几里得向量、几何向量、矢量),指具有大小(magnitude)和方向的量,在3D数学中,用来描述方向和长度信息
- 分为:2D向量 和 3D向量,下面主要讨论的是 3D向量
- 三维空间中的向量
- 由三个标量构成(标量:标量是只有大小,没有方向的量),常记做(x,y,z),也称x,y,z为分量
- 这是向量的空间直角坐标系表示法,也称为行向量

- 向量的用途
- 位移时朝着哪里移动
- 发力时朝着哪里发力
- 计算两点之间的距离
- 目标在我的哪个位置
- 将自己的正方向指向目标(Look At)
- 判断目标是否朝着某一个方向
- 判断点是否在线段上
- 判断点是否在一个平面上
- 平面记做垂直法向量加常量
- 平面记做两个向量
- 特殊向量定义
- 零向量
- 长度为0的向量叫做零向量,记作0
- 零向量的始点和终点重合,没有确定的方向,或说零向量的方向是任意的
- 单位向量
- 长度为一个单位(即模(向量的长度叫模长)为1)的向量,叫做单位向量
- 负向量
- 向量AB与向量CD的模相等且方向相反,则把向量AB叫做向量CD的负向量,也称为相反向量
- 相等向量
- 长度相等且方向相同的向量叫做相等向量
- 向量a与b相等,记作 a=b。
- 位置向量
- 对于坐标平面内的任意一点P,把向量OP叫做点P的位置向量,记作:向量P
- 方向向量
- 空间直线的方向用一个与该直线平行的非零向量来表示,该向量称为这条直线的一个方向向量
- 法向量
- 直线l⊥α,取直线l 的方向向量a,则向量a 叫做平面α 的法向量。
- 零向量
- 位置向量的运算
- 向量没有位置的概念,只是描述了一段有方向有长度的线
- 坐标有坐标系原点,向量只有起始点(未必是坐标系原点),坐标是一种特殊的向量
- 坐标和坐标相减(A - B):
- 数学运算:各分量分别相减
- 几何意义:得到一个向量,从B点指向A点的向量。
- 坐标和向量相加(A + b):
- 数学运算:各分量分别相加
- 几何意义:得到一个新的坐标点,让A坐标点沿着b向量的方向,平移了b向量的长度的距离。
- 向量和标量相乘:
- 数学运算:各分量分别乘以那个标量
- 几何意义:得到一个新的向量,在原向量基础上保持原有方向,长度进行标量倍的缩放。
- 向量和向量相加(a + b):
- 数学运算:各分量分别相加
- 几何意义:得到一个新的向量,ab向量首尾相接,这个向量从a向量的起点指向b向量的终点
- 向量和向量相减(a - b):
- 数学运算:各分量分别相减
- 几何意义:得到一个新的向量,ab向量起点重合,这个向量从b向量的终点指向a向量的终点
- 注意:向量和向量的加减使用的是平移法进行标识,如图


- 向量的运算
- 坐标向量的分量几何意义
- 表示向量在各个轴向上的偏移程度,即向量在各个轴向上的投影的长度
- 向量的长度(模长):
- 向量a 模长就表示为 |a|
- 使用勾股定理:
- 向量的模长 = 各分量的平方和再开方(三维空间也是如此)
- 向量乘以标量0,结果为零向量
- 向量转为单位向量
- 向量各分量除以向量长度(模长),即可获得单位向量
- 向量乘以标量-1,结果为负向量
- 几何意义:获得向量的同长度相反方向的向量
- 向量的比较
- 比较的是向量的相似度(长度,方向),而非比较各分量值
- 坐标向量的分量几何意义
- 三角函数(角和三条边所对应的比例关系)
- 正弦函数:sin θ = 对边/斜边
- 余弦函数:cos θ = 邻边/斜边
- 正切函数:tan θ = 对边/邻边
- 余切函数:cot θ = 邻边/对边
5.2 点乘和叉乘
- 点乘(内积)
-
a · b = |a|·|b| ⋅ cosθ
- a向量在b向量方向上的投影的长度,再乘以b向量的模长
- 几何意义变种:如果a向量和b向量都是单位向量,结果就是两个向量夹角的余弦值
-

- 叉乘(外积)
-
|a x b| = |a|·|b| ⋅ sinθ
- 返回向量的长度等于向量a,向量b构成的平行四边形的面积,且新向量垂直于向量a,向量b构成的平面
![]()
-
5.3 3D数学相应的蓝图节点
(Location、Rotation、Scale、Transform、点乘、叉乘)
- 获取对象的位置信息
- Get Actor Location
- Get World Location
- Relative Loation
![]()
2. 设置对象的位置信息
-
- Set Actor Location
- Set World Location
- Set Relative Loation
3. 获取对象的旋转角度信息
-
- Get Actor Rotation
- Get World Rotation
- Relative Rotation
4. 设置对象的旋转角度信息
-
- Set Actor Rotation
- Set World Rotation
- Set Relative Rotation
5. 获取对象的比例信息
-
- Get Actor Scale 3D
- Get World Scale
- Get Relative Scale 3D
6. 设置对象的比例信息
-
- Set Actor Scale 3D
- Set World Scale 3D
- Set Relative Scale 3D
7. 获取对象的变换信息
-
- Get Actor Transform
- Get World Transform
- Get Relative Transform
8. 设置对象的变换信息
-
- Set Actor Transform
- Set World Transform
- Set Relative Transform
9. 点乘
-
- Dot Product
- Dot Product(2D)
10. 叉乘
-
- Cross Product
- Cross Product(2D)
![]()
11. 角度运算
-
- CombineRotators 角度加法
- Delta(Rotator) 角度减法

5.3 物理引擎与物理交互
- 游戏引擎中的物理引擎的主要目的是:解决物体在空间的状态信息
- 物理引擎遵循物理定律,按照给定的算法,进行模拟现实世界中的物理运动
- 物理引擎通过为刚性物体赋予真实的物理属性的方式,来计算运动、旋转和碰撞反映
- 物理引擎处理了物体之间的交互关系,通过模拟物理计算,增加场景的真实感(撞击,发力等)
- 虚幻使用 PhysX 物理引擎驱动物理仿真及碰撞计算
- 能够被物理引擎计算的物体必须具备:刚体(包裹外壳),如果希望加入物理引擎运动,还需要开启物理模拟

- 碰撞响应 和 追踪响应(射线) 构成了虚幻引擎4在运行时处理碰撞和光线投射的基础
- 虚幻中的碰撞交互方式分为三种:
- 忽视:物体和物体之间,不产生任何物理结果(物理引擎不将两种物体作为检查范本)
- 重叠:物体和物体之间,可以互相穿透,并产生事件通知(物理引擎会时刻关注物体之间的位置关系)
- 阻挡:物体和物体之间,不可以互相穿透将产生阻挡效果
5.4 物理碰撞
- 物理碰撞添加的两种途经:
- 静态网格编辑器
- 物理资源编辑器(为骨骼Mesh使用)

- 静态网格的添加的碰撞形式分为两种:(默认在 Physx 中创建简单和复杂两种形态,再基于用户需要(复杂查询 vs 简单查询)使用相应形态)
- 简单碰撞
- 简单碰撞可以解决大部分场景中的物体碰撞交互关系,使物理引擎性能得到优化
- 需要进行添加碰撞包裹
- 复杂碰撞
- 复杂碰撞直接使用的模型三角面进行计算,因此消耗较大
- 无法物理模拟,但可将其和其他模拟(简单)物体进行碰撞
- 简单碰撞
- 简单碰撞(基础):如方块、球体、胶囊体和凸包

- 复杂碰撞(给定对象的三角网格图)
-
- Project Default 默认设置
- 在设置面板上可以看到,此设置“默认”使简单碰撞请求使用简单碰撞,复杂请求使用复杂碰撞
- Simple And Complex 创建简单和复杂的形状
- 简单形状用于常规场景查询和碰撞测试
- 复杂形状(逐多边形)用于复杂场景查询
- UseSimpleAsComplex 将简单碰撞用作复杂碰撞
- 如请求复杂查询,引擎仍将查询简单形态,无视三角网格图
- 有助于节约内存(不需要烘焙三角网格图),可以增强性能
- UseComplexAsSimple 将复杂碰撞用作简单碰撞
- 如请求简单查询,引擎将查询复杂形态,无视简单碰撞
- 该设置可将三角网格图用作物理模拟碰撞
- 注意:如果使用 UseComplexAsSimple,则无法模拟物理;但可将其和其他模拟(简单)物体进行碰撞
- Project Default 默认设置

5.5 碰撞预设
- 为了快速确定场景中物体的物理碰撞关系,虚幻划定了不同“身份”的碰撞预设
- 物体分类的多样性决定物体在场景中物理交互的复杂度
- 在场景中,查看物体的碰撞预设:

- 在设置中,修改物体的碰撞预设:


5.6 碰撞事件
- 碰撞响应事件
- 重叠事件(分为进入堆叠和退出堆叠)

- 撞击事件

5.7 物理追踪
- 物理追踪是指引擎运行状态下,使用线或是形状与场景物体产生交互,并将交互结果进行反馈,以达到动态产生物理交互响应的目的。
- 1. 线性的检测 / 射线检测:检测分为单检测(只能扫描到一个目标)和多个目标检测(返回多个目标),主要区别是用来筛选目标
- ① 通道检测:使用轨迹通道为主要检测判定依据
- 1. 线性的检测 / 射线检测:检测分为单检测(只能扫描到一个目标)和多个目标检测(返回多个目标),主要区别是用来筛选目标

-
-
- ② 预设检测:使用预设关系进行碰撞检测,需要填入预设名称
![]()
![]()
- ② 预设检测:使用预设关系进行碰撞检测,需要填入预设名称
-
-
-
- 物体类型:将希望被射线检测到的物体类型构建成为数组填入(只与类型匹配的物体产生交互关系)
-


-
- 2. 形状的检测(球,盒子,胶囊)



5.8 虚幻力
- 在虚幻中,只有开启了物理模拟的物体才能受到力的作用 1. 按力的作用方式分为两种:冲力(impulse),推进力(force)
- 冲力:瞬间力,作用结束后直接施加给物体,修正物体在物理引擎中的运动表现
![]()
- 推进力:持续力,随着时间推演作用力累加(类似火箭推进器。单帧作用力,当前帧力效果施加后,如下一帧不存在推进力,则作用力无效果)
![]()
- 2. 按力的作用结果分为:
- 角冲量
![]()
- 角冲量
-
- 角扭距

5.9 物理材质
- 设置物体的物理表面类型,用于区分物体的表面主动响应逻辑交互方式
- 例如,子弹打到木质的墙面和打到岩石发出的声音是不同的,我们可以通过使用物理材质表面类型来区分碰到的物体表面是什么

- 物理材质描绘了物体表面的物理特性,例如摩擦力,弹性,密度等信息


- 检查物理材质表面类型

六. 数据类型与逻辑流程控制
6.1 强类型语言
- 强类型:程序中表达的任何对象所从属的类型,必须能在编译时确定
- 常见的强类型语言有C++、Java、Python等
- 强类型语言的优势
- 编译时刻能检查出错误的类型匹配,以提高程序的安全性;
- 可以根据对象类型优化相应运算,以提高目标代码的质量;
- 减少运行时的开销
- 弱类型语言也称弱类型定义语言,即对象类型可以在编码时不进行明确定义,在运行时根据上下文自动进行转换
- 例如vb,php,javascript,Lua等语言均是弱类型语言
- 蓝图属于强类型约束(对象类型一一对应)

6.2 数据类型
- 数据类型
- 描述了数据在内存中占用的空间大小(计算机需要裁定内存大小来存储数据)
- 数据类型的出现是为了把数据分成内存大小不同的数据,可以根据不同需求充分利用内存
- 蓝图数据类型分类
- 基本数据类型:
- 布尔型(true、false)
- 字节型(值域范围是0-255)
- 整型(描述一个整数)
- 浮点型(描述一个小数)
- 复合数据类型:其他数据类型均是复合数据类型
![]()
- 基本数据类型:
- 变量
- 通过变量名访问变量
- 在蓝图中变量分为:局部变量,成员变量
- 变量的声明和初始化

- 命名法则:增加编码内容的可读性
- 帕斯卡命名法(大驼峰):FirstName、LastName
- 驼峰命名法(小驼峰):myFirstName、myLastName
- 下划线命名法:First_Name、Last_Name
- 常用数据类型
Boolean 布尔类型 ture/false Byte 字节型 0-255( 经常用来作为颜色的取值) Integer 整型 Integer64 整型 Float 浮点型 Name 命名 比大小时,默认忽略大小写(存储速度最快) Text 文本 存储描述性语言、本地文本、中英文切换 String 字符串 Vector 向量 Rotator 旋转 Transform 矩阵
6.3 数据容器
- 容器可以帮助我们快速储存和整理数据,使得数据按照给定的规则(容器特性)进行有序的存储
- 虚幻引擎提供了三种同质容器(同质容器:容器内只能存储同一种数据):
- Array容器(数组)
- 访问速度快、内存消耗较小、安全性高,可以随意调整容器的大小,但元素位置在容器中不会发生改变(除去插入和移除)
- 索引下标从0开始计算(最末位的值永远比容器中元素个数少1)
- Array是最常用的容器
- Map容器(映射)
- 键值唯一,加入相同键值元素将被覆盖
- 应用于:游戏中的背包栏(具备格子概念背包),游戏中的技能栏(具备技能释放快捷键),游戏中的装备槽等
- Set容器(集)
- 键值和元素相同,本身对键值操作隐藏。操作标签即为元素本身,即如果想要操作Set中的内容,需要先知道元素
- Set不注重排序(元素在容器中的顺序是不固定的),不依赖顺序
- 应用场景:游戏中的聊天辱骂过滤,敏感词检索,特殊道具持有检查等,当有很多唯一的数据且想要快速搜寻时,使用TSet
- Array容器(数组)

- Array 数组的常用操作
- 复制和引用
- 复制:在外部修改不会影响容器内的数据
- 引用:在外部修改数据会影响到容器内的数据内容
- 复制和引用

-
- Array 数组的遍历
- 遍历:将容器中的元素进行逐一获取
- 两种遍历方式:使用ForLoop通过下标获取;使用ForeachLoop快速遍历
- Array 数组的遍历

-
- Array 数组的常用API

6.4 基本运算
- 基本运算:加、减、乘、除、取余
- (注意:节点是一个整体,节点运算完成才能进入下一节点,无优先级)
- 变量:赋值、获取
- (外部蓝图变量的调用需要对象引用)

- 自增、自减
- (只有整型有此操作)

- 数学表达式:Add Math Expression

6.5 关系与逻辑运算
- 关系运算符(结果均为布尔值)
- 逻辑运算符
- 按位与&(二进制运算)输出运算结果为不同的数值
- 逻辑与 && 输出逻辑值true或者 false
6.6 Name、Text、String的常用运算
- Name
- Equal 相等 / Not Equal 不相等
- Make Literal Name 创建一个Name
- To String 转换为String类型
- To Text 转换为Text类型


- Text
- Text Trim Trailing 删除尾部空白字符
- Text Trim Preceding 删除前面空白字符
- Text Trim Preceding and Trailing 删除前后空白字符
- Text to Upper 大写
- Text to Lower 小写
- Text Is Empty 判断是否为空
- Find String Table ID and Key from Text 从Text中查找StringTable的ID和Key
- Is Text from String Table
- Format Text 格式化文本
- Print Text 打印


- String
- Append 拼接字符串
- Build String 拼接字符串
- Replace 替换
- Replace Inline 内联替换
- Trim 删除前面空白字符串 / Trim Trailing 删除尾部空白字符
- To Lower 小写 / To Upper 大写
- Left 左保留 / Right 右保留
- Left Chop 左切分 / Right Chop 右切分
- Left Pad 左填充 / Right Pad 右填充
- Starts With 搜索字符串前缀 / Ends With 搜索字符串后缀
- Time Seconds to String 将秒转换为String(Get Time Seconds 秒表)
- Length 获取字符串长度
- Is Numeric 判断是否为纯字符串
- 查找给定通配符是否匹配
- Join String Array 将数组以Separator符号串联成一个字符串
- Get Character Array from String 从字符串中获取字符数组
- Cull Array 筛选数组
- Make Literal String 创建一个文本字符串
- Reverse 反向打印
- Mid 从字符串Start位置(从0开始),截取一个Count大小的子字符串
- Get Substring 获取子字符串
- Find Substring 寻找子字符串
- Select String 选择字符串
- Get Character as Number 获取字符ASCII
- Contains 字符串中是否包含子字符串
- Split 将字符串分割成左右两个不含分隔符的字符串
- Parse Into Array 分割字符串




6.7 流程控制
- 蓝图逻辑是线性的,而流程控制语句可以改变线性程序的流程,增加更多的操作分支

- Branch 分支
- Sequence 序列
- Flip Flop 交替执行
- 延迟
- Delay 一次触发的延迟
- Retriggerable Delay 可二次触发的延迟
- 门
- Gate
- MultiGate
- 执行
- Do Once
- Do N
- Do Once Multinput
- 循环
- For Loop
- For Loop With Break
- For Each Loop
- For Each Loop With Break
- While Loop
- Switch 条件
- Select 选择
![]()
七. 蓝图面向对象
- 面向对象是一种思维方式,虚幻按照面向对象的方式设计了整套引擎和框架
- 蓝图本身也是按照面向对象进行设计开发的
7.1 面向对象
- 面向对象的三大特性:封装、继承、多态
- 面向对象设计:
- 从抽象角度,为事物添加数据信息和行为(将程序设计进行模块化,整体化)
- 抽象
- 封装个体
- 提升重用性
- 我们的设计其实在设计模版,模版本身不会有任何交互特性。只有当模版被实例后的对象和对象之间才会存在真实的交互特性
- 虚幻中创建的蓝图,称之为蓝图资产 / 蓝图模版
- 模版是一种复合数据类型,其主要目的是描述对象的结构和行为,这种描述过程称为抽象
7.2 蓝图模板
- 成员变量
- 在蓝图变量框中添加的变量为成员变量
- 只能通过蓝图的实例(对象),进行有效的访问该成员变量
- 成员变量描述了抽象后的对象的属性信息

- 成员函数
- 函数:一段在一起的,可以做某一件事的程序。在OOP中也叫做子程序、方法
- 函数是面向对象编程中将逻辑进行封装的重要表现,将逻辑单一化,清晰化,明确化,复用化
- 函数本身可以用来处理数据,也可用来辅助获得数据

- 函数输入值和输出值(处理数据、提供数据)
- 函数中输入参数可以有多个,输入值就是为了对接外界提供的数据入口
- 函数中输出参数(返回值)也可以有多个,函数将处理好的数据可以通过输出的方式进行返回,提供给外界进行使用

- 纯函数
- 纯函数用于获取类的成员数据,无法修改数据
- 无法连接到逻辑执行线(无逻辑输入引脚),只能依赖其他节点的属性输入针脚进行连接使用
- 每个连接到纯函数上的节点,都会调用一次纯函数


7.3 Event 事件
- Event事件只能在事件图表中进行构建,无法在函数内,宏内进行构建
- Event事件和函数一样可以在外部被调用,支持输入参数列表编写

| 事件 | 函数 | |
| Delay / timeslines 等待时间的节点 | 可以调用 | 不能调用 |
| 返回值 | 没有返回值 | 有返回值 |
| 调用 | 调用只是触发 | 调用会立刻执行并等待结果 |
| 执行 | 执行在不同线程 | 执行在同一线程 |
| 局部变量 | 有局部变量 | |
| 网络同步 | 可以被标记为网络同步 | |
| 事件调度器 | 可以被绑定到事件调度器 |
7.4 Macro 宏
- 与函数不同(函数会被编译为执行单元),宏进行的是节点替换(过量使用宏会导致程序的节点量膨胀)
- 宏的优点:
- 支持多逻辑针脚输入 / 输出(宏本质不会被编译为逻辑单元,这并不与程序本身相违背)
- 支持参数列表输入 / 输出

- 本地数据类型(宏自己的变量)
- 本地数据将会根据宏调用的位置转换为对应的数据类型,可以帮助我们在宏中构建参数逻辑
- 在函数中调用宏,本地数据将变成局部变量
- 在事件图表中调用宏,本地数据将变成成员变量
- 当编写一段逻辑需要一个针对此逻辑的状态变量(例如FlipFlop,Gate节点),且需要复用此段逻辑时,可以使用宏搭配本地数据类型进行操作明显
- Local 构建变量
- Assignment 分配变量值


| 宏 | 函数 | |
| 本质 | 本质是逻辑节点替换操作 | 本质是纯函数(被编译为执行单元) |
| 多逻辑针脚输入 | 支持 | 不支持 |
| 节点膨胀 | 过多使用宏而导致蓝图中节点膨胀 | 不会膨胀(被编译成逻辑单元,所有调用的地方均使用一个逻辑单元) |
| 重写 | 无法被重写(宏是无形的) | 可以被重写(函数是有形的) |
| 成员对象调用 | 类内部宏无法在外部通过成员对象调用 | 类内部函数可以在外部通过成员对象调用 |
| 多次调用 | 宏中的本地数据类型多次调用,会生成多个参数数据 | 函数中的局部变量多次调用,只存在于调用周期中(调用结束即消亡) |
| 两者均可进行封装重复被调用; | ||
| 均可以构建无执行输入输出针脚的节点 | ||
7.5 事件调度器
- 事件调度器是蓝图中按照观察者模式(订阅)而添加的,目的是解耦合
- 观察者模式是较常用的一种设计模式,将对象想象为观察者和被观察者,具有高效低耦合的特性

- 响应逻辑(动作)应写在观察者身上(事件应该写在希望接收通知的对象身上);
- 触发动作写在被观察者身上(调度器写到发出通知的人身上)

- 事件调度器的创建

-
- 执行调用
- 在调度器持有者内部,进行调用,所有绑定到调度器上的事件均被调用
- 执行调用

-
- 绑定事件调度器
- 绑定需要持有被订阅者(事件调度器持有者)的引用,方可绑定,调度器支持多个事件绑定
- 绑定需要提供事件,事件构建后会和调度器的签名结构相同(调度器参数个数类型和事件的相同)
- 注意:事件ToggleLight可以主动调用,但一般不会调用,调用由调度器持有者完成
- 绑定事件调度器

-
- 解除绑定事件调度器

7.6 实例
- 创建Actor
- 将蓝图模版直接拖拽到场景中,生成蓝图对象实例(编辑模式下可使用,不具备灵活性)
- 调用生成节点SpawnActor,进行动态生成(动态生成对象具备灵活性,但无法如编辑模式提前做好更多的数据调整)

- IsVaild节点安全检查,增加程序的稳定性(IsVaild节点接受一个对象型(Object)数据)

- 查找Actor
- Of Class 通过给定的对象模版将场景中与之匹配的对象进行查找,并返回查找到的所有对象。
- With Interface 通过给定的接口将场景中与之匹配的对象进行查找,并返回查找到的所有对象。
- With Tag 通过给定的标签将场景中与之匹配的对象进行查找,并返回查找到的所有对象

7.7 蓝图接口
- 接口可以帮助我们让不同类型的类之间具有相同的能力
- 方便协同开发时调用,解耦合

- 因为接口只是描述了行为接口,并不会描述行为过程。所以接口添加的函数只有函数的名称,参数,返回值(参数和返回值根据设计需求添加),无法添加任何成员属性


- 实现接口函数的目的是在函数中编写逻辑
- 三种接口调用方式:
- 检查对象是否继承接口节点 Does Implement Interface

八. GamePlay 框架初步
- 虚幻引擎为开发人员提供了一套开发规则,我们称之为游戏框架(GamePlay框架)
- 虚幻抽象出了多种角色,在开发过程中我们需要沿着设计者给定的身份进行游戏设定编写(这虽然约束了我们的设计,但是在一定程度上加强了开发的稳定性)
- 抽象的角色,在游戏中扮演不同的身份,从事不同的工作任务
- (此处仅为GamePlay框架的初步认识,更详细的进阶内容可查看 【UE架构】虚幻GamePlay架构 )
![]()
8.1 游戏模式(GameMode)
- GameMode 主要负责管理游戏的规则,包括:
- 出现的玩家和观众数量,以及允许的玩家和观众最大数量
- 玩家进入游戏的方式,可包含选择生成地点和其他生成/重生成行为的规则
- 游戏是否可以暂停,以及如何处理游戏暂停
- 关卡之间的过渡,包括游戏是否以动画模式开场
- GameMode 主要任务就是构建和实现游戏规则及获胜条件,并将游戏中的其他角色进行注册(如默认的玩家,HUD类,玩家控制器,观众类,GameState类,PlayerState类)
- 一个游戏可以有多个 GameMode
- GameMode 仅存在于服务器上,一般在游戏过程中不会有太多数据改变(不需要有客户端需要的临时数据)
8.2 游戏状态(GameState)
- GameState 主要负责游戏中共享信息的记录,游戏的信息可以通过 GameState 进行存储和同步,包括:
- 游戏已运行的时间(包括本地玩家加入前的运行时间)
- 每个个体玩家加入游戏的时间、玩家的当前状态
- 当前 GameMode 的基类
- 游戏是否已开始
- GameState 是虚幻中进行游戏信息记录的载体,包括关联玩家的列表、分数,象棋游戏中的象棋位置,在开放世界游戏中已经完成的任务列表等
- GameState 存在于服务器和所有客户端上,可以自由地进行复制来保持同步
- GameState 常与 GameMode 配合使用(GameMode 制定规则,GameState 记录信息)
8.3 默认玩家(DefaulePawn / Character)
- 不管任何游戏,都应当存在一个默认的玩家或一个上帝视角进行游戏的指令发布
- Pawn 是游戏主体,可以是玩家控制的英雄,可以是敌人,也可以是 NPC
- 只有继承在 Pawn 的对象才能成为 DefaulePawn (Character 继承自 Pawn,是一种特殊的 Pawn,具有移动和碰撞)
- DefaulePawn 需要通过控制器进行控制,可以轻松地接受输入,且可以执行各种各样的类似于玩家的动作
8.4 玩家状态(PlayerState)
- PlayerState 是游戏中的一个参与者的状态,如人类玩家或者模拟人类玩家的机器人(作为游戏一部分存在的非人类玩家AI没有PlayerState)
- PlayerState 中适合包含的示例数据有:玩家姓名、分数、多人在线竞技游戏中的级别等(玩家数据和玩家操控角色数据是两个不同的数据点)
8.5 玩家操控器(PlayerController)
- PlayerController 主要负责管理玩家的Actor类型对象,目的是将真实玩家的意愿进行收集,最后汇总转投给虚拟角色
- PlayerController 本质上代表了人类玩家的意愿(这个过程就是游戏中的玩家交互过程),是 Pawn 和控制它的人类玩家间的接口
- PlayerController 可以拥有 Pawn
- 所有玩家的 PlayerStates 在所有机器上都存在(和PlayerControllers不同),且可以自由地进行复制来保持同步
8.6 游戏实例(GameInstance)
- Game Instance 贯穿于游戏始终,不论游戏是否在进行 / 等待 / 结束,都可以访问到 GameInstance,非常适合放置一些独立于关卡的信息或功能(如:显示UI)
8.7 用户界面(HUD)
- HUD 是二维的屏幕显示信息,进行简单 UI 绘制,也称 UMG
九. UMG系统(HUD)
9.1 UMG 简介
- UMG是虚幻新一代可视化的UI创作工具,虚幻称之为“虚幻运动图形界面设计器(Unreal Motion Graphics UI Designer)”,主要用来创建UI元素,例如游戏中的HUD,菜单,展示动画UI等
- UMG的核心是控件,这些控件是一系列预先制作的函数,可用于构建界面(如按钮、复选框、滑块、进度条等)
- 控件是UMG系统中提供给用户用来交互的单元体,包括输入交互(个别控件无输入)与展示交互
- 主要目的是将数据逻辑以合理的方式展示给用户,或是从用户处获得合理的输入,用于控制数据等
- 同时也支持自定义控件来完成特殊的需求定制
- 这些控件在专门的控件蓝图中编辑构造:
- 设计器(Designer)选项卡:界面和基本函数的可视化布局
- 图表(Graph)选项卡:提供所使用控件背后的功能


9.2 UMG 常用控件
- 通用控件(基础控件,功能单一,是所有复杂控件的奠基石)
- 边界 Border:一般用来做布局容器的圈定,内部只能填入单一控件
- 按钮 Button:用来接收用户点击事件,是交互的基础元素(需要加入描述可与控件Text配合使用)
- 勾选框 CheckBox:选择组件,用于构建单选操作,常用来询问用户是否同意某一操作
- 图像 Iamge:用来展示一张贴图或是材质
- 命名插槽 Named Slot:当将UserWidget作为控件时,NameSlot将被保留,用于在外部进行控件添加对齐使用(像预留插槽,专用于在外部插入新的控件到内部布局中)
- 进度条 ProgressBar
- 多格式文本 Rich Text Block :用来在一段文本段中显示多种样式的文本,这不限于文本的文字类型,大小,颜色,外观样式等
- 使用需要构建富文本数据表格
- 滑条 Slider:用于在游戏中调整一个区间数据(如音量大小,游戏效果,视距等)
- 文本 Text:仅用来展示非编辑文本信息,运行中无法让用户进行输入操作
- TextBox:与Text相反,允许用户进行输入编辑

9.3 锚点和槽点
- 在制作UI时,要考虑UI针对不同的视口比例下的对齐关系
- 锚:控件对齐时用到的参考位置
- 用来定义控件在画布面板上的预期位置,并在不同的屏幕尺寸上维持这一位置。
- 控件的锚点受制于控件的父级容器特点,并不是所有控件都会具备锚点特性
- 相对位置关系:锚点对齐时使用其他控件位置作为参考,参考控件移动,自身也发生移动。
- 绝对位置关系:以坐标为参考依据,不受视口变化影响,永远在视口的对应坐标位置。
![]()
- 槽:决定了控件的位置结果,会根据控件所在的父节点控件类型而定。如果需要动态调整控件在视口中的位置,需要先获取到槽后再进行。
![]()
9.4 自定义控件
- 编写的所有控件均可以被当做另一个控件的子内容使用,这使得我们可以灵活的去编写多样的控件内容。
- 将整体的UI进行拆解,然后构建成为多个独立的控件,再进行组合。可以更加方便的完成控件之间的关联和扩展。

- 在编写控件时,如果在控件中构建了调度器,那么当此控件被当做其他控件的子控件时,调度器将会被当做事件直接暴露到另一个控件中。可以直接在细节面板中选中实现控件。
- A控件中的事件调度器

-
- 将A控件添加到B控件中,在B控件中查看A控件的细节面板,将会获得事件绑定快捷入口

- 将自定义控件中的控件样式属性暴露到外部
- 构建属性,选择类型,并将属性暴露到外部,当控件添加到其他面板时可以看到控件样式设定,启动时设置样式(链接到Construct只有运行能看到效果,如果链接到Pre Construct上则可以在编辑时看到效果)
![]()
9.5 3D UI
- 借助组件Widget Interaction来完成3D交互,将UMG控件显示在空间中(World和Screen)

- 借助组件Widget Interaction进行模拟交互,完成点击事件交互。注意控件的响应一般是响应抬起事件

- 按键输入模拟 Press Key/ Release Key 为输入框进行输入模拟 如同Send Key Char这不是当作敲击来使用,而是当作字符输入来使用
- 输入字符 Send Key Char 向界面输入文本内容

十. 项目资源操作
10.1 项目迁移的方法
- 1. 压缩项目
- 最正规的迁移项目的方法,常用来迁移整个项目
- 加载了第三方插件可能会出现问题(默认插件没事,虚幻商城里有的第三方插件,打开迁移项目时也会弹出对应的下载界面)

- 2. 直接压缩Content文件夹下的文件
- 常用来迁移资产
- 如果项目中修改了配置文件/项目依赖配置文件,则迁移的资产会缺少配置文件

10.2 插件常存放的位置
插件加载到项目中,可能存放的两个位置:
- 1. 项目工程中,自定义新建Plugins插件文件夹下
- 优点:方便迁移项目,迁移项目时只需对该插件文件夹进行压缩
- 缺点:其他项目使用时,需要重新创建插件文件夹,重新加载
- 2. 直接放在引擎默认的插件文件下(UE_5.0\Engine\Plugins)
- 优点:方便其他项目使用,不用重新加载
- 缺点:迁移项目时要格外注意插件,将第三方插件拷贝复制






























浙公网安备 33010602011771号