Unreal5 Hit C++

Unreal5 Hit C++

코드 수정 및 작성.

BoxTraceSingle함수를 이용해 시작점과 끝점 사이에 있는 경로에서 박스 모양의 검출 영역을 가진 레이를 발사해서 가장 처음 부딪힌 물체의 정보를 반환하는 방식을 사용할 겁니다.

Item.cpp파일의 생성자에서 RootComponent를 item mesh로 설정합니다.

(이거 깜빡하고 했다가 안돼서 당황했음.)

AItem::AItem()
{
 	// 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;
	//#include "Components/StaticMeshComponent.h"
	ItemMesh = CreateDefaultSubobject<UStaticMeshComponent>("ItemMesh");
	ItemMesh->SetupAttachment(GetRootComponent());
	RootComponent = ItemMesh;
	//#include "Components/SphereComponent.h" 추가.
	Sphere = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
	Sphere->SetupAttachment(ItemMesh);
}

Weapon.h에서 BoxOverlap이벤트 등을 추가합니다.

protected:
	virtual void BeginPlay() override;
	UFUNCTION()
	void OnBoxOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
	
private:
	/*Attack*/
	UPROPERTY(VisibleAnywhere, Category = "Weapon Properties")
	UBoxComponent* WeaponBox;
	UPROPERTY(VisibleAnywhere)
	USceneComponent* BoxTraceStart;
	UPROPERTY(VisibleAnywhere)
	USceneComponent* BoxTraceEnd;

Weapon.cpp 전체코드.

EDrawDebugTrace::ForDuration을 사용하면, 디브그용 라인과 적중 위치가 일정 시간 동안 화면에 표시됩니다.

BoxHit 레이캐스트가 성공하면 True가 되며, 적중 위치와 물체에 대한 정보를 포함합니다.

즉, 이 코드는 BoxTraceSingle함수에서 히트한 물체와 히트 위치를 나타내는 FHitResult구조체를 BoxHit변수에 저장하고, 디버그용 라인과 적중 위치가 일정시간 화면에 표시되도록 하는 코드입니다.

이 코드를 토대로, 맞은 부분의 Blood이펙트를 재생하거나 하는 등의 활용을 할 수 있습니다.

#include "Item/Weapons/Weapon.h"
/*Equip*/
#include "Engine/EngineTypes.h"
#include "Components/SphereComponent.h"
/*Attack collision*/
#include "Components/BoxComponent.h"
#include "Kismet/KismetSystemLibrary.h"
AWeapon::AWeapon()//생성자.
{
	/*Attack*/
	WeaponBox = CreateDefaultSubobject<UBoxComponent>(TEXT("Weapon Box"));
	WeaponBox->SetupAttachment(GetRootComponent());
	//ECollisionEnabled::QueryOnly = 충돌검사를 활성화하고, 검사는 진행하되, 충돌 이벤트를 발생시키지는 않음.
	WeaponBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);
	//충돌을 알려주는데 차단하거나, 무시하지는 않음.
	WeaponBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Overlap);
	WeaponBox->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Ignore);//pawn은 무시.

	BoxTraceStart = CreateDefaultSubobject<USceneComponent>(TEXT("Box Trace Start"));
	BoxTraceStart->SetupAttachment(GetRootComponent());

	BoxTraceEnd = CreateDefaultSubobject<USceneComponent>(TEXT("Box Trace End"));
	BoxTraceEnd->SetupAttachment(GetRootComponent());
}
void AWeapon::BeginPlay()
{
	Super::BeginPlay();
	WeaponBox->OnComponentBeginOverlap.AddDynamic(this, &AWeapon::OnBoxOverlap);
}
void AWeapon::Equip(USceneComponent* InParent, const FName& InSocketName)
{
	AttachMeshToSocket(InParent, InSocketName);
	//#include "Components/SphereComponent.h"
	if (Sphere) {
		Sphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);
	}
}
void AWeapon::AttachMeshToSocket(USceneComponent* InParent, const FName& InSocketName)
{
	//#include "Engine/EngineTypes.h"
	FAttachmentTransformRules TransformRules(EAttachmentRule::SnapToTarget, true);
	ItemMesh->AttachToComponent(InParent, TransformRules, InSocketName);
}
void AWeapon::OnBoxOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	const FVector Start = BoxTraceStart->GetComponentLocation();
	const FVector End = BoxTraceEnd->GetComponentLocation();
	TArray<AActor*> ActorsToIgnore;
	ActorsToIgnore.Add(this);
	//#include "Kismet/KismetSystemLibrary.h"
	FHitResult BoxHit;
	UKismetSystemLibrary::BoxTraceSingle(this,Start,End, FVector(5.f, 5.f, 5.f),BoxTraceStart->GetComponentRotation(), ETraceTypeQuery::TraceTypeQuery1,
		false,ActorsToIgnore,EDrawDebugTrace::ForDuration, BoxHit,true);
}

설정하기.

BP_Weapon으로 가서 충돌할 물체 Collision설정 좀 대충 해줍니다.

그리고, Weapon Box, Box Trace Start, Box Trace End설정을 해줍니다.

결과.

이런 식으로 나옵니다.

표시가 잘 되기는 합니다. 근데 아직 문제가 있네요.

BoxOverlap이벤트가 시도 때도 없이 발생해서 바닥에도 표시되고 그냥 걸어가서 부딪쳐도 Hit가 표시됩니다.

 

Designed by JB FACTORY