UE5 版本:5.7

经验水平:初学者

我想要实现的功能

我有一个体育游戏,球体演员需要在玩家进入接近区时自动附着到角色持有的装备上的一个插槽。球体应当捕捉到名为 PocketSocket 的特定插槽,该插槽位于名为 StickMesh 的骨骼网格组件上,且该组件是角色主网格组件的子组件。

我的设置

  • BP_Ball — 演员类。包含启用了物理模拟的 BallMesh 静态网格组件。包含用于接近检测的 PickupZone 球形碰撞组件。拥有一个布尔变量 BallOverlap,玩家进入 PickupZone 时设为 true,离开时设为 false。
  • BP_ThirdPersonCharacter — 包含在 Mesh 下的 StickMesh 骨骼网格组件。StickMesh 上有一个名为 PocketSocket 的插槽。拥有一个 Ball 变量,在 BeginPlay 时通过 Get All Actors Of Class 获取并存储对 BP_Ball 的引用。还有一个 BallAttached 布尔变量。

我的 BP_ThirdPersonCharacter 事件图

  • Event Tick 每帧触发。第一条 Branch 检查 BallAttached——如果为 false 则继续。第二条 Branch 检查从 Ball 演员引用读取的 BallOverlap——如果为 true 则继续。随后调用 Attach Actor To Component。接着将 BallAttached 设为 true。再将 BallMeshSimulate Physics 设为 false。

Attach Actor To Component 设置:
- Target — 球体演员引用
- Parent — 通过 Get Player CharacterGet StickMesh 获得的 StickMesh 组件
- Socket Name — 通过提升的 Name 变量,默认值为 PocketSocket
- Location Rule — Snap to Target
- Rotation Rule — Snap to Target
- Scale Rule — Snap to Target
- Weld Simulated Bodies — 勾选

发生了什么

Attach Actor To Component 上设置断点确认它在运行时被触发。悬停时 TargetParent 显示有效的对象引用。Socket Name 显示为 Name 类型——运行时为空,尽管变量的默认值是 PocketSocket。球体的物理被正确关闭。球体在当前世界位置冻结,未能捕捉到 PocketSocket

我尝试过的办法

  • 在附着前禁用 BallMesh 的碰撞
  • 将碰撞预设改为 Query and Physics
  • 将碰撞预设改为 PhysicsActor
  • 调换 Set Simulate PhysicsAttach Actor To Component 的顺序
  • 使用 Make Literal Name 节点而不是硬编码文本作为 Socket Name
  • Socket Name 提升为变量
  • 使用 Physics Constraint Component 的方法
  • StickMesh 碰撞从 NoCollision 改为 Overlap All
  • 验证 PocketSocket 确实存在于 StickMesh 骨骼资产中,且名称和位置正确

关键线索

当在 Attach Actor To Component 断点暂停时——悬停 Socket Name 引脚显示运行时值为 Name——看起来是空的,尽管变量默认值已设为 PocketSocket。名称在运行时没有被正确传递。

问题
为什么 Socket Name 在运行时为空,且尽管 TargetParent 有有效引用,球体仍未能捕捉到插槽?是否存在物理模拟与静态网格组件插槽附着之间的已知冲突,需要特定的处理方式?

我实在想不通了,先谢谢大家!