让我们继续《塞尔达传说》中林克技能的制作!!!
UE版本:5.6.0
VS版本:2022
本章节的核心目标:磁力抓取器
先让我们看一下完成后的效果:
18_磁力抓取器
大纲如下:
- 引言
- 功能架构与核心逻辑
- 物理材质与场景配置
- 代码实现:从识别到操控
- 操作说明
1.引言
在《塞尔达传说》中,林克的磁力抓取器( magnesis )是极具特色的交互技能,可识别并操控金属物体。本文基于 UE5,从代码实现角度,详细拆解磁力抓取器核心逻辑,一起来复刻该玩法。
2.功能架构与核心逻辑
磁力抓取器需实现金属物体识别、状态可视化、交互操控 三大核心能力,整体流程如下:
3.物理材质与场景配置
3.1 物理表面定义
在 UE5 项目设置(Project Settings)→ 物理(Physics)中,将 SurfaceType1 命名为 Metal,作为金属材质的专属标识,为代码识别提供依据。
3.2 物理材质资产
创建 PM_Metal 物理材质,配置摩擦力、恢复力等物理属性,并关联 SurfaceType1。同时,准备三类可视化材质(基于 M_Bomb 实例化 ):
材质名称 | 作用 | BP_Player中蓝图配置 |
---|---|---|
MI_MagHover | 磁力瞄准高亮显示 | MagHoveredMat |
MI_MagNormal | 技能开启后默认显示 | MagNormalMat |
M_Metal | 技能关闭 / 未激活时原始显示 | MagDeactivateMat |
在蓝图细节面板 “Rune - Magnet” 中完成材质绑定,让不同交互状态自动切换对应材质。
3.3 场景应用
完成 PM_Metal、PM_Foliage 等物理材质资产创建与属性设置后,还需将材质配置到场景物体上。
以场景中的 Cube 为例,在关卡编辑器右侧细节面板中,找到 “材质” 模块下的 “元素 0”,点击材质选择框,将 M_Metal 材质配置给 Cube 。通过这样的操作,让 Cube 等场景物体具备对应的物理材质属性,成为磁力抓取器技能可识别与交互的目标对象,为后续代码中筛选金属材质 Actor 提供基础,使场景内物体能响应磁力抓取器的功能逻辑 。
4.代码实现:从识别到操控
4.1 角色类核心定义(ZSCharBase.h)
UCLASS()
class ZELDARSKILLS_API AZSCharBase : public ACharacter
{
GENERATED_BODY()
public:
// 磁力抓取器配置
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rune - Magnet")
TSubclassOf<AActor> StaticMeshClass; // 筛选目标Actor类型
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rune - Magnet")
UMaterialInterface* MagHoveredMat = nullptr; // 高亮材质
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rune - Magnet")
UMaterialInterface* MagNormalMat = nullptr; // 技能开启材质
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rune - Magnet")
UMaterialInterface* MagDeactivateMat = nullptr; // 技能关闭材质
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rune - Magnet")
UParticleSystem* MagDraggingVFX; // 拖拽特效
// 运行时数据
TArray<AStaticMeshActor*> AllMagSMs; // 存储金属Actor
TObjectPtr<UPrimitiveComponent> MagnesisObj; // 当前抓取物体
TObjectPtr<UPrimitiveComponent> TempMagHitComp; // 射线检测临时对象
TObjectPtr<UParticleSystemComponent> BeamParticleComp; // 拖拽粒子特效
// 核心方法
#pragma region Magnet
void FilterOutAllMagSMs(); // 筛选金属Actor
void UpdateMagHintMats(TArray<AStaticMeshActor*> array, UPrimitiveComponent* hoverObj); // 材质切换
void SelectOrReleaseMagObject(); // 抓取/释放逻辑
void GrabMagObj()