UE5 - 制作《塞尔达传说》中林克的技能 - 18 - 磁力抓取器

发布于:2025-07-05 ⋅ 阅读:(15) ⋅ 点赞:(0)

让我们继续《塞尔达传说》中林克技能的制作!!!
UE版本:5.6.0
VS版本:2022
本章节的核心目标:磁力抓取器
先让我们看一下完成后的效果:

18_磁力抓取器


大纲如下:

  1. 引言
  2. 功能架构与核心逻辑
  3. 物理材质与场景配置
  4. 代码实现:从识别到操控
  5. 操作说明

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()

网站公告

今日签到

点亮在社区的每一天
去签到