[教程辅助视频]如何让带骨骼的角色实现捡东西(Pickup)
- 效果
- 原理
- 步骤
- 1. 定义被捡物体类
- 2. 定义BPI_Picker接口
- 3. 在骨骼上添加插槽(Socket)
- 4. 角色蓝图
- 捡东西
- 扔东西
- 在角色的骨骼上添加Socket作为被捡物的吸附位置
- 被捡物发生Overlap事件以后判断另一个物体是否为角色对象,如果是则将自身以及要吸附的位置作为参数传给角色
- 角色接收到参数以后把被捡物Attach到相应的Socket
本文依旧以第三人称模板为起点实现
1. 定义被捡物体类组件结构:一个StaticMesh组件
注意:这个被捡物在Collision
设置中要对Pawn
开启Overlap
并且开启产生Overlap
事件
这个类有2个方法:OnPickup
和OnDrop
,顾名思义它们分别是物件被捡起和扔下时要执行的逻辑。OnPickup
不需要参数,OnDrop
有一个Vector
类型参数,它的作用是被扔下时的初始速度的方向。
BPI_Picker
时是所有可以捡东西的类都要实现的接口(在下文中定义)
- 检测到角色以后仅仅是把必要的参数传过去,并不调用
OnPickup
,因为到底捡不捡还需要在角色中判断一下
- 被捡到以后就要关闭物理模拟和碰撞
- 被扔下以后要开启物理模拟和碰撞,并且添加一个初始速度
注意:在Set Collision Enabled
中之开启了Physics
没有打开Query Collision
,因为被检物离角色很近的话被抛弃时还可以和角色发生Overlap,这样没等落地就又被捡起来了。如果游戏设定中物体可以多次被捡可以根据需要以其它方式开启Query Collision
BPI_Picker
接口:所有可捡东西的角色都要实现这个接口,比如:主角啊,怪物啊等等。
它只有1个方法Pickup
,该方法有2个参数:
- Item:
BP_Pickupable
类型,被拾取的物体通过这个参数传进来。 - SocketName:
Name
类型,这个自然就是物体要吸附的插槽了。
本例中我们想让物体吸附在角色的右手,所以在右手添加一个插槽,记住这个插槽的名字:“hand_rSocket”
在Class Settings
中添加BPI_Picker
接口
实现这个接口
我在角色中添加了一个名为"RightHandItem"(BP_Pickupable
类型)的成员变量,它的作用:
- 作为角色右手当前是否已持有物体的标志
- 保留被捡对象的引用
接收到Pickup
事件以后,角色要决定是否真的捡起这个物体,这个逻辑可以根据游戏设定来实现,本例中如果已经持有就不再捡新的了。
本例中使用Q
键来扔东西。