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

news2024/9/23 15:24:02

整体框架:

拾取武器

要在 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 spawned
    virtual void BeginPlay() override;

public:    
    // Called every frame
    virtual 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 action
    InputComponent->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 spawned
    virtual void BeginPlay() override;

public:    
    // Called every frame
    virtual void Tick(float DeltaTime) override;

    // Called to bind functionality to input
    virtual 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 action
    PlayerInputComponent->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 spawned
	virtual 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.coloradmin.cn/o/2090558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch交叉熵损失函数

nn.CrossEntropyLoss 是 PyTorch 中非常常用的损失函数,特别适用于分类任务。它结合了 nn.LogSoftmax 和 nn.NLLLoss(负对数似然损失)的功能,可以直接处理未经过 softmax 的 logits 输出,计算预测值与真实标签之间的交叉熵损失。 1. 交叉熵损失的原理 交叉熵损失衡量的是…

Visual Studio Code离线汉化

从官网下载Visual Studio Code安装包后&#xff0c; 下载Visual Studio Code&#xff1a;https://code.visualstudio.com/ 若因网络等问题无法在线安装语言包&#xff0c;可以尝试离线安装&#xff1a; 从官网下载语言包&#xff1a; Extensions for Visual Studio family …

线上考试系统部署(thirty-six day)

一、线上考试系统的数据 虚拟化技术部署 1、部署前端服务器 &#xff08;1&#xff09;将资源上传到服务器 scp -r dist/ root192.168.1.11:~ &#xff08;2&#xff09;创建基础容器 在服务器上 systemctl start docker.servicedocker pull centosdocker run -it --name …

基于RAG多层次的多代理架构来处理时序任务

《Agentic Retrieval-Augmented Generation for Time Series Analysis》这篇文章提出了一种新颖的时间序列分析方法&#xff0c;称为Agentic Retrieval-Augmented Generation&#xff08;RAG&#xff09;框架。它通过多层次的多代理架构来处理时间序列任务&#xff0c;其中主代…

【银河麒麟高级服务器操作系统】soft lockup软锁实例详细记录分析及处理建议

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 启nginx服务&#xff0c;但是报了sof…

WebRTC协议下的视频汇聚融合技术:EasyCVR视频技术构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展&#xff0c;视频数据的规模急剧增长&#xff0c;对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…

海外云手机实现海外社媒矩阵营销

如何利用社交媒体平台有效推广和带货&#xff0c;正成为众多企业和创业者关注的焦点。海外云手机解决各种网络和设备问题&#xff0c;成为跨境电商海外社媒矩阵建设的必备工具。 跨境电商的核心在于通过互联网连接不同国家的消费者与商品。社交媒体作为连接消费者与品牌的桥梁&…

vue nginx部署 配置 解决href = ‘/login路由‘ 跳转404问题

示例场景 <a :hrefthis.repDownloadUrl>下载平台</a><a href"/join" target"_blank">入驻平台</a><a href"/index" target"_blank" class"btn_login" style"color:#fff">nginx部署…

Datawhale X 李宏毅苹果书 AI夏令营 Task 2

课程内容 &#xff08;一&#xff09;术语解释 一 . Sigmoid函数与Hard Sigmoid 函数 &#xff08;1&#xff09;Sigmoid函数 Sigmoid函数&#xff0c;也称为逻辑函数&#xff08;Logistic function&#xff09;&#xff0c;是一种在数学、生物学、信息科学、神经网络等领域广…

【原子提交:IDEA实践】

原子提交&#xff1a;IDEA实践 背景先前情况idea实际操作方式一&#xff1a;Squash Commits方式二&#xff1a;Undo Commit 后再 Commit方式三&#xff1a;Resetpush前操作后悔药——回到squash commit之前&#xff1a; 背景 临近发版&#xff0c;某位老哥的个线上MR包含多个b…

YOLOv8环境搭建、创建数据集、训练推理教程(超级详细)

yolov8和yolov10 是一个流派&#xff0c;和yolov5区别还挺大&#xff0c;所以尝试使用yolov8来进行模型训练&#xff0c;下面是详细使用流程&#xff1a; 一、环境搭建 1.1 Anaconda安装 Anaconda是一个强大的开源数据科学平台,它将很多好的工具整合在一起&#xff0c;极大地…

怎么在CSDN上赚钱?

CSDN平台上有多种方式可以赚钱&#xff0c;以下是其中几种常见的&#xff1a; 写作赚钱&#xff1a;CSDN平台鼓励用户积极创作原创技术博客&#xff0c;通过博客的阅读量和转发量来获取广告收益&#xff1b;用户还可以发表付费文章或参与付费专栏&#xff0c;在文章的阅读量和付…

Flask+LayUI开发手记(六):树型表格的增删改查

树型表格的增删改查功能与数据表格的是完全一致&#xff0c;就是调用layui-form表单组件实现数据输入再提交&#xff0c;比较大的区别是树型节点的编辑&#xff0c;都需要有上级节点的输入&#xff0c;而这个上级节点的展示&#xff0c;必须是以树型方式展示出来。当然&#xf…

【Qt应用】Qt编写简易文件管理系统

目录 引言 一、准备工作 二、设计思路 三、创建项目和基本界面 四、目录浏览功能 实现效果 五、文件操作功能 5.1 设置添加文件与删除文件按钮 5.2 添加文件槽函数 5.3 删除文件槽函数 5.4 实现效果 六、文件搜索功能 6.1 准备工作 6.2 搜索按钮槽函数 6.3 实现…

[Algorithm][综合训练][合并k个已排序的链表][dd爱旋转][小红取数]详细讲解

目录 1.合并k个已排序的链表1.题目链接2.算法原理讲解 && 代码实现 2.dd爱旋转1.题目链接2.算法原理详解 && 代码详解 3.小红取数1.题目链接2.算法原理详解 && 代码实现 1.合并k个已排序的链表 1.题目链接 合并k个已排序的链表 2.算法原理讲解 &…

网络性能优化的几个思路

指标工具 工具指标 网络性能优化 总的来说&#xff0c;先要获得网络基准测试报告&#xff0c;然后通过相关性能工具&#xff0c;定位出网络性能瓶颈。再接下来的优化工作&#xff0c;就是水到渠成的事情了。 当然&#xff0c;还是那句话&#xff0c;要优化网络性能&#xff0…

Stable Diffusion majicMIX_realistic模型的介绍及使用

一、简介 majicMIX_realistic模型是一种能够渲染出具有神秘或幻想色彩的真实场景的AI模型。这个模型的特点是在现实场景的基础上&#xff0c;通过加入一些魔法与奇幻元素来营造出极具画面效果和吸引力的图像。传统意义的现实场景虽然真实&#xff0c;但通常情况下缺乏奇幻性&a…

前后端交互的路径怎么来的?后端解决cors问题的一种方法

背景&#xff1a;后端使用node.js搭建&#xff0c;用的是express 前端请求的路径baseURL怎么来的 &#xff1f; 前后端都在同一台电脑上运行&#xff0c;后端的域名就是localhost&#xff0c;如果使用的是http协议&#xff0c;后端监听的端口号为3000&#xff0c;那么前端请求…

MySQL将数据库所有表格和列编码格式从utf8mb3换成utf8mb4

最近在做数据导入&#xff0c;发现客户数据很多都带特殊符号&#xff0c;然后数据库就会提示 “java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x8C\xB8\xEF\xBC…’ for column ‘name’ at row 1”&#xff0c;看了一下数据库对应字段字符集是 utf8mb3 的&#…

<Python><AI>基于智谱AI免费大模型GLM-4-Flash的智能聊天程序

前言 智谱AI开放了一个免费使用的大模型GLM-4-Flash&#xff0c;官方也提供了python的示例程序&#xff0c;我们结合pyqt5来编写一个基于GLM-4的简单的智能聊天工具。 界面大致如下&#xff1a; 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&a…