【UE引擎】(二)虚幻蓝图基础

一. 虚幻引擎安装与源码版本获取

1.1 虚幻引擎安装

  • 打开www.unrealengine.com网站,点击登录→注册
  • 虚幻引擎免费使用,如果想要使用 Launcher(登录器)必须注册 Epic 帐号
  • Epic 帐号也是获取源码的必要途径。是获取商城资源,官方项目的必须凭证

 

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

 

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

 

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

 

1.2 源码获取

 

  • 关联 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 光源分类

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

 

 3.2 光源移动特性

  1.  Movab(可移动光源)
    • 在场景运行时可以位移,旋转
    • 产生完全动态的光源和阴影,不会产生间接光照,不需要构建(烘焙),消耗较大
  2. Static(静态光源)
    • 运行时不可以做任何改变或移动的光源,不产生光照
    • 只应用于光照贴图计算,只影响静态物体,消耗最低,必须进行构建(烘焙),只和静态物体产生交互,对动态物体不产生阴影,由光亮子照亮动态物体
    • 一般用于移动平台,烘焙场景氛围,用途有限
  3. 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蓝图

 

 

 

 4.3 Actor 蓝图

  • 虚幻中将场景的所有对象体均定义为是一个 Actor
  • Actor 是一种基本类型的对象,存在于场景中的物体需要从 Actor 进行扩展衍生
  • 可以将 Actor 直接放到场景中,也可以在世界中生成 Actor
  • 虚幻中常见的 Actor:摄像机,触发器,各种体积,静态网格,骨骼网格,Player Start 等

 

 4.4 认识蓝图

  1. 蓝图节点(逻辑节点,函数节点)
  2. 在节点右边叫逻辑输出引脚,左边叫逻辑输入引脚。注意逻辑引脚都是白色
  3. 输入参数引脚
  4. 逻辑执行线或是执行线
  5. 输出参数引脚

 

  • 如何阅读蓝图:
    • 蓝图是从左向右进行输出执行,所以找到白色的执行线的顶端,从顶端向下阅读即可
    • 遇到节点,执行节点对应操作逻辑
    • 遇到流程控制节点,调整执行流程

 

 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、点乘、叉乘)

 

  1. 获取对象的位置信息
    • 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,则无法模拟物理;但可将其和其他模拟(简单)物体进行碰撞

 

5.5 碰撞预设

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

 

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

 

5.6 碰撞事件

  •  碰撞响应事件

  

 

  • 重叠事件(分为进入堆叠和退出堆叠)

 

  •  撞击事件

 

 

5.7 物理追踪

  • 物理追踪是指引擎运行状态下,使用线或是形状与场景物体产生交互,并将交互结果进行反馈,以达到动态产生物理交互响应的目的。
    • 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 数组的遍历
      • 遍历:将容器中的元素进行逐一获取
      • 两种遍历方式:使用ForLoop通过下标获取;使用ForeachLoop快速遍历

 

    • 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)
    • 优点:方便其他项目使用,不用重新加载
    • 缺点:迁移项目时要格外注意插件,将第三方插件拷贝复制

 

 

 
posted @ 2022-12-12 10:25  哟吼--小文文公主  阅读(2195)  评论(0)    收藏  举报