UE4学习笔记15——【蓝图】角色控制权切换;上下车
- P45. 多个角色控制权切换
- P46. 角色上下车功能
- P47. 下车减速功能
- P45
首先把场景中的“player start”和“ThirdPersonCharacter”(小白人)都delete
把“ThirdPersonCharacter”蓝图类放5个到场景中;在右侧“世界大纲视图”中选中这5个 ThirdPersonCharacter,然后点上面工具栏中的“蓝图——打开关卡蓝图”;把新界面缩小,把关卡编辑器 “世界大纲视图”中的5个 ThirdPersonCharacter 拖到蓝图时间图表中:
添加节点“Multigate”(搜索gate能找到),“获取玩家控制器”(然后从此节点拉出来一条线,添加“控制”节点),
连线:
连完线之后,回到关卡编辑界面,点一个我们想用的初始小白人(哪个都行),把他的“自动控制玩家”改成 玩家0
(目前为止,运行之后的出现的问题是:当从第一个小白人依次轮换再一次回到改成“玩家0”的小白人之后,就切换不了角色了)
——————————————————————————————————
针对上面出现的问题,那怎么重置呢?
“multigate”节点中:
“reset”引脚可以重置(前面可以连一个按键,或者一个自定义事件(某个事件发生了自动重置)等等);
“is random”如果没打勾,则角色切换是按顺序的;打勾之后是随机切换(这个随机不会重复);
“loop”打勾,则按下相应按键或相应事件发生之后,从0~4循环切换(每次切换1个,不会按一次一直切换);
右边的“添加引脚”可以给multigate添加输出引脚
从“获取玩家控制器”拉出一条线,添加节点“使用混合设置视图目标”(搜索 set view)
“使用混合设置视图目标” 和 “控制” 节点的使用顺序问题:
应该先用“使用混合...”节点,再用“控制”节点;因为如果先用“控制”节点,视角就直接切换到新的角色身上去了,所以先用“使用混合...”,再连接一个和“blend time”相等时间长的“延迟”节点,再连到“控制”节点
“使用混合设置视图目标”引脚说明:
“new view target”:新的视角到哪个蓝图类(选一个 ThirdPersonCharacter 连到这个引脚)
“blent time”:从当前画面到新的画面,这个过程打算花多少时间
“blend func”:渐变方法(由慢而快,由快而慢,线性,或者其他一些改变视角的方式)
但是如果用户高频按键切换角色,这个切换动画可能会出现问题,所以我们要加个判断:新建一个bool型变量用来判断,默认值为false,添加一个分支:当值为false时执行切换角色的一系列操作,进入执行后把值改为true,并在切换角色完成后把值改为false;值为true时不执行切换角色操作
最终连线(一共有5个 ThirdPersonCharacter,由于图片太大我只截了3个):
因为线连的太乱了,文字说明一下“multigate”之后的连线:out0~4分别连5个“使用混合...”的执行;“获取玩家控制器”分别连5个“使用混合设置视图目标”的目标和5个“控制”的目标;5个“ThirdPersonCharacter”分别连5个“使用混合...”的“new view target”和5个“控制”的“in pawn”;注意修改“使用混合...”里的“blend time”和“延迟”节点的“duration”
(这节课的非必要操作)
选中多个节点,右键:
折叠到节点:相当于新建个文件夹放进去,复用等于新建文件夹复制进去
折叠到函数:设置为一个函数,有输入和输出,可多次调用
折叠到宏:有多个输出执行针脚的无法折叠为函数,宏可以做到,宏还可以有延迟节点,函数不行
- P46. 角色上下车功能
先新建一个场景(关卡),搭好地形,世界场景设置 里面的 游戏模式重载 选 ThirdPersonGameMode,默认pawn类选 ThirdPersonCharacter
内容浏览器中,“添加/导入——添加功能或内容包——蓝图功能——载具类游戏——添加到项目”
在文件夹“vehicleBP——Sedan”里有个“Sedan”的蓝图类,拖拽进场景中(至此在场景中添加了汽车)
进入汽车的蓝图类(“Sedan”),在“组件”部分,依附于“网格体vehicleMesh”添加一个碰撞盒子(box collision,用于检测小白人是否在汽车周围,如果在周围那小白人就能进行相应的操控),调整碰撞盒子的大小
新建一个“上下车”图表;
“添加自定义事件”,取名为“上车”;
(那么怎么在角色的蓝图类里调用这个“上车”的自定义事件呢)
打开小白人的蓝图类,新建一个变量,取名为“VehicleRef”,变量类型更改为汽车的蓝图类的名字(Sedan),然后选“对象引用”
在小白人的蓝图类里,添加节点“F”(搜“F”+空格+“键盘”);按住ctrl 把变量“vehicleRef”拖进图表里,然后从此节点拖出一条线添加节点“?Is valid”(搜索is valid 就有,得是前面带问号的那个节点);添加节点“上车”(在Sedan蓝图类中我们新建的 自定义事件节点)
小白人的事件图表新加的节点连完线后:
为了让上图中的“vehicle Ref”有效:
切换到“Sedan”蓝图类的“上下车”图表,在此图表中添加碰撞盒子(box)的两个节点“组件开始重叠时”和“组件结束重叠时”
添加节点“类型转换为 ThirdPersonCharacter”(cast to thirdpersoncharacter),添加节点“设置 Vehicle Ref”
但此时,“vehicle ref”仍然是空的,我们给它添加一个对自身的引用:从引脚“vehicle ref”拉出一条线添加节点“self”(搜索 self就有,但是节点名字是个中文,大概是 添加一个对自身的引用)
添加节点“Gate”(Gate后面就要实现角色控制权的切换,把控制权从小白人切换到汽车),节点“获取玩家控制器”,从“获取玩家控制器”拉出一条线添加节点“控制”,给“控制”传入一个我们想要控制的新的对象,从引脚“in pawn”拉出一条线添加节点“self”(指的是 获得对此蓝图类实例的一个引用,就是汽车);这时控制权就从小白人切换到了汽车的身上
至今为止的“上下车”图表:
还是在 Sedan 蓝图类中,添加一个球形碰撞(sphere collision)(用于确定小白人上车之后的位置)(和盒体碰撞(box)同级,在网格体 vehiclemesh 下级);把这个 sphere 的“细节——形状——球体半径”改成16,“细节——碰撞——碰撞预设”改成“NoCollision”
(现在来写控制权切换之后(从小白人换到汽车),小白人的位置应该如何)
切换到“上下车”图表,把刚刚添加的组件“sphere”左键拽住拖到此图表中,从“sphere”拉出一条线添加节点“获取场景变换”,然后从新节点的引脚“return value”添加节点“拆分变换”;
添加节点“设置Actor变换”,把引脚“new transform”右键 分割结构体引脚;把“拆分变换”节点的“location”和“rotation”分别与此节点的“new transform location”和“new transform rotation”连接(为什么不连scale:scale是缩放,不用连而且连了小人会变小(因为球体的尺寸被我们进行了改变))
“设置Actor变换”节点中的引脚“目标”连到节点“上车”(上图中红色的自定义事件),这时自定义事件“上车”会多出一个“目标”引脚:
切换到“ThirdPersonCharacter”蓝图类的事件图表,发现这里的节点“上车”也多了一个“目标”引脚:
我们把节点“self”(在ThirdPersonCharacter蓝图类中这个self也就是小白人)传给这个“目标”
(这时编译完蓝图运行,小白人上车后,看到汽车在空中旋转!这时因为小白人有碰撞体积,汽车也有碰撞体积,两个碰撞相互排斥;所以我们要把小白人上车后的碰撞关闭)
切换到“上下车”图表,从节点“上车”的目标添加节点“设置actor启用碰撞”,然后把新加的节点的前面的执行和“设置actor变换”的后面的执行相连,而且不勾选“enable collision”(小白人上车后关闭小白人的碰撞)
为了方便区分、不易混淆,我们把自定义事件“上车”中的“目标”右键改成“小白人”(右键之后在右侧的“细节——输入”中改);又为了每次用“小白人”的时候不用每次都连到“上车”的“小白人”,从“小白人”引脚左键拉出一条线,选择“提升为变量”,把此新增的变量重命名为“小白人Ref”;
上一步操作完多出一个节点“设置小白人Ref的值”,视频中把这个节点连到了“控制”和“设置Actor变换”的中间(看不懂为什么这么做)
(上图中间节点set的引脚“小白人Ref”连的是节点“上车”的引脚“小白人”(提升为变量的时候它自己连的))
(给用于上车的组件sphere改个名字,改成“Up”(一会还要区分上下车))
把组件“Up”拉到“上车”图表,从“Up”添加节点“附加actor到组件”(为什么是actor:因为我们要附加到“Up”的是小白人,小白人是actor)
节点“附加actor到组件”的引脚“目标”和小白人的引用(读取变量小白人Ref的值)相连(ctrl 拉出变量“小白人Ref”)
(为了简洁和美观,把之前和“上车”节点的“小白人”引脚相连的线断掉,ctrl拉出几个变量“小白人Ref”连到断掉的引脚上)
节点“附加actor到组件”的引脚“location rule”和“rotation rule”和“scale rule”选择“保持场景”(切记是“保持场景”不是“保持相对”)
上车部分到此结束,蓝图:
下面做下车
在 Sedan 蓝图类 “上下车”图表中,添加“键盘F”(“F”+空格+“键盘”)(为什么这个键盘F在Sedan蓝图类里加,不在ThirdPersonCharacter蓝图类里加:因为上车之前控制权在小白人上,上车之后控制权在汽车(Sedan)上)
- (判断汽车里面有没有人)
ctrl 拖出来变量“小白人Ref”,添加节点“?is valid”
(让小白人不要附加到汽车上)
从节点“小白人Ref”添加节点“从actor分离”(下面三个引脚都选“保持场景”)
在视图里复制一个组件“Up”,改名为“Down”,把组件“Down”移动到合适的位置(小白人下车的位置)
切换到“上下车”图表,把组件“Down”拉出来,从这个节点添加组件“获取场景变换”,从新节点添加节点“拆分变换”
添加节点“读取小白人Ref的值”(ctrl拖左边的变量),“设置Actor变换”;把“拆分变换”的“location”引脚连“设置actor变换”的“new transform location”(可能需要分割结构体引脚)
(为什么“rotation”不连“new transform rotation”:因为如果车在左右转(视角不水平)下车时,控制权切换到小白人 视角也会不水平并且一直不水平)
把“拆分变换”的“rotation”引脚 分割结构体变换(“设置actor变换”的“new transform rotation”也要分割结构体变换),“拆分变换”和“设置actor变换”的相应的rotation引脚只连接“Z”轴
(开启小白人的碰撞)
ctrl拖拽变量“小白人Ref”,添加节点“设置actor启用碰撞”(引脚“new actor enable collision”打勾)
(添加镜头过渡)
添加节点“获取玩家控制器”,“使用混合设置视图目标”(“Blend time”设置成0.4(别的时间也行))
添加节点“延迟”,“duration”也改成0.4
(控制权切换)
从节点“获取玩家控制器”(刚才添加的)拉出一条线,添加节点“控制”
(ctrl拖拽“小白人Ref”,想连到“控制”的“in pawn”,但是连不上:)
(为什么不能连:两个类型不对等,“小白人Ref”的类型是actor,“in pawn”要传入的类型是pawn(有pawn这个类型吗?有))
点一下上车逻辑中的自定义事件“上车”,在右侧的细节面板中把引脚“小白人”的类型改成“pawn”
把变量“小白人Ref”的变量类型改成“pawn”
然后再连“小白人Ref”和引脚“in pawn”就可以连上了
下车部分的蓝图:
- P47. 下车减速功能
切换到“Sedan”蓝图类——“上下车”图表,在下车这部分,拖拽一个组件里的“载具移动”节点到图表中:
从此节点拉出一条线,添加节点“设置手制动输入”(搜hand可以找到),然后把引脚“new handbrake”打勾(开启手刹)
再从“载具移动”添加节点“设置油门输入”,把引脚“throttle”设置为0(不给油)
(视频中说有一个小问题,油门设置什么的会冲突?我没懂。然后为了解决这一冲突,有了下面的部分)
新建一个布尔型变量“下车”,细节面板中的默认值打勾:
去到“上下车”图表,在上车这部分的最后面连一个“set下车”节点,并且不打勾:
在下车部分,在节点“使用混合设置视图目标”和“设置手动输入”之间连一个“set下车”节点,并打勾:
然后切换到“sedan”蓝图类的 事件图表 的“throttle input”部分,ctrl拖出“下车”变量 ;添加“分支”节点(快捷键 B + 鼠标左键)(“下车”连引脚“condition”)
因为上车时才启动油门输入,所以“分支”节点的false连“设置油门输入”的执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」