导读:虚幻引擎 4 学习笔记 [1] :蓝图编程 Demo. 最近学习虚幻引擎,主要看的是 Siki 学院的课,课程链接:Unreal蓝图案例 - 基础入门 - SiKi学院|SiKi学堂 -.unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程
最近学习虚幻引擎,主要看的是 Siki 学院的课,课程链接:Unreal蓝图案例 - 基础入门 - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程 (sikiedu.com)
以下为课程笔记:
选择蓝图,不带初学者内容包
添加初学者内容包,可以使用一些里面的材质,纹理
将该物体长度拖到 2000 ,调回放置模式,按 alt 快捷复制三个一样的板块,中间间隔 1000
在 Brush Editing 模式下拉长墙面
在放置模式下复制墙面:
添加文件夹进行规整:
使用 Edit 和 Extrude,使用 Edit 来使板子倾斜,利用 Extrude 可以增加一些拐角和轴,使用时点击 Actor 的面
选择模式下复制做好的独木桥,并将其旋转后拖入第二个空隙
1)选中想要添加的材质,点击左箭头符号直接运用
2)点击 Surface Materials 里的下拉框搜索相关材质,然后运用
点击 Select All Ajacent Surfaces 将选中材质附加到当前 Actor 的所有面
运用后发现砖块材质过细,选中该 Actor 的所有面,将缩放调为 8 倍,点击 Apply
使用相同的方法为另一边城墙附加材质
1)通过三视图调整火焰的位置
2)调整火焰的角度
1)调整参数
2)调整点光源位置使与火焰同一位置
* 直接拷贝位置
* 手动调整位置
选中所有需要转换的物体,点击 Blueprints -> Convert Selection to Blueprint Class…
1)随机右键一个区域,输入想要创建的结点,进行连线
2)从 M_Crystal 里直接拖拽出来一根线
3)从 Palette 目录里拽出一个结点
4)在某些结点边上会写上快捷键,如:按住 3,鼠标左键点击一下就会创建一个结点
注意 :按 alt 再左键点击一条线可以断开该线
点击 Apply,点击 Save
1)在水晶蓝图类内部添加点光源的组件
2)设置点光源的参数
设置旋转速度:
插值函数 Lerp :Alpha的数值范围是0到1。
if(Alpha==0) ReturnValue=A
if(Alpha==1) ReturnValue=B
如果Alpha在0到1之间,Alpha值越接近0则ReValue的值越接近A,Alpha值越接近1则ReValue的值越接近B
由于需要通过时间轴的返回值来设置 Alpha,所以选择浮点值:
水晶飞过来的值设置为 0.75
点击全窗口展示
也可以右键使该直线变为曲线:
添加 GetActorLocation 函数,该函数实时获得水晶的位置,由于水晶一直在移动,所以水晶最开始的位置需要用一个变量暂存:
* 右键 Return Value,选择 Promote to Variable 创建一个变量
* 连线,使运行时间轴之前保存水晶的位置:
* 最后将保存的水晶的最初位置输入 Lerp 插值函数的 A 处
这样看起来线太复杂,也可以直接获取变量值再连接,获取变量的值的方法如下:
* 将左侧的变量直接拖出到 A 处可以自动连上
* 将变量拖到空白位置,选择 Get,手动连线
* 按住 alt 键,拖出变量直接是 Set
* 按住 ctrl 键,拖出变量直接是 Get
大小变化
添加 Lerp 插值函数,通过 Alpha 的值来决定返回值
添加 Set Actor Scale 3D 函数来设置水晶的大小
亮度变化
1)添加组件:SpringArm,即类似于相机杆,将其移动到球体中心
设置
2)添加组件:Camera,一般添加后会自动吸附到 SpringArm 上,如果没有吸附的话,可以调整坐标都为 0,即之后会自动调整
3)调整视角
4)调整摄像机距离钢球的长度
5)设置 Spring Arm 相对于世界 60 度,而不是相对于小球 60 度,防止之后视角随小球滚动而滚动
6)关闭相机的碰撞:
1)按 esc
2)按 shift+F1 跳出 ViewPoint 的控制,点击 Possess or Eject Player 回到可以编辑的模式
1)直接将 Auto Possess Player 设置为 Player 0 (不推荐这种方式)
2)利用 Player Start 设置玩家起始位置,然后在游戏运行时虚幻引擎会在 Player Start 的位置自动生成一个指定的 Pawn,然后让 Player Controller 去持有 Player
* 放置一个 Player Start,手动调整使其贴地,也可以放在空中,然后按下 fn+end
* 自定义 GameMode:创建一个蓝图类,设定父类为 Game Mode Base
将 Default Pawn Class 设置为 BP_Player
* Project Settings -> Maps & Modes ->Deafault GameMode 设置为自己的 BP_GameMode
控制玩家移动:设置 BP_Player 的事件
1)将默认的三个事件全部删除
2)两种接收键盘输入的方式:
绑定按下的函数:
这样的弊端 :按下 w 只调用一次函数,并不会一直执行,而是按一次显示一次,所以这种方法不推荐
添加键盘映射:
在蓝图内添加轴映射的结点
右键 Torque 选择 Split Struct Pin 将 x y z 值分开
注意:按住 B + 鼠标左键点击一下就可以放置一个分支
当小球掉落时,添加一个从 0-1 的渐变过程
当游戏开始时,添加一个从 1-0 的渐变过程
通过勾选或直接右键 Emitter->Delte Emitter 将电火花删除
选择不创建材质
控制内容浏览器中预览图的大小:按住 ctrl + 鼠标滚动
编辑预览图中的物体:View Options -> 勾选 Thumbnail Edit Mode,然后像操作视口一样操作预览图中的物体
箭头的基部作为炮弹生成的地方,箭头的方向即为炮弹发射的方向
双击连线可以重定位结点
注意:
* 动画从开始播放:Play from Start
* 播放完成后再发射子弹
问题:延时 1 秒 + 动画 0.3 秒时间变长了
达成效果 :先生成子弹再播放动画
达成效果 :解决延时 1 秒 + 动画 0.3 秒时间变长了的问题
开火特效
将相同操作收缩为一个结点,相当于创建了一个文件夹放入这些类似操作
注意 :该方法不能实现代码复用,不常用
函数缺点 :具有多个执行流输出的不适合收缩为函数
蓝图宏库 (Blueprint Macro Library) 是一个容器,它包含一组 宏 或自包含的图表,这些图表可以 作为节点放置在其他蓝图中。它们可以节省时间,因为它们可以存储常用的节点序列, 包括执行和数据传输所需的输入和输出。
宏在引用它们的所有图表之间共享,但是它们会自动扩展到图表中, 就像它们在编译期间是一个折叠节点那样。这意味着蓝图宏库不需要编译。但是, 对宏的更改仅反映在重新编译包含这些图表的蓝图时 引用该宏的图表中。
蓝图宏库
1)创建文件夹:Library
2)添加蓝图宏库
将 Default 的标签改掉:
纯净函数 :绿色结点,不改变游戏的状态,如:单纯的计算某个东西的值
非纯净函数 :蓝色结点,改变游戏的状态
将投射改为纯净投射:
删除输入和输出结点的执行线:
全局查找使用该宏的地方,修改连线
创建蓝图类:BP_SpotlightFollow
添加碰撞盒子组件
Interp To 函数 :插值,在两个数之间补充一些数,让过渡变得更自然
常见的插值函数:
FInterp To、FInterp To Constant:浮点数(Float)插值。F:Float,浮点数
RInterp To、RInterp To Constant:角度(Rotation)插值。
RInterp To | Unreal Engine Documentation
输入参数 :
参数 | 值 |
---|---|
CurrentRotator | Actual rotation |
TargetRotator | Target rotation |
Delta TimeFloat | Time since last tick |
Interp SpeedFloat | Interpolation speed, if the speed given is 0, then jump to the target. |
InterpSpeed = 1 / Time = 2 Time = 0.5
输出值 :
| 值
Return ValueRotator | New interpolated position |
带有 “Constant” 的,表示匀速插值(线性插值);没带有 Constant 的,表示缓冲插值(非线性插值),到达终点值的时候放慢,有一个更平滑的缓冲,给人的感觉更柔和一些。
Find Look at Rotation :找到目标对象相对于当前对象的旋转角度
将拉出的面抬高做成一个台子
UE4 中GameInstance、GameMode、GameState、PlayerState和PlayerController的关系 :
名称 | 生命周期 | 存在的位置(服务器或客户端) | 服务端和客户端是否能同步 | 使用方式 |
---|---|---|---|---|
GameInstance | 引擎启动时创建,引擎关闭后销毁或更换 | 都存在 | 不能,服务器和客户端时独立的,彼此不通信 | 在多关卡中来回切换,需要一个公共的变量来进行记录所需要的数据,进行数据交互。GameInstance类就充当这个全局类来记录全局数据。 |
可以用来保存特定类型的持久数据,如用户账户信息
GameMode | 关卡加载时生成,销毁时一起销毁 | 仅在服务器 | 无此说法 | 存储客户端不需要明确知道的游戏信息,如出现的玩家和观众数量,以及允许的玩家和观众最大数量。
玩家进入游戏的方式,可包含选择生成地点和其他生成/重生成行为的规则。
游戏是否可以暂停,以及如何处理游戏暂停。
游戏是否可以暂停,以及如何处理游戏暂停。
关卡之间的过渡,包括游戏是否以动画模式开场。
GameState | 关卡加载时生成,销毁时一起销毁 | 都存在 | 可以,服务器可以在GameState上使用复制变量让所有客户端保持最新的游戏数据 | 与所有玩家和旁观者有关、而不是与任何一个特定玩家有关的信息,如
游戏已运行的时间(包括本地玩家加入前的运行时间)。
每个个体玩家加入游戏的时间和玩家的当前状态。
PlayerState | 关卡加载时生成,销毁时一起销毁 | 都存在 | 可以,服务器可以在GameState上使用复制变量让所有客户端保持最新的游戏数据 | 与一个特定玩家有关的信息,如玩家的分数
PlayerController | 关卡加载时生成,销毁时一起销毁 | 服务器上每个玩家都有PlayerController,但本地客户端只有本地玩家的PlayerController | 客户端和服务器之间传达信息,而不必将该信息复制到其他客户端 |
创建蓝图类 BP_Wintrigger
添加碰撞盒子
获得 GameInstance (父类),将其投射为 BP_GameInstance
将此操作封装为宏:
注意 :在 UI 函数中不能调用宏库中的宏
可以将其封装为本地的宏:
将此段逻辑收缩为函数:
关卡蓝图 :每个关卡有且仅有一个
1)在 BP_Player 中添加一个函数 AdjustCamera
2)在关卡 2 的蓝图中调用 BP_Player.AdjustCamera 调整悬臂的长度
3)调整后视角如下
收缩为纯函数:
收缩为纯函数之后没有多余针脚,所以需要进行设置:
将其中用来查找当前关卡索引的逻辑收缩为函数:
将 GetLevelIndex 设为纯函数:
如果不是最后一关,则自动加载下一个关卡
1)直接双击点开 Cave1 和 Cave2 进行设置:勾选 Looping 循环播放
2)在关卡蓝图中设置播放背景音乐:
1)创建声音衰减模板
2)使 Collection_Cue 和 Fire_Cue 使用刚刚创建的声音衰减模板
3)设置声音衰减模板
1)水晶:粒子特效
2)加农炮:开火
发布的配置:
上一篇:产品代码都给你看了,可别再说不会
下一篇:大佬们 有没有unity游戏开发