suppresswisely 2025. 3. 23. 18:15

US_BasePickup.cpp 생성자

AUS_BasePickup::AUS_BasePickup()
{
	PrimaryActorTick.bCanEverTick = true;

	SphereCollision = CreateDefaultSubobject<USphereComponent>("Collision");
	RootComponent = SphereCollision;
	SphereCollision->SetGenerateOverlapEvents(true);
	SphereCollision->SetSphereRadius(200.0f);

	Mesh = CreateDefaultSubobject<UStaticMeshComponent>("Mesh");
	Mesh->SetupAttachment(SphereCollision);
	Mesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);

	bReplicates = true;
}
  • SphereCollision = CreateDefaultSubobject<USphereComponent>("Collision")
    USphereComponent 타입의 "Collision"이라는 이름의 구체 충돌 컴포넌트를 생성한다.
  • RootComponent = SphereCollision
    생성된 구체 충돌 컴포넌트를 액터의 루트 컴포넌트로 설정한다.
  • SphereCollision->SetGenerateOverlapEvents(true)
    구체 충돌 컴포넌트가 오버랩 이벤트를 생성하도록 설정한다.
  • SphereCollision->SetSphereRadius(200.0f)
    구체 충돌 컴포넌트의 반경을 설정한다.
  • Mesh = CreateDefaultSubobject<UStaticMeshComponent>("Mesh")
    UStaticMeshComponent 타입의 "Mesh"라는 이름의 정적 메시 컴포넌트를 생성한다.
  • Mesh->SetupAttachment(SphereCollision)
    메시 컴포넌트를 구체 충돌 컴포넌트의 자식으로 설정한다.
  • Mesh->SetCollisionEnabled(ECollisionEnabled::NoCollision)
    메시 컴포넌트의 충돌을 비활성화한다. 
  • bReplicates = true
    이 액터가 네트워크 상에서 복제될 수 있도록 설정한다.

위 코드에서 중요한 것은 이번에는 bReplicates로 볼 수 있다. Pickup이라는 클래스명만 봐도 드롭 아이템을 암시하는 것을 알 수 있다. 그렇기에 아이템을 클라이언트에게 보여줘야 하기 때문에 복제가 가능하도록 한 것으로 보인다.

US_BasePickup.cpp BeginPlay(), OnBeginOverlap(), Pickup_Implementation()

void AUS_BasePickup::BeginPlay()
{
	Super::BeginPlay();

	SphereCollision->OnComponentBeginOverlap.AddDynamic(this, &AUS_BasePickup::OnBeginOverlap);
}

void AUS_BasePickup::OnBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, 
	UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	if (const auto Character = Cast<AUS_Character>(OtherActor))
	{
		Pickup(Character);
	}
}

void AUS_BasePickup::Pickup_Implementation(AUS_Character* OwningCharacter)
{
	SetOwner(OwningCharacter);
}

 

BeginPlay()

SphereCollision->OnComponentBeginOverlap.AddDynamic(this, &AUS_BasePickup::OnBeginOverlap) 이 부분을 이해하기 위해 조사해보면 델리게이트라는 개념이 먼저 나온다. 즉, 해당 함수는 델리게이트 패턴으로 이루어져 있으며, OnComponentBeginOverlap은 블루프린터에서 사용한 적이 있어 설명은 참고 글로 생략하겠다.

 

 

 

[언리얼 엔진 5] 언리얼 엔진에서의 OnTriggerEnter (OnComponentBeginOverlap)

유니티로 게임을 개발해본 사람은, OnTriggerEnter 혹은 OnCollisionEnter를 사용하여 무언가 이벤트가 발생하도록 해본 경우가 많을 것이다. 언리얼 엔진에서는 비슷한 것으로 OnComponentBeginOverlap 델리게

ciel45.tistory.com

 

AddDynamic은 바인딩하는 역할을 한다. 지금은 UObject 클래스에서 UFUNCTION으로 정의된 함수이다. UFUNCTION 매크로로 선언되어 있어서 AddDynamic을 사용한 것이다.

 

 

AddUObject vs AddDynamic vs AddUFunction

다음의 세 함수는언리얼에서 함수 델리게이트에 바인딩할 때 호출하는 함수이다. 1. AddUObjectButton->OnClicked.AddUObject(this, &AMyActor::OnButtonClicked);- UObject를 상속한 클래스의 함수 또는 객체 전체를 델

mentum.tistory.com

 

OnBeginOverlap()

해당 함수는 매개변수가 많은데, 이러한 바인딩에 필요한 매개변수를 확인해야 한다. 방법은 다양하지만, 언리얼 문서를 찾아봐도 명확히 명시된 곳은 아직 찾지 못했다. 다만 엔진 코드에서 매크로로 할당된 부분을 확인하는 것이 가장 명확해 보인다. 이러한 과정 말고 더 좋은 방법이 있다면 나중에 서술하도록 하겠다.

 

 

[언리얼5] 언리얼CPP 자주 사용하는 이벤트 바인딩 참고

언리얼엔진에서 게임 오브젝트 간의 상호 작용을위한 이벤트(함수)와 필요한 매개변수OnComponentHit액터의 컴포넌트가 다른 오브젝트와 충돌했을 때 호출되는 이벤트입니다. 이 이벤트는 물리적

rhksgml78.tistory.com

 

위 글은 자주 사용되는 이벤트 바인딩에 필요한 매개변수를 서술한 것이다.

 

Pickup_Implementation()

UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Pickup", meta = (DisplayName = "Pickup"))
void Pickup(class AUS_Character* OwningCharacter);

 

사실 헤더 파일에는 Pickup()을 위와 같이 선언하였다. 이는 블루프린터에서 오버라이드하기 위해 위와 같이 선언할 필요가 있다.

 

 

 

언리얼 C++ to BP: BlueprintNativeEvent 매크로로 C++함수 오버라이드 하기

Unreal Engine에서 C++로 선언된 함수를 블루프린트에서 오버라이드하려면, 함수 선언에 BlueprintNativeEvent 매크로를 사용해야 합니다. 또한, 해당 함수를 virtual로 선언하여 C++에서도 오버라이드할 수

oddsilk.com

 

위 글을 보면 이러한 기능을 활용하기 위해 소스 파일에서 _Implementation 접미사가 붙은 함수를 정의해야 한다고 서술되어 있다. 즉, 해당 함수는 Pickup()을 블루프린터에서 오버라이드하기 위해 사용된다.

그렇다면 이 함수는 왜 오버라이드가 필요할까? Pickup()은 드롭 아이템을 주었을 때 발생하도록 작성할 것이다.
드롭 아이템의 종류는 다양할 것이고, 이에 맞는 Pickup() 함수가 필요할 것이다.

또한 코드를 보면 SetOwner()가 눈에 띄는데, 이는 액터의 소유자를 설정한다. 즉, AUS_BasePickup의 소유자를 AUS_Character로 설정하고 있다. 이를 통해 아이템의 효과를 Character에 적용할 수 있을 것이다.