본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 24. 공격중에만 트레이싱 하기


목차

  1. 특정 상황에서만 트레이싱 진행하기

1. 특정 상황에서만 트레이싱 진행하기

 

공격 몽타주에서 노티파이를 이용해서 공격시작지점과 종료지점을 정한 뒤 이 사이에서만 콜리전을 활성화 시킬 것이다.

 

공격 시작 지점과 종료지점 각각 노티파이를 추가하자.

 

이제 C++에서 콜리전을 활성화 시키는 방법을 알아보자. 그전에 활성화를 시키려면 먼저 비활성화 시킬 필요가 있을 것이다.

 

무기 cpp파일로 가서 생성자에서 콜리전을 비활성화 시키자

AWeapons::AWeapons()
{
// 생략
	WeaponBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);
// 생략
}

 

이제 캐릭터 헤더파일에서 블루프린트에서 호출이 가능한 콜리전 활성화/비활성화 함수를 만들 것이다.

 

UFUNCTION(BlueprintCallable)
void EnableWeaponCollision();

UFUNCTION(BlueprintCallable)
void DisableWeaponCollision();

 

함수를 선언했으니 이를 정의해보자. 하지만 그 전에 생각해보면 굳이 이렇게 함수 두개를 만드는 것이 아니라 콜리전 설정을 매개변수로 받아서 콜리전 설정을 할 수 있을 것 같다.

 

매개변수를 받는 함수로 바꿔보자

 

UFUNCTION(BlueprintCallable)
void SetWeaponCollisionEnabled(ECollisionEnabled::Type CollisionEnabled);

 

다음과 같이 함수가 콜리전을 세팅할 수 있다는 의미로 이름을 바꾸고 매개변수로 ECollisionEnabled 열거형을 받을 수 있게 하였다.

 

함수를 정의해보자

 

void AKnight::SetWeaponCollisionEnabled(ECollisionEnabled::Type CollisionEnabled)
{
	if (EquippedWeapon)
	{
		EquippedWeapon-> // 여기서 박스 컴포넌트를 호출
	}
}

 

EquippedWeapon에 있는 박스 컴포넌트를 가져와야하는데 박스 컴포넌트가 현재는 프라이빗 영역에 있다. 이 박스 컴포넌트를 퍼블릭 영역에 옮기기 보다는 Getter를 만들어 가져와보도록 하자.

 

무기 헤더파일로 들어간다.

 

public:
	FORCEINLINE UBoxComponent* GetWeaponBox() const { return WeaponBox; }

 

이렇게 Getter를 만들었으니 이를 이용해 박스 컴포넌트를 가져오자.

#include "Components/BoxComponent.h" // 박스컴포넌트 헤더파일을 가져와야 한다.

void AKnight::SetWeaponCollisionEnabled(ECollisionEnabled::Type CollisionEnabled)
{
	if (EquippedWeapon && EquippedWeapon->GetWeaponBox())
	{
		EquippedWeapon->GetWeaponBox()->SetCollisionEnabled(CollisionEnabled);
	}
}

 

이렇게 하면 박스 컴포넌트의 콜리전을 설정할 수 있다.

 

if문에서 박스 컴포넌트가 있는지 여부또한 체크하여 만약을 대비하였다.

 

이제 컴파일을 해서 블루프린트에서 설정하자

 

 

노티파이에 각각 콜리전을 설정해주면 된다.

 

 

 

이렇게 하면 평소에는 콜리전이 발생하지 않다가 공격시에만 콜리전이 활성화 되는 것을 볼 수 있다.