UE5开发——射击武器类拾取

整体框架:

拾取武器

要在 Unreal Engine 5 (UE5) 中实现一个按 E 键拾取武器的功能,您可以遵循以下步骤:

### 步骤 1: 创建拾取物品的基础类
1. 在 Content Browser 中创建一个新的 C++ 类,继承自 `AActor` 或者 `AStaticMeshActor`。
2. 在该类中定义必要的变量,例如物品的类型、名称等。
3. 添加事件处理器,用于检测玩家角色与物品之间的交互。

### 步骤 2: 实现拾取逻辑
1. 在玩家角色的类中添加一个方法,用于处理与拾起物品相关的逻辑。
2. 使用 `Overlap` 事件来检测玩家是否靠近物品。
3. 当玩家按下 E 键时,调用上述方法。

### 步骤 3: 设置输入绑定
1. 在项目的 `Input Settings` 中添加一个新的动作绑定,比如命名为 `Interact`。
2. 将 `Interact` 动作绑定到 E 键。
3. 在玩家控制器类中处理 `Interact` 输入事件。

### 示例代码
这里是一个简单的示例代码片段,展示了如何实现上述功能:#### 创建一个基础的拾取物品类 `APickupBase`
```cpp

// APickupBase.h
#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/StaticMeshComponent.h"
#include "PickupBase.generated.h"UCLASS()
class YOURGAME_API APickupBase : public AActor
{GENERATED_BODY()public:    APickupBase();protected:UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Mesh")UStaticMeshComponent* Mesh;UFUNCTION()void OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:    // Called every framevirtual void Tick(float DeltaTime) override;
};
```

// APickupBase.cpp
#include "PickupBase.h"APickupBase::APickupBase()
{Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));SetRootComponent(Mesh);
}void APickupBase::BeginPlay()
{Super::BeginPlay();Mesh->OnComponentBeginOverlap.AddDynamic(this, &APickupBase::OnOverlapBegin);
}void APickupBase::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}void APickupBase::OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{// 检测到玩家时,触发拾取逻辑if (OtherActor != this && OtherActor->ActorHasTag("Player")){APlayerController* PlayerController = Cast<APlayerController>(OtherActor->GetController());if (PlayerController){PlayerController->ClientStartCursorMode();}}
}
```#### 在玩家控制器中处理输入
```cpp
// AYourPlayerController.h
#pragma once#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "YourPlayerController.generated.h"UCLASS()
class YOURGAME_API AYourPlayerController : public APlayerController
{GENERATED_BODY()public:AYourPlayerController();protected:virtual void SetupInputComponent() override;public:UFUNCTION(BlueprintCallable, Category = "Input")void Interact();};
``````cpp
// AYourPlayerController.cpp
#include "YourPlayerController.h"AYourPlayerController::AYourPlayerController()
{// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;
}void AYourPlayerController::SetupInputComponent()
{Super::SetupInputComponent();// Bind actionInputComponent->BindAction("Interact", IE_Pressed, this, &AYourPlayerController::Interact);
}void AYourPlayerController::Interact()
{// 当玩家按下 E 键时,执行拾取操作if (auto* PlayerCharacter = Cast<AYourCharacter>(GetPawn())){PlayerCharacter->PickupItem();}
}
```#### 在玩家角色类中实现拾取逻辑
```cpp
// AYourCharacter.h
#pragma once#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "YourCharacter.generated.h"UCLASS()
class YOURGAME_API AYourCharacter : public ACharacter
{GENERATED_BODY()public:AYourCharacter();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:    // Called every framevirtual void Tick(float DeltaTime) override;// Called to bind functionality to inputvirtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;UFUNCTION(BlueprintCallable, Category = "Interaction")void PickupItem();
};
``````cpp
// AYourCharacter.cpp
#include "YourCharacter.h"AYourCharacter::AYourCharacter()
{// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;
}void AYourCharacter::BeginPlay()
{Super::BeginPlay();
}void AYourCharacter::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}void AYourCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{Super::SetupPlayerInputComponent(PlayerInputComponent);// Bind actionPlayerInputComponent->BindAction("Interact", IE_Pressed, this, &AYourCharacter::PickupItem);
}void AYourCharacter::PickupItem()
{// 实现具体的拾取逻辑// 例如:查找最近的可拾取物品,然后将其加入玩家的物品列表
}
```

1. 枪支拾取动画

创建Text Block

编译保存

在h文件写入 ,属性

private:UPROPETY(VisibleAnywhere, Category = "Weapon Properties")class UWidgetComponent* PickupWidget;

先写这个:

CreateDefaultSubobject<UWidgetComponent>(TEXT("PickupWidget"));

在 Unreal Engine 中,SetupAttachment() 方法用于将一个组件附加到另一个组件上。这样做的目的是为了建立组件之间的层次关系,从而使得它们能够在场景中正确地相对于彼此移动、旋转和缩放。

关于 RootComponent:

  • RootComponent: 这个术语指的是一个 Actor 的根组件。在 Unreal Engine 中,每个 Actor 都有一个根组件,所有其他的子组件都将直接或间接地附加在这个根组件上。根组件通常是 USceneComponent 的实例,它可以是一个静态网格体、骨骼网格体或其他类型的组件。

对应h文件

protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;UFUNCTION()virtual void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent,AActor * OtherComp,int32 OtherBodyIndex,bool bFromSweep,const FHitResult& SweepResult);

代码定位上层

拾取代码实现

//简而言之,这段代码的作用是:当武器的碰撞组件检测到与 ABlasterCharacter 类型的演员发生重叠时
// ,就会显示一个拾取提示(如一个 UI 元素)给玩家。这通常用于提示玩家可以拾取或互动的武器。
void AWeapon::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent,AActor*OtherActor,UPrimitiveComponent* OtherComp)
{ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(OtherActor);
if (BlasterCharacter && PickupWidget) {  //PickupWidget检查不是空指针PickupWidget->SetVisibility(true);
}}
void AWeapon::BeginPlay()
{Super::BeginPlay();if (PickupWidget) {PickupWidget->SetVisibility(false);  //应该是拾取成功后,让地面不可见}}

在服务器上变的不可见,应该是不捡枪,其他玩家可以看到E键盘拾取,捡起枪后,其他玩家看不到e键拾取了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/414384.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

串口助手使用和插入usb转TTL的COM口识别问题

问题出现原因 由于串口调试中经常需要通过断电对单片机烧录程序&#xff0c;所以制作了一个转接带开关的USB 转接口&#xff0c;如下图所示&#xff0c;其中按键控制的是OUT口的电源通断。但为了能够数据传输&#xff0c;有两根传输数据的线是一直连接的。在使用usb进行程序烧…

什么是EDR、NDR、MDR、XDR?他们之间什么区别?

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 概述 EDR是什…

ParallelsDesktop19可在任何Mac上运行Windows软件

ParallelsDesktop19是一款Mac虚拟机软件&#xff0c;可在任何Mac上运行Windows&#xff0c;体验不同操作系统之间的无缝集成&#xff0c;并具有创新设计和增强功能&#xff0c;如无密码登录与TouchID、支持macOSSonoma14和增强打印选项。此外&#xff0c;它还支持运行更多Windo…

EasyExcel动态映射Excel数据到任意实体类教程

在使用EasyExcel进行Excel导入时&#xff0c;我们经常需要将Excel中的数据映射到Java实体类中。如果Excel的列名是固定的&#xff0c;我们可以通过ExcelProperty("列名")注解直接在实体类中指定列名。但如果Excel的列名不固定&#xff0c;或者我们希望根据Excel的第一…

【Unity实战】Visual Studio Debug失败

Visual Studio&#xff0c;就像以前Eclipse在Java领域中的地位一样&#xff0c;至少在Jetbrains人人皆爱之前&#xff0c;它是主流。可能对于当下来说显得臃肿&#xff0c;而且没有Jetbrains智能准确的代码分析提示&#xff0c;但是依旧能用。而且开大工程来说&#xff0c;至少…

Kubernetes 网关流量管理:Ingress 与 Gateway API

引言 随着 Kubernetes 在云原生领域的广泛使用&#xff0c;流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量&#xff0c;Kubernetes 提供了多种解决方案&#xff0c;其中最常见的是 Ingress 和新兴的 Gateway API。 Ingress 随着微服务架构的发展&#x…

Jupyter如何使用Anaconda的虚拟环境

Anaconda的虚拟环境大家应该都知道是什么&#xff0c;我们可以建立多个虚拟环境并在对应的环境中安装不同的python三方库从而运行不同的python项目&#xff0c;那么在jupyter中如何使用Anaconda的虚拟环境呢&#xff0c;今天就为大家分享一个这样的操作教程。 请参考图文进行以…

实用好软-----电脑端 开源的视频无损剪切与合并工具

这个是一个开源项目LosslessCut 无损剪切就是基于关键帧的剪切&#xff0c;不需要重编码&#xff0c;因此速度非常快&#xff0c; 缺点就是切割时间无法达到非常精确&#xff0c;可能前后会有几秒的差距&#xff0c; 要做到精确的剪切&#xff0c;只能重编码。 LosslessCut在切…

Junit单元测试入门

目录 一、单元测试 1.1 基本概念 1.2 以往测试存在的问题和不足 二、快速入门 2.1 基本步骤 2.2 基本使用示例&#xff08;vscode为例&#xff09; 2.2 断言机制&#xff08;重要&#xff09; 2.3 其它注解 一、单元测试 1.1 基本概念 针对最小单元的测试&#xff0c…

mysql创建数据库和表

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 一、MySQL数据库和表的基础概念 在深入讲解如何在MySQL中创建数据库和表之前&#xff0c;先了解一些基础概念。 1.1 数据库和表的概念 数据库&#xff08;Database&#xff09;&#xff1a;数据库是数据存…

4-6 使用bios 中断 显示字符

1 显示的逻辑 bios 首先通过中断&#xff0c;访问到 最前面的中断向量表&#xff0c;然后 通过中断向量表然后 访问到具体的 bios 的函数&#xff0c;这些函数是bios 自带的&#xff0c;具体的位置 &#xff0c; 我也不知道。只知道有这个函数。 3 显示的原理 &#xff1b; 主要…

Unity中保存数据的方法

一、概述 Unity中可用于持久化的方式有&#xff1a; 1&#xff09;通过ScriptableObject在可编辑模式下保存数据 2&#xff09;通过excel、json等文件实现数据的可持久化 二、ScriptableObject的使用 1、使用背景 假如需要制作子弹预设体&#xff0c;每个子弹上有speed速…

【国考】特值法

特值法 题干中存在乘除关系&#xff0c;且对应量未知。 例3&#xff1a;甲、乙、丙三个工程队的效率比为6&#xff1a;5&#xff1a;4,现将A、B两项工作量相同的工程交给这三个工程队,甲队负责A工程,乙队负责B工程,丙队参与A工程若干天后转而参与B工程.两项工程同时开工,耗时16…

两个月冲刺软考——求解关系模式达到了第几范式题型(例题+讲解,一看就会)

目录 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该是将“一”的那一方的主键加入到“多”的一方的关系模式中。 2.求解关系模式达到了第几范式题型 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该…

利用session.upload_progress执行文件包含

1.session.upload_progress的作用&#xff1a; session.upload_progress最初是PHP为上传进度条设计的一个功能&#xff0c;在上传文件较大的情况下&#xff0c;PHP将进行流式上传&#xff0c;并将进度信息放在Session中&#xff08;包含用户可控的值&#xff09;&#xff0c;即…

excel透视图、看板案例(超详细)

一、简介 Excel透视图&#xff08;Pivot Table&#xff09; 功能&#xff1a;透视图是一种强大的数据分析工具&#xff0c;用于汇总、分析和展示数据。它允许用户对数据进行重新排列和分类&#xff0c;从而更容易发现数据中的模式和趋势。用途&#xff1a;可以用来生成动态报表…

GIT 下载安装使用教程

目录 一. GIT 下载 二. GIT 安装 1. 许可声明 2. 选择安装路径 3. 组件选择 4. 开始菜单文件夹 5. Git使用的默认编辑器 6. 调整新存储库中初始分支的名称 7. 调整Path环境 8. 选择SSH可执行文件 9. 选择HTTPS传输后端 10. 配置行结束转换 11. 配置用于Git Bash的终端模…

Spring之配置类解析源码解析

解析配置类 解析配置类流程图&#xff1a;https://www.processon.com/view/link/5f9512d5e401fd06fda0b2dd 解析配置类思维脑图&#xff1a;https://www.processon.com/view/link/614c83cae0b34d7b342f6d14 在启动Spring时&#xff0c;需要传入一个AppConfig.class给Appli…

企业级使用docker实现负载均衡

利用Docker容器编排完成haproxy和nginx负载均衡架构实施 利用 Docker 编排实现 HAProxy 和 Nginx 负载均衡架构的介绍&#xff1a; 首先&#xff0c;使用 Docker Compose 进行容器编排。创建一个 haproxy.yml 文件&#xff0c;定义 HAProxy 和 Nginx 服务。HAProxy 容器作为前…

C语言 | Leetcode C语言题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int firstUniqChar(char* s) {struct hashTable* position NULL;int que[26][2], left 0, right 0;int n strlen(s);for (int i 0; i < n; i) {int ikey s[i];struct has…