본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 37. 파괴가능한 액터


목차

  1.  C++ 파괴 가능한 액터 만들기
  2. 블루프린트 파괴 가능한 액터 만들기

1. C++ 파괴가능한 액터 만들기

 

현재 우리는 파괴가능한 매시, 지오메트리콜렉션을 만들었고 이를 기반으로 액터를 생성하려고 한다.

 

액터로 만드는 이유는 이 매시에 여러가지 기능을 주기위해서인데 대표적으로 전에 말했던 파괴시 카메라 충돌 방지등을 구현할 것이다.

 

 

해당 콜렉션을 AI든 플레이어든 소유할 일이 없으니 그냥 Actor 기반 C++ 클래스로 만들면 된다.

 

클래스를 생성하고 가장 먼저 필요한 것은 구성요소 일 것이다. 

 

private:
	UPROPERTY(VisibleAnywhere)
	class UGeometryCollectionComponent* GeometryCollection;

 

이제 생성자에서 실제로 할당해주자.

 

#include "GeometryCollection/GeometryCollectionComponent.h"

ABreakableActor::ABreakableActor()
{
	PrimaryActorTick.bCanEverTick = false;

	GeometryCollection = CreateDefaultSubobject<UGeometryCollectionComponent>(TEXT("GeometryCollection"));
	SetRootComponent(GeometryCollection);	
	GeometryCollection->SetGenerateOverlapEvents(true);

}

 

지오메트리콜렉션을 생성하고 이것을 루트컴포넌트로 설정한 뒤 오버랩 이벤트를 발생시키도록 해주었다.

 

이제 이대로 컴파일 하면 컴파일에 실패한다. 실패원인을 찾으려고 몇십분 뻘짓을 했는데 원인은 아주 간단한데 있었다. (챗GPT가 5초만에 알려줬다...)

 

 

언리얼 문서에 들어가면 모듈이 필요한 것을 볼 수 있다.

 

빌드cs 파일로 들어가서 모듈을 추가해주자.

 

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "GeometryCollectionEngine" });

 

이제 컴파일이 무사히 성공하는 것을 볼 수 있다.

 

이제 C++ 클래스를 만들었으니 이를 기반으로 블루프린트 클래스도 만들자.


2. 블루프린트 파괴 가능한 액터 만들기

 

 

 

블루프린트 클래스를 만들면 디테일 패널에서 RestCollection을 볼 수 있다.

이곳에서 우리가 만든 지오메트리 콜렉션을 설정할 수 있다.

 

이제 카메라 충돌을 방지할 것이다.

 

생성자에 아래 구문을 추가하자.

GeometryCollection->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);

 

현재는 단순하게 액터에 카메라를 충동하지 않게 설정하였다. 처음부터 충돌을 안하는 것이 아닌 부서진 후 충돌 방지도 물론 구현할 수 있다.

 

부시전 후 반응을 어떻게 적용해주어야 할까?

 

현재 우리의 클래스에는 인터페이스가 존재하고 그곳에서 히트반응 GetHit() 함수가 존재한다.

 

인터페이스를 상속받아보자.

 

// ...
#include "Interface/HitInterface.h"
#include "BreakableActor.generated.h"

class PRACTICE_API ABreakableActor : public AActor, public IHitInterface
{
// ...
}

 

이제 GetHit 함수를 오버라이드 하자.

 

public:	
	ABreakableActor();
	virtual void Tick(float DeltaTime) override;

	virtual void GetHit(const FVector& ImpactPoint) override;

 

함수의 구현은 이어서 하도록 하겠다.