UE4 C++碰撞和OverLap事件绑定

本文详细介绍了在Unreal Engine 4中如何设置和处理游戏角色的碰撞与重叠事件,通过自定义类AMyCharacter实现碰撞与重叠的响应,并展示了如何在BeginPlay函数中注册碰撞回调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"

UCLASS()
class PACMAN_API AMyCharacter : public ACharacter
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties
	AMyCharacter();

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()
	void OnCollision( UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);
	
	UFUNCTION()
	void OnOverLap( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);

};
// Fill out your copyright notice in the Description page of Project Settings.

#include "MyCharacter.h"
#include "Components/CapsuleComponent.h"
#include "Collecable.h"

// Sets default values
AMyCharacter::AMyCharacter()
{
 	// 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;

}

// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
	Super::BeginPlay();
	//怎么查看回调函数的参数,对OnComponentHit右键转到定义,去掉第一个参数
	GetCapsuleComponent()->OnComponentHit.AddDynamic(this,&AMyCharacter::OnCollision);
	GetCapsuleComponent()->OnComponentBeginOverlap.AddDynamic(this, &AMyCharacter::OnOverLap);
}

// Called every frame
void AMyCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

}

void AMyCharacter::OnCollision(UPrimitiveComponent * HitComponent, AActor * OtherActor, UPrimitiveComponent * OtherComp, FVector NormalImpulse, const FHitResult & Hit)
{
	UE_LOG(LogTemp, Warning, TEXT("Collision"));
}

void AMyCharacter::OnOverLap(UPrimitiveComponent * OverlappedComponent, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
	UE_LOG(LogTemp, Warning, TEXT("OverLap"));
    //ACollecable 一个自定义类
	if (OtherActor->IsA(ACollecable::StaticClass()))
	{
		OtherActor->Destroy();
	}
}

 

<think>好的,用户想在Unreal Engine 5中用蓝图实现碰撞事件触发音乐切换。首先,我需要回忆一下UE5中处理碰撞事件的基本方法。根据引用[4],可以使用碰撞响应生成事件节点,这应该涉及到碰撞组件的设置。 用户需要的是蓝图解决方案,而不是C++代码,所以应该专注于蓝图节点事件图表。引用[1]提到事件图表用于响应游戏事件,比如碰撞检测,所以应该从这里入手。 步骤可能包括:创建碰撞组件,比如Box Collision,然后设置碰撞事件。当碰撞发生时,触发一个自定义事件来切换音乐。需要确保碰撞预设设置正确,比如Overlap事件。 然后,音频部分可能需要使用Sound Cue或Media Player组件。用户可能需要将音频文件导入内容浏览器,并创建相应的音频组件。切换音乐可能需要两个不同的音轨,并在事件触发时停止当前播放并开始另一个。 引用[5]提到了刚体物理的设置,但用户的问题可能不需要物理模拟,只需检测碰撞即可。所以Box Collision组件可能不需要启用物理模拟,但需要确保生成Overlap事件。 可能需要检查Actor的碰撞设置,确保Generate Overlap Events被勾选。然后,在事件图表中,使用OnComponentBeginOverlap节点,连接到播放音乐的逻辑。 还要考虑是否需要变量来跟踪当前播放的音乐,以便切换。比如,使用布尔变量判断当前是音乐A还是B,然后根据状态切换。 最后,测试整个流程,确保碰撞时音乐正确切换。可能还需要调整音量或淡入淡出效果,但用户可能只需要基础功能,所以先保持简单。 总结步骤:创建带有碰撞组件的Actor,设置碰撞事件,在蓝图中绑定Overlap事件,控制音频组件的播放停止,实现切换。需要确保引用中的碰撞事件蓝图节点正确应用。</think>### 分步教程:碰撞事件触发音乐切换(Unreal Engine 5 蓝图) --- #### **步骤1:创建基础蓝图** 1. 右键点击内容浏览器 → **蓝图类** → 选择**Actor** 2. 命名为`BP_MusicSwitcher` 3. 双击打开蓝图,添加组件: - **碰撞组件**(如`Box Collision`用于触发范围) - **音频组件**(用于播放音乐,可添加两个分别对应不同音乐) ```cpp // 组件结构示例 Components: - Box (Box Collision) - AudioComponent_MusicA - AudioComponent_MusicB ``` --- #### **步骤2:设置碰撞响应** 1. 选中`Box Collision`组件 2. 在**细节面板**中: - 设置**Collision Preset**为`OverlapAllDynamic`[^4] - 勾选**Generate Overlap Events** 3. 添加碰撞事件响应逻辑(下文详述) --- #### **步骤3:绑定蓝图事件** 1. 在**事件图表**右键 → 搜索添加节点: - **OnComponentBeginOverlap**(关联到Box Collision组件) 2. 连接事件输出引脚,构建逻辑: ``` OnComponentBeginOverlap → 分支判断 → 切换音乐 ``` --- #### **步骤4:音乐控制实现** ```python # 伪代码逻辑示例 if 当前播放音乐A: 停止AudioComponent_MusicA 播放AudioComponent_MusicB else: 停止AudioComponent_MusicB 播放AudioComponent_MusicA ``` 具体蓝图节点操作: 1. 添加**布尔变量**`IsPlayingMusicA`(默认值为True) 2. 使用**Branch**节点判断布尔值 3. 连接**Stop Sound****Play Sound**节点控制音频组件 --- #### **步骤5:参数配置** 1. 在音频组件属性中: - 指定**Sound Cue**资源 - 调整音量/循环设置 2. 测试时可通过拖拽蓝图到场景中,调整碰撞框大小 --- #### **最终效果** 当玩家/物体进入碰撞区域时,自动切换播放预设的音乐。可通过调整碰撞组件形状(如球体、胶囊体)适配不同场景需求[^5]。 --- ```plaintext // 扩展应用:添加淡入淡出效果 1. 使用Timeline节点实现音量渐变 2. 添加延迟节点控制切换间隔 ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值