讓我們繼續《塞爾達傳說》中林克技能的制作!!!
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; // 存儲金屬ActorTObjectPtr<UPrimitiveComponent> MagnesisObj; // 當前抓取物體TObjectPtr<UPrimitiveComponent> TempMagHitComp; // 射線檢測臨時對象TObjectPtr<UParticleSystemComponent> BeamParticleComp; // 拖拽粒子特效// 核心方法#pragma region Magnetvoid FilterOutAllMagSMs(); // 篩選金屬Actorvoid UpdateMagHintMats(TArray<AStaticMeshActor*> array, UPrimitiveComponent* hoverObj); // 材質切換void SelectOrReleaseMagObject(); // 抓取/釋放邏輯void GrabMagObj()