关卡编辑器
基本功能
1.选卡条菜单条(指向性操作,现实关卡名称和菜单项内容)
2.工具条(提供常用工具的快速访问)
3.模式(编译器工具模式的快速入口)
4.视口(舞台,用来编辑器场景或是资产)
5.世界大纲视图(展示了当前关卡中所有的Actor)
6.内容浏览器(包含了当前工程的所有资产)
7.详细信息(展示了当前选中的Actor的设置参数信息)
支持
支持格式
3D:fbx、obj
贴图:png、jpge、bmp、tga、dds、exr、psd、hdr
声音:wav
字体:ttf、otf
视频:mov、mp4、wmv
光源
1.定向光源 无位置信息,有照射方向信息。所有的阴影照射均是平行效果,一般用来模拟太阳光
2.点光源 如同真实世界中的灯泡,发光模式向各个方向均匀发光。随着距离出现衰减。一般可用来制作无照射方向的光源
3.聚光源 以锥形空间为照射模型,朝着锥桶方向进行均匀照射,随着距离进行衰减。用作手电筒,探照灯,汽车灯光等带有光束特点灯光
4.矩形光源 从一个定义好宽度和高度的矩形平面向场景发出光线。您可以用它来模拟拥有矩形面积的任意类型光源,如电视或或显示器屏幕、吊顶灯具或壁灯。
5.天空光照 获取场景中一定距离以外的部分将他们作为光照应用于场景。例如远处的大气,云,或是群山。天空光需要重建光照信息,才会进行捕捉计算
光源移动特性
1.可移动光源 产生完全动态的光源和阴影,消耗较大,运行时光源的大部分信息均可被修改
2.静态光源 指在运行时态不可以做任何改变或移动的光源。静态光源效果只应用于光照贴图计算,只影响静态物体。静态光源消耗最低。一般用于移动平台,用途非常有限。
3.固定光源 固定位置不变的光源,但是光源其他信息可以被变更(颜色亮度信息)。固定光源会产生阴影。
光照模式分类
1.直接光照:光源本身发射,直接照射到物体表面,体现的光照结果
2.间接光照:光源照射到物体表面,通过反射关系产生的光照我们称之为间接光照
间接光照是真实世界的光照重要组成部分
间接光照缓存
全局光照可以生成静态物体上的间接光照信息,但是场景中的动态对象,也需要一种接受间接光照的方法。这种方法就是间接光照缓存。
重要光照体积
可以将光照信息精细化计算。我们在场景中可以运行到的或是移动的地方是有限的,我们只需要关心我们可以到达的地方有高质量的光照,其他区域不需要进行精细光照计算。LIV可以帮助我们调整发射光量子范围,允许我们集中在需要详细间接光照的区域进行收集,而在重要体积外的地方我们获取低质量的间接反射光照即可。
固定光源
固定光源产生直接光照和间接光照,也就是固定光源可以动态产生阴影,并且带有光照贴图。固定光源效率折中,质量最好,中等可变性,中等性能消耗。在运行时态调整固定光源仅会影响直接光照,无法影响间接光照。
蓝图
蓝图的概念
蓝图是虚幻4中的一种可视化编程语言。他具备传统编程语言的特点,同事具备简单易读,易用,易理解的特性。
蓝图种类
1.关卡蓝图
2.对象蓝图
3.动画蓝图
4.组件蓝图
5.UMG蓝图
6.GameMode蓝图(属于Actor对象蓝图)
7.GameState蓝图(属于Actor对象蓝图)
8.PlayerCotroller蓝图(属于Actor对象蓝图)
9.等
Actor蓝图
Actor(演员)是一种基本类型的对象,虚幻中将场景的所有对象体均定义为是一个Actor,他是虚幻框架的重要组成概念。我们可以假定为世界中的花、草、树、石头、房屋、灯光、人、车等都是Actor。虚幻中规定,能存在于场景中的物体需要从Actor进行扩展衍生。我们可以将Actor直接放到场景中,也可以在世界中生成Actor。
蓝图编辑器
1.菜单栏2.组件结构3.工具栏4.常规操作视口5.蓝图信息6.细节面板
输出日志
日志可以帮助我们提供运行时态的程序信息,并进行输出。我们可以通过日志查看对象状态,以反馈数据内容(一般数据内容是不具象的)。
例如目前玩家的移动速度,我们只能观察快慢,但是无法形象说明到底多块多慢(无法直观看到数据)。则我们可以通过日志进行速度输出,就可以直观的看到某些内在数据。
蓝图名词
1.蓝图节点(逻辑节点,函数节点)
2.在节点右边叫逻辑输出针脚,左边叫逻辑输入针脚。注意逻辑针脚都是白色
3.输入参数针脚
4.逻辑执行线是执行线
5.输出参数针脚
Print节点
Print节点,可以将数据信息输出到控制台,屏幕,日志文件中。是蓝图中日志输出的主要节点。
输入针脚解读:(API解读)
1.In String 日志文本内容
2.Print to screen 是否输出到屏幕
3.Print to Log 是否输出到控制台(是否输出到日志文件)
4.Text Color 屏幕输出颜色
5.Duration 屏幕持续时间
日志奇用途
我们可以使用日志来判定当前逻辑是否执行。
3D数学
向量
解决的问题:
1.位置时朝着哪里移动
2.发力时朝着哪里发力
3.目标在我的哪个位置
4.将自己的正方向指向目标
5.判断目标是否朝着某一个方向
6.判断点是否在线段上
7.判断点是否在一个平面上(平面记做垂直法向量加常量)
8.判断点是否在一个平面上(平面记做两个向量)
蓝图数据
数据类型
数据类型按照数据复杂度可以分为基本数据类型和复合数据类型
复合数据类型是通过使用基本数据类型进行二次组合获得
基本数据类型:
布尔、字节、整型、浮点型,其他数据类型均为复合数据类型。
布尔型:0和1
字节型:最小的整形数据值,用来描述一个整数,值域范围是0-255
整型:描述整数
浮点型:描述一个非整型数
字节型和整型:编码时需要考虑内存占用情况,在一些数据设定时我们可能不需要过大的数据类型,例如人的年龄,一年的月份数量,一月的天数,这些数据本身均无法超过255,则我们在选定数据类型时可以使用字节型数据,以节省内存开销。
声明和初始化
声明的定义:当一个计算机程序需要调用内存空间时,对内存发出的“占位”指令,称为”声明“。
初始化:就是把变量赋为默认值,把控件设为默认状态,把没准备好的准备好。
基本运算
注意:节点是一个整体,完成的是一个单一运算,与其他无关。节点完成运算,才可以进入下一个节点。
赋值和获取
每一个变量均有对应的Set和Get节点,通过调用节点即可为变量进行赋值或获取变量。
注意:变量的获取必须在有效的操作范围内。
例如:声明的对象内部(蓝图内),或是在外部时,需要先持有此变量所在的对象引用,才可以操作。
整形的自增和自减
整形数据存在特殊操作节点,即自增自减。蓝图中的自增自减只是进行了加减以的便捷操作。
取余运算
例如使用取余运算一个整数是否是偶数,或是使用取余运算横纵向排编号问题,或是将一个数进行数位分解。
流程控制
流程控制节点,是虚幻中用来编写逻辑分支的重要节点。蓝图逻辑是线性的,但是线性逻辑是无法将真实逻辑进行表示。
蓝图中的流程控制语句可以帮助我们改变线性程序的流程,增加更多的操作分支。
Branch分支
分支,在蓝图中的作用是通过给定的布尔值,裁定是否向某个分支执行,执行结果二选一。
分支是重要的逻辑判定节点,程序中的大部分逻辑都是选择逻辑。
如果给定的条件为真,则真的逻辑输出针脚获得执行权,反之则假的逻辑执行针脚获得执行权。
条件(Condition)可以通过声明布尔变量获得,或是通过关系运算符(或是逻辑运算符)获得,或是通过特殊节点返回获得。
关系运算符
关系运算符将两个数值数据进行关联,运算结果返回的是布尔值。
一般整型,浮点型,字节型数据均存在关系运算符操作节点。
关系运算符运算结果是布尔值。
逻辑运算符
逻辑运算符的目的是将多个条件进行累加,也就是逻辑运算符解决的是布尔值之间的关系。
流程控制
Sequence(序列)
序列,允许逻辑执行线进行分割,但并不是并行关系,而是次序关系,最上层位于运行上端,以此类推。
序列支持多个次序执行线并存,通过添加引脚来添加次序执行线
序列中的逻辑执行针脚是按照顺序依次执行
序列的目的,用来帮助我们将逻辑进行划分,我们可以将自己的逻辑分成几块,从而不必非要串联到一条逻辑线上,达到清洗逻辑结构的目的。
Do N&Do once
Do节点用来控制当执行逻辑线进行连接后,是否可以通过输出逻辑针脚将逻辑执行权向下传递,主要目的用来控制执行权通过次数。
Do Once只可以进行以此执行权通过,通过调用Reset可以重置通过限制。Start Closed,设置节点开始是关闭的,无法使用的,必须通过调用Reset针脚激活节点。
Do N可以根据给定的输入参数N来决定执行权通过次数,其中输出参数针脚Connter将当前次数进行返回,如果想要重置节点,则需要调用Reset阵脚进行重置。
Do N可以用来制作开枪,例如又得枪里面装了20颗子弹,那么只能发射20次。有的武器只能发射一次,那么可以使用Do Once。游戏设计中,经常会有类似的问题,只允许执行以此或是几次。
Do once Multilnput
Do once Multilnput节点与DoOnce节点基本相同,但是可以通过添加新的引脚,增加对应的输入逻辑,只要任意逻辑输入针脚有调用,则整个节点被关闭。通过调用重置输入针脚重置整个控制节点。
例如:新加入针脚B,A输入逻辑针脚有执行权调用,那么B输入逻辑针脚再调用将无法将执行权通过输出针脚进行输出。
FlipLoop
节点取如执行输出并在两个执行输出间切换。其第一次被调用时,将会输出A。第二次被调用时,将会输出B,然后再试A,然后又是B,循环往复。该节点同时有布尔变量输出,使您可以追溯输出A何时被调用。
使用场景:开关灯
ForLoop循环
此节点,如果被加入到执行逻辑队列,则会按照从First Index开始,到Last Index为止,调用输出逻辑引脚Loop Body,调用次数为First Index到Last Index差值(包含首位)。Index输出参数引脚将输出从开始到结束的所有整数。当整个节点执行完成,则调用逻辑输出引脚Completed。
注意:此节点调用一次,就会按照给定的开始和结束之间的差值执行多次。例如First输入5,Last输入10,则Loop输出针脚会调用6次。
常用语叠加计算,或是多次执行某一个动作。
ForLoopWithBreak循环中断
与ForLoop相同,用于将单次执行逻辑进行循环。但在其基础上增加了Break输入引脚。目的在于打断整个循环。如被打断则直接停止循环,直接跳到输出逻辑引脚Completed
Gate门
Gate门,用来控制开启和关闭执行逻辑。
Enter输入逻辑进入
Open引脚被调用后,Enter引脚流入的执行逻辑才会从Exit引脚流出
Close引脚被调用后,Enter引脚流入的执行逻辑将被阻扰,无法流出Toggle从开和关之间进行往返
Start Close设置节点开始时状态,勾选后开始后为关闭状态
MultiGate
输入逻辑节点将按照顺序或是随机方式从右侧输出引脚进行输出执行逻辑
Reset重置整个节点状态,使之恢复到起始状态
Is Random勾选引脚,则按照随机的方式从右侧输出引脚选择输出执行逻辑
Loop勾选引脚,则按照循环方式从右侧输出引脚输出执行逻辑
Start Index设置第一调用节点从右侧哪个引脚进行输出
注意:此节点将会把输出逻辑引脚以此全部进行以此输出(除非勾选Loop)
WhileLoop
只要特定值为true,则WhileLoop节点将会输出一个结果。在循环的每个迭代中,它会查看其输入布尔值的当前状态。一旦它读取到false,该循环中断。
切换Switch
切换,当逻辑输入引脚被调用时,将会按照给定的值(Selection)进行右侧选择引脚输出。类似选择。
Delay
Delay节点,延时操作。当延迟任务未完成时,再次调用节点,忽略调用。尽量不要将Delay节点放入Tick中。Delay只能在事件图表中使用。
Duration延时动作持续时间
Retriggerable Delay与上面的节点一致,至少如果当延迟任务没有完成时,再次调用节点,则延迟动作重新计时。
面向对象
函数的输出和输入
函数用来梳理逻辑结构,那么难免要处理数据和提供数据。输入值就是为了对接外界提供的数据入口。函数中输入参数可以是多个,类型为当前工程中的所有数据类型。
函数将处理好的数据可以通过输出的方式进行返回,提供给外界进行使用。蓝图函数可以提供多个返回值。
纯函数
纯函数一般用于获取类的一个成员数据,无修改类属性的意图。纯函数无法连接到逻辑执行线(无逻辑输入针脚),只能依赖其他节点的属性输入针脚进行连接使用。每个连接到纯函数上的节点,都会调用一次纯函数。
访问修饰符
公共:public
受保护:protected
私有:private
局部函数
局部变量:在函数内才可以看到。当函数被调用时,局部变量被创建,当函数调用结束时,变量生命终止。局部变量是作用在函数内的变量。
一般我们构建局部变量的目的是为了将中间计算数据用于临时保存,而非长久保存。
事件
Event事件只能在事件图标中进行构建,无法在函数内,宏内进行构建。事件如函数一样可以在外部被调用,支持输入参数列表编写。
事件和函数的区别
函数内部无法使用Delay节点,事件可以
函数可以由返回值,事件无返回值
函数具备局部变量,事件不具备
事件可以被标记为网络同步,函数无法被标记网络同步
事件可以被绑定到事件调度器,函数不行
宏
宏本质不是程序单元,与函数不同(函数会被编译为执行单元)。宏本身进行的是节点替换。过量使用宏会导致程序的节点量膨胀。
宏的优点:支持多逻辑针脚输入,并支持多逻辑针脚输出(宏本质不会被编译为逻辑单元,这并不与程序本身相违背)。与普通蓝图函数一样,支持参数列表输入,和支持参数列表输出,但是宏支持通配符传入传出,可以使得类型传递更加灵活。
本地数据类型
本地数据选择可以帮助我们在宏中构建参数逻辑,而本地数据将会根据宏调用的位置转换为对应的数据类型。在函数中调用宏,本地数据将变成局部变量,在事件图标中调用宏,本地数据将变成成员变量。
本地数据节点,可以帮助我们将一段逻辑在多处调用,但是每段逻辑都需要构建一个新的参数数据,这种问题函数无法解决,但是宏可以帮助我们解决。
宏和函数的区别
两者均可以重复被调用,均进行封装重复使用
宏是逻辑节点替换,函数不是
宏支持多逻辑针脚输入,函数不可以
宏不会成为编译单元,函数会
过多使用宏将导致蓝图中节点膨胀,函数由于被编译成逻辑单元,所有调用的地方均使用一个逻辑单元,因此不会膨胀。
宏无法被重写,函数可以被重写(宏无形的,函数是有形)
函数和宏均可以构建无执行输入输出针脚的节点,但是函数本质是纯函数,宏本质是替换操作
类内部宏无法在外部通过成员对象调用,函数可以
注意:不建议使用宏编写复杂逻辑,可以借助宏的特点(支持多执行针脚输入)编写灵活的分支流程控制
实例
创建Actor
通过直接将蓝图模板拖拽到场景中即可生成蓝图对象实例(此种方式为编辑模式确定,不具备灵活特性)
通过调用生成节点SpawnActor进行动态生成(动态生成对象具备灵活特性,但是无法如编辑模式提前做好更多的数据调整)
切记,所有的对象类型变量使用前均需要通过IsValid节点进行安全检查,增加程序的稳定性。
IsValid节点接受一个对象型(Object)数据。
查找Actor
Of Class通过给定的对象模板场景中与之匹配的对象进行查找,并返回查找到的所有对象。
With Interface 通过给定的接口将场景中与之匹配的对象进行查找,并返回查找到的所有对象。
With Tag 通过给定的表桥将场景中与之匹配的对象进行查找,并返回查找到的所有对象。
事件调度器
事件调度器是蓝图中按照观察者模式(订阅)而添加的。观察者模式较常用的一种设计模式!他具有高效低耦合的特性!在整个设计链上,采用有动态这状态改变时主动发出通知,从而达到订阅特性。
观察者模式应当构建对象,应该将对象想象为观察者和被观察者。
蓝图事件调度器构建
在蓝图中我们可以找到事件调度器,然后进行创建。
事件调度器允许我们进行参数通知(将数据带给订阅者),可以在细节面板中填写。
绑定事件调度器
在订阅者身上添加订阅绑定事件(右图是在关卡蓝图中操作),绑定需要持有被订阅者(事件调度器持有者)引用方可绑定。
绑定需要提供事件,事件构建后会和调度器的签名结果相同(调度器参数个数类型和事件的相同)。
注意:事件ToggleLight可以主动调用,但是一般我们不会调用,调用由调度器持有者完成。
调度器支持多个事件绑定
执行调度
在调度器持有者内部,进行调用,即可完成,所有绑定到调度器上的事件均被调用。
结构体
由一系列具有相同类型或不同类型的数据构成的数据集合。是一种数据结构。旨在描述一种对象的属性集合。定义了数据模板。
蓝图中的结构体只有属性,无函数,与传统编程中的结构体有差异
我们遇到的结构体:Transform变化,Vector向量,Rotator旋转,Color颜色
构建结构体拆解结构体
Make结构体名称,可以帮助我们将结构体进行快速的构建
在任意结构体输出引脚,或是从结构体上引出数据线,均可以将结构体进行蓝图快速操作拆解
枚举
列出某些有穷序列集的所有成员的程序。这种类型数据会出现重叠
例如:性别、月份、学历、职业
我们经常使用枚举将对象数据进行分类,例如正义阵营,邪恶阵营。
枚举使用
根据枚举的特性(有穷序列集合),我们可以使用枚举进行罗列数据分类项。并借助Switch节点,进行选择器构建。根据输入引脚值,在右侧输出逻辑引脚执行对应的输入项。
容器
容器是数据结构中重要的组成部分,容器可以帮助我们快速存储和整理数据,使得数据按照给定的规则(容器特性)进行有序的存储。虚幻引擎我们提供了三种容器,三种容器根据容器的特点各不相同
Array容器,Map容器,Set容器
Array:
一种可以自动变化大小的容器,容器内只能存储同一种数据,我们也称之为同质容器。Array是我们最常用的容器。
Map:
具有键值的同质容器,对于元素操作需要依靠键值,键值是Map的操作标签。键值类型可以是蓝图常规对象类型。
特点:元素类型必须相同,键值唯一。也就是加入相同键值元素将被覆盖。
应用场景:游戏中的背包栏,技能栏,装备槽
Set:
键值类同质容器。键值和元素相同,本身对键值操作隐藏。操作标签即为元素本身,即如果想要操作Set中的内容,需要先知道元素。这与其他两种容器思考方式完全不同。
应用场景:游戏中的聊天辱骂过滤,创建名称敏感词检索,特殊道具持有检查。
物理系统
碰撞设置
添加简单形状碰撞
打开静态网格编辑器,在碰撞下拉菜单中找到形状添加,虚幻提供三种简单的形状碰撞器,球体,胶囊体,盒体。
虚幻允许一个物体具备多个碰撞器
添加K-DOP简单凸包碰撞
K-DOP是包围体的一种,是K离散导向多面体的缩写。它抓取轴对齐的平面,将其尽力推向离网格体最近的位置。
10-方块有4条边形成斜角-可选择X、Y或Z轴对齐的边。
18-方块中所有边均形成斜角。
26-方块中所有边和角均形成斜角。
添加自动凸包碰撞
自动凸包包裹也属于简单碰撞包裹,通过程序进行计算获得包裹数据信息。需要调整凸包顶点最大数量
凸包数量:决定了包裹物体需要使用的凸包个数,越多越精确,消耗也越大
最大外壳顶点数:每个凸包最大允许使用多少个顶点
凸包精确度:使用多少模型面做计算参考,数量越大精度越大
添加复杂碰撞
Default此设置“默认”使简单碰撞请求使用简单碰撞,复杂请求使用复杂碰撞。引擎默认使用的SAC模式。
Simple And Complex创建简单和复杂的形状。简单形状用于常规场景查询和碰撞测试。复杂形状用于复杂场景查询。
UseSimpleAsComplex如请求复杂查询,引擎仍将查询简单形态,无视三角网格图。这有助于节约内存,因为我们不需要烘焙三角网格图。如果碰撞几何体更简单,则可增强性能。
UseComplexAsSimple如请求简单查询,引擎将查询复杂形态,无视简单碰撞。该设置可将三角网格图用作物理模拟碰撞。注意:如果您使用的是UseComplexAsSimple,则无法模拟物体;但可将其和其他模拟物体进行碰撞
物体类型
虚幻中使用物体类型来描述碰撞关系。虚幻中只提供了少量的物体类型。我们可以在碰撞设置中进行添加。虚幻允许我们额外添加18中碰撞物体类型。
踪迹类型
用来响应和射线之间的交互关系。虚幻中默认提供两种踪迹类型。我们可以自定义添加更多踪迹类型,虚幻最多允许额外添加18哥踪迹类型。
碰撞预设描述面板
在碰撞预设描述面板中我们可以调整物体之间的碰撞关系,包括当前预设提供给的物体的对象类型,碰撞的方式,响应方式,踪迹类型
踪迹类型:当前物体与射线发生关系方式
对象类型:当前对象类型与其他对象类型发生的关系方式
已经启用碰撞
No Collision 没有任何碰撞信息产生,并且没有物理碰撞结果
Query Only 只会产生碰撞通知,但没有物理效果
Physics Only 只会产生物理通知,不产生碰撞通知(堆叠通知)
Collision Enabled 即会产生碰撞通知,又会产生物理效果
碰撞预设
虚幻引擎中加入了多种碰撞预设,帮助我们快速确定场景中物体的物理碰撞关系,可以使用碰撞预设解决大部分碰撞关系问题。
碰撞预设可以在项目设置的Collision中查找到。
碰撞响应
碰撞响应事件
虚幻中的碰撞响应分为忽略,堆叠,阻挡。与之对应的事件我们均可以获得到。常见的StaticMesh组件,Collision组件均具备通知事件。并且可以调整组件的碰撞预设,或是自定义碰撞预设。以达到响应碰撞的不同结果。
重叠事件
重叠事件分为进入堆叠和退出堆叠,在虚幻中,如果希望获得堆叠事件通知,需要满足一下条件。
双方勾选生成堆叠事件通知
物体有碰撞包裹
碰撞预设中物体之间的碰撞方式为重叠
撞击事件
撞击事件产生的必要条件
希望接受事件通知方勾选生成撞击事件
双方任意一方开启物理模拟
双方具备碰撞包裹
碰撞预设中物体的碰撞关系为阻挡
物理追踪
追踪方式
虚幻中的物理追踪是指引擎运行状态下,允许我们使用线或是形状与场景物体产生交互,并将交互结果进行反馈 ,以达到动态产生物理交互响应的目的。
线性的检测(射线检测)
形状检测(球,盒子,胶囊)
射线检测
射线检测分三种方式,一种是通道检测,一种是预设检测,一种是物体类型。检测的方式主要区别是用来筛选目标。
检测分为单检测和多个目标检测
预设射线检测
使用预设关系进行碰撞检测,需要填入预设名称。
注意:射线使用预设如同物体之间预设关系一样,如果希望被射线检测到,需要保证射线预设物体类型,和希望被检测到的物体类型之间的响应关系为阻挡,方可被检测到。
物体类型射线检测
将希望被射线检测到的物体类型构建成为数组进行填入,并且只与类型匹配的物体产生交互关系。
添加力
虚幻中的力
在虚幻中,力的作用方式分为两种:一种是冲力,一种是推进力
区别:
冲力:瞬间力,作用结束后直接施加给物体,修正物体在物理引擎中的运动表现。
推进力:单帧作用力,当前帧力效果施加后,如下一帧不存在推进力,则作用力无效果。推进力是持续增加力,随着时间推演作用力累加。像是火箭推进器。
只有开启了物理模拟的物体才能受到力的作用。
冲力
直接将冲力作用在物体质心,给定一个向量,描述方向和力的大小。
物理材质
物理材质描绘了物体表面的物理特性,例如摩擦力,弹性,密度等信息。
物理材质可以在物体的内容浏览器的物理中进行添加。在物体的碰撞设置中进行设置。
物理材质表面类型
在物理材质中,我们可以设置物体的物理表面类型,用于区分物体的表面主动响应逻辑交互方式。例如,子弹打到木质的墙面和打到岩石发出的声音是不同的,我们可以通过使用物理材质表面类型来区分碰到的物体表面是什么。
在项目设置中,我们可以添加物理表面类型,虚幻允许我们添加最多62哥自定义表面类型