第 10 天:UE5 交互系统,拾取物品 触发机关!

server/2025/2/11 8:48:55/

🎯 目标:

理解 UE5 交互系统(Interaction System)
使用 C++ 让玩家拾取物品
创建交互触发器(Trigger)激活机关
使用射线检测(Raycast)触发交互

1️⃣ UE5 交互系统概述

在 Unreal Engine 5 中,交互系统允许玩家 拾取物品、开门、触发机关、启动事件 等。常见的交互方式包括:

方式描述适用场景
Overlap(重叠检测)进入某个区域时自动触发触发机关、进入房间
Raycast(射线检测)通过鼠标/键盘瞄准并触发拾取物品、开门、射击
按键交互(Key Press)按 E 或 F 触发NPC 对话、拾取物品

今天,我们将实现 拾取物品触发机关,并使用 E 键进行交互!🚀

2️⃣ 创建可拾取物品(PickupItem)

🔹 新建 PickupItem 类

  1. 在 UE5,点击 “工具” → “新建 C++ 类”
  2. 选择 Actor 作为基类,命名为 PickupItem
  3. 点击“创建并添加到项目”,等待 UE5 生成代码

🔹 修改 PickupItem.h

📌 添加 StaticMeshComponent 作为物品的模型,并设置重叠检测

#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/StaticMeshComponent.h"
#include "PickupItem.generated.h"UCLASS()
class MYGAME_API APickupItem : public AActor
{GENERATED_BODY()public:APickupItem();protected:virtual void BeginPlay() override;private:UPROPERTY(VisibleAnywhere)UStaticMeshComponent* MeshComponent;UFUNCTION()void OnOverlap(AActor* OverlappedActor, AActor* OtherActor);
};

🔹 修改 PickupItem.cpp

📌 初始化 MeshComponent,并绑定 Overlap 事件

#include "PickupItem.h"
#include "GameFramework/Actor.h"APickupItem::APickupItem()
{PrimaryActorTick.bCanEverTick = true;// 创建 StaticMesh 组件MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));RootComponent = MeshComponent;static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Engine/BasicShapes/Cube.Cube"));if (MeshAsset.Succeeded()) {MeshComponent->SetStaticMesh(MeshAsset.Object);}// 设置为可触发重叠事件MeshComponent->SetCollisionProfileName(TEXT("OverlapAllDynamic"));OnActorBeginOverlap.AddDynamic(this, &APickupItem::OnOverlap);
}void APickupItem::BeginPlay()
{Super::BeginPlay();
}void APickupItem::OnOverlap(AActor* OverlappedActor, AActor* OtherActor)
{if (OtherActor && OtherActor != this){UE_LOG(LogTemp, Warning, TEXT("%s 被 %s 拾取!"), *GetName(), *OtherActor->GetName());// 销毁物品(模拟拾取)Destroy();}
}

现在,玩家走近 PickupItem,物品会消失并打印拾取信息!
在这里插入图片描述

3️⃣ 使用射线检测(Raycast)拾取物品

有时候,我们希望 玩家按 E 键瞄准并拾取物品,可以使用 射线检测(Raycast) 来实现。

📌 修改 PlayerCharacter.h

void Interact();

📌 修改 PlayerCharacter.cpp

void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{Super::SetupPlayerInputComponent(PlayerInputComponent);PlayerInputComponent->BindAction("Interact", IE_Pressed, this, &APlayerCharacter::Interact);
}void APlayerCharacter::Interact()
{FVector Start = FirstPersonCamera->GetComponentLocation();FVector End = Start + (FirstPersonCamera->GetForwardVector() * 500.0f);FHitResult HitResult;FCollisionQueryParams CollisionParams;if (GetWorld()->LineTraceSingleByChannel(HitResult, Start, End, ECC_Visibility, CollisionParams)){if (HitResult.GetActor()){UE_LOG(LogTemp, Warning, TEXT("拾取物品: %s"), *HitResult.GetActor()->GetName());// 销毁物品HitResult.GetActor()->Destroy();}}
}

📌 修改 PickupItem.cpp

MeshComponent->SetCollisionProfileName(TEXT("BlockAllDynamic"));

✅ 现在,按 E 键可以瞄准并拾取物品!
在这里插入图片描述

4️⃣ 创建触发机关(Trigger Mechanism)

我们将创建一个 TriggerSwitch,当玩家靠近时 打开机关(比如门)。

🔹 新建 TriggerSwitch 类

  1. 在 UE5,点击 “工具” → “新建 C++ 类”
  2. 选择 Actor 作为基类,命名为 TriggerSwitch
  3. 点击“创建并添加到项目”,等待 UE5 生成代码在这里插入图片描述

🔹 修改 TriggerSwitch.h

📌 添加 BoxComponent 作为触发区域

#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/BoxComponent.h"
#include "TriggerSwitch.generated.h"UCLASS()
class MYGAME_API ATriggerSwitch : public AActor
{GENERATED_BODY()public:ATriggerSwitch();protected:virtual void BeginPlay() override;private:UPROPERTY(VisibleAnywhere)UBoxComponent* TriggerBox;UFUNCTION()void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex,bool bFromSweep, const FHitResult& SweepResult);
};

🔹 修改 TriggerSwitch.cpp

📌 初始化触发器,并在玩家进入时触发事件

#include "TriggerSwitch.h"
#include "GameFramework/Actor.h"ATriggerSwitch::ATriggerSwitch()
{PrimaryActorTick.bCanEverTick = true;// 创建 BoxComponent 作为触发区域TriggerBox = CreateDefaultSubobject<UBoxComponent>(TEXT("TriggerBox"));RootComponent = TriggerBox;TriggerBox->SetCollisionProfileName(TEXT("Trigger"));// 绑定重叠事件TriggerBox->OnComponentBeginOverlap.AddDynamic(this, &ATriggerSwitch::OnOverlap);
}void ATriggerSwitch::BeginPlay()
{Super::BeginPlay();
}void ATriggerSwitch::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex,bool bFromSweep, const FHitResult& SweepResult)
{if (OtherActor){UE_LOG(LogTemp, Warning, TEXT("触发机关: %s"), *OtherActor->GetName());}
}

当玩家进入 TriggerBox 区域,控制台会打印触发信息!

5️⃣ 常见问题 & 解决方案

问题解决方案
物品不消失确保 Destroy() 被调用
E 键无效确保 Interact() 正确绑定到 SetupPlayerInputComponent
触发器没反应BoxComponent 需设置 Trigger 碰撞模式

🎯 总结

实现 Overlap 事件,让物品可拾取
使用 E 键 + 射线检测拾取物品
创建 TriggerSwitch 触发机关
使用 BoxComponent 检测玩家进入区域

🎮 明天我们将学习 AI 交互系统,创建一个智能 NPC! 🚀


http://www.ppmy.cn/server/166707.html

相关文章

Excel 笔记

实际问题记录 VBA脚本实现特殊的行转列 已知&#xff1a;位于同一Excel工作簿文件中的两个工作表&#xff1a;Sheet1、Sheet2。 问题&#xff1a;现要将Sheet2中的每一行&#xff0c;按Sheet1中的样子进行转置&#xff1a; Sheet2中每一行的黄色单元格&#xff0c;为列头。…

Spring 中的设计模式详解

控制反转(IoC)和依赖注入(DI) IoC(Inversion of Control,控制反转) 是 Spring 中一个非常非常重要的概念&#xff0c;它不是什么技术&#xff0c;而是一种解耦的设计思想。IoC 的主要目的是借助于“第三方”(Spring 中的 IoC 容器) 实现具有依赖关系的对象之间的解耦(IOC 容器…

R语言 文本分析 天龙八部

起因, 目的: 前面有人对 “倚天屠龙记” 进行分析,我这里只是进行模仿而已。 完整的文件, 已经绑定了,反正读者可以找一下。 案例背景 小说《天龙八部》是金庸先生所著的武侠小说,也是“射雕三部曲”的前传。全书共50章,字数超过一百万字。故事发生在北宋末年,以大理…

如何在Kickstart自动化安装完成后ISO内拷贝文件到新系统或者执行命令

如何在Kickstart自动化安装完成后ISO内拷贝文件到新系统或者执行命令 需求 在自动化安装操作系统完成后&#xff0c;需要对操作系统进行配置需要拷贝一些文件到新的操作系统中需要运行一些脚本 问题分析 Linux安装操作系统时&#xff0c;实际上是将ISO镜像文件中的操作系统…

windows10 wsa 安卓子系统终结版

windows10 wsa 安卓子系统终结版 链接&#xff1a;https://pan.xunlei.com/s/VOIdoPPmqdUcgw3daFSbh2dAA1?pwdbe3r# windows10 wsa 安卓子系统终结版&#xff0c;包含三个文件. 1: windows10 wsa v2407.40000.4.0 x64 安卓子系统终结版。 2: Apk lnstaller v1.7 用于识别A…

单片机之基本元器件的工作原理

一、二极管 二极管的工作原理 二极管是一种由P型半导体和N型半导体结合形成的PN结器件&#xff0c;具有单向导电性。 1. PN结形成 P型半导体&#xff1a;掺入三价元素&#xff0c;形成空穴作为多数载流子。N型半导体&#xff1a;掺入五价元素&#xff0c;形成自由电子作为多…

没有服务器和显卡电脑如何本地化使用deepseek|如何通过API使用满血版deepseek

目录 一、前言二、使用siliconflow硅基流动 API密钥1、注册硅基流动2、创建API密钥3、下载AI客户端4、使用API密钥5、效果演示三、使用deepseek官方API密钥1、创建API密钥2、使用API密钥3、效果演示四、总结一、前言 上篇文章我介绍了如何通过云服务器或者显卡电脑来本地化部署…

从基础到进阶:一文掌握排序、查找、动态规划与图算法的全面实现(C++代码实例解析)

引言 算法是计算机科学的核心&#xff0c;也是程序员解决复杂问题的利器。从基础的排序与查找到进阶的动态规划与图论算法&#xff0c;掌握这些技能不仅是提升编程能力的必经之路&#xff0c;更是解决实际问题的根本。本篇文章将通过 C 实现多个经典算法&#xff0c;包括排序、…