UE4 重叠和碰撞事件的相应

在UE4刚开始学习碰撞检测的时候,发现重叠事件和碰撞相应函数无法调用,经过自己反复实验,找到了一些机制,现在记录下来。

  1. 首先定义一个Actor用来检测重叠事件和碰撞事件
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "OverlapActor.generated.h"

UCLASS()
class TRACELENGTH_API AOverlapActor : public AActor {
	GENERATED_BODY()

public:
	// Sets default values for this actor's properties
	AOverlapActor();

	UPROPERTY(VisibleAnywhere, Category = "Pickup")
	class UStaticMeshComponent* PickupMesh;
	UPROPERTY(VisibleAnywhere, Category = "Pickup")
	class UBoxComponent* OverlapBox;
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:
	// Called every frame
	virtual void Tick(float DeltaTime) override;
	UFUNCTION()
	void BeginOverlap(UPrimitiveComponent*OverlappedComponent, AActor* OtherActor, UPrimitiveComponent*OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
	UFUNCTION() 
	void EndOverlap(UPrimitiveComponent*OverlappedComponent, AActor* OtherActor, UPrimitiveComponent*OtherComp, int32 OtherBodyIndex);

	UFUNCTION()
	void ComponentHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);

};

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


#include "OverlapActor.h"
#include "Components/StaticMeshComponent.h"
#include "Components/BoxComponent.h"


// Sets default values
AOverlapActor::AOverlapActor() {
	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	PickupMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PickupMesh"));
	SetRootComponent(PickupMesh);

	OverlapBox = CreateDefaultSubobject<UBoxComponent>(TEXT("OverlapBox"));
	OverlapBox->SetupAttachment(GetRootComponent());

}

// Called when the game starts or when spawned
void AOverlapActor::BeginPlay() {
	Super::BeginPlay();
	OverlapBox->OnComponentBeginOverlap.AddDynamic(this, &AOverlapActor::BeginOverlap);
	OverlapBox->OnComponentEndOverlap.AddDynamic(this, &AOverlapActor::EndOverlap);

	PickupMesh->OnComponentHit.AddDynamic(this,	&AOverlapActor::ComponentHit);
}

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

}

void AOverlapActor::BeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) {
	UE_LOG(LogTemp, Warning, TEXT("BeginOverlap"));
}

void AOverlapActor::EndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) {
	UE_LOG(LogTemp, Warning, TEXT("EndOverlap"));
}

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


对应的蓝图如下:
在这里插入图片描述
2. 设置场景
在场景中仿真这个Actor,并且放置一个立方体Cube2在它的正上方,用来检测重叠和碰撞事件
在这里插入图片描述
3. 检测重叠事件
3.1. 勾选Cube2 ,【细节面板】->【物理】->【模拟物理】和【启用重力】
在这里插入图片描述
3.2. 勾选 Cube2【碰撞】->【生产重叠事件】
在这里插入图片描述
3.3. 勾选BP_OverlapActor下的OverlapBox->【生产重叠事件】
在这里插入图片描述
这样就可以检测重叠事件了,当运行的时候,上方的立方体掉落下来,日志中就会输出相应的信息
在这里插入图片描述
4. 检测碰撞事件
只有勾选向BP_OverlapActor下面的组件PickupMesh->【模拟生产命中事件】
在这里插入图片描述
运行日志就会打印出来碰撞日志
在这里插入图片描述

3.碰撞检测还有另外一种方法,就是在Actor中实现函数NotifyActorBeginOverlap

当Actor与另外一个Actor触发时的重叠时的触发事件,例如一个玩家走进触发器;当物体阻塞发生碰撞时,撞击墙壁,
注意 bGenerateOverlapEvents 必须为 true;

public:
	void NotifyActorBeginOverlap(AActor* otherActor)override;
void ATestActor::NotifyActorBeginOverlap(AActor* otherActor) {
	Super::NotifyActorBeginOverlap(otherActor);

	AGameCharacter* gameCharacter = Cast<AGameCharacter>(otherActor);
	if (gameCharacter){
		GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("ATestActor::NotifyActorBeginOverlap"));
	}
}

aaa

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UE Sequence动态绑定是一种程序设计概念,通常用于游戏开发中的角色动作设计。在UE4游戏引擎中,通过使用UE Sequence可以轻松地创建复杂的动画序列。 动态绑定是指将UE Sequence动画序列与游戏角色的动作进行关联。实际上,动态绑定允许开发人员在游戏运行为角色指定不同的动画序列。 在动态绑定过程中,首先需要创建一个UE Sequence来定义角色的动画行为。这个序列可以包含各种动作,包括移动、攻击、跳跃等等。然后,将这个动画序列与角色进行绑定。在游戏运行,只需通过代码或者蓝图将动画序列赋予角色的动作接口,便能够实改变角色的动画表现。 动态绑定的好处是方便灵活。通过使用UE Sequence的动态绑定功能,开发人员可以根据游戏运行的情况来改变角色的动画行为,从而实现更加丰富多样的角色表现。比如,在某个情况下,可以将角色的攻击动作绑定到一个特定的动画序列,而在另一个情况下,则可以绑定到另一个动画序列。这样,可以根据角色的状态和环境来动态调整动画,增加游戏的可玩性和真实感。 总之,UE Sequence动态绑定是一种强大的工具,可以实现在游戏中根据角色的动作需求实变化动画表现的功能。通过动态绑定,开发人员能够更好地控制和定制游戏角色的动画行为,提升游戏的质量和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值