본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 42. 다양한 보물이 나오게 하기.


목차

  1. 랜덤 보물 만들기
  2. 항아리를 부시면 랜덤한 보물이 나오게 하기

1. 랜덤 보물 만들기

 

보물의 종류를 늘려보자. 보물의 종류를 늘리고 보물마다 주는 골드의 양을 다르게 할 것이다.

 

골드의 양을 다르게 하려면 먼저 골드의 존재가 있어야 한다. 비주얼 스튜디오로 돌아가자.

 

class PRACTICE_API ATreasure : public AItem {

private:	
    UPROPERTY(EditAnywhere, Category = "Treasure Properties")
	int32 Gold;
    
}

 

골드의 양은 에디터에서 조절할 수 있게 하였다.

 

이제 보물들을 여러개 만들고 이 보물마다 골드의 양을 다르게 하고 싶다. 그렇게 하기 위해서는 여러 클래스가 필요할 것이다. 이제 현재 있는 블루프린트 클래스를 기반으로 자식 클래스들을 만들어보자.

 

C++를 기반으로 만드는 것이 아닌 블루프린트 기반으로 만드는 이유는 블루프린트단에서 공통적으로 추가한 사항을 갖고 싶기 때문이다. 클래스에 존재하는 모든 기능을 C++로만 만들면 비효율 적일 것이고 일부는 블루프린트로 만들 필요가 있을 것이다. 그렇기 때문에 베이스 블루프린트 클래스를 기반으로 자식 클래스들을 만들 것이다.

 

통적으로 추가한 사항의 대표로 베이스 보물 클래스 이벤트 그래프에 Tick 마다 보물이 회전하게 하는 기능을 넣었다.

 

이제 자식 클래스를 만들어보자.

 

 

자식 클래스를 만들면 부모 클래스와 별다를 게 없는 것을 볼 수 있다. 하지만 자세히 살펴보자.

 

 

우상단의 부모 클래스가 블루프린트 클래스로 지정되어 있다.

 

 

또한 이벤트 그래프를 살펴보면 부모 클래스와 연결이 되어있는 것을 볼 수 있다.

 

 

이렇게 다양한 보물들을 만들고 이제 이것을 랜덤하게 스폰하는 법을 알아보도록 하자.

 

배열을 사용해서 이를 랜덤하게 스폰해볼 것이다.


2. 항아리를 부시면 랜덤한 보물이 나오게 하기

 

비주얼 스튜디오로 가보자.

 

class PRACTICE_API ABreakableActor : public AActor, public IHitInterface
{

	// ...

private:
	UPROPERTY(EditAnywhere, Category = "Breakable Properties")
	TSubclassOf<class ATreasure> TreasureClass;
    
}

 

현재 보물을 이렇게 변수하나에만 담아서 소환하고 있다. 이제 이 단일 변수에서 배열로 바꾸어보려고 한다.

TArray를 사용할 것인데 탬플릿 타입으로 TSubclassOf<class ATreasure>를 줄것이다.

 

즉 다시할해 T배열의 타입은 TArray<TSubclassOf<class ATreasure>> 이 될것이다.

 

private:
	UPROPERTY(EditAnywhere, Category = "Breakable Properties")
	TArray<TSubclassOf<class ATreasure>> TreasureClasses;

 

이제 이것을 스폰하는 방법을 알아보자. cpp 파일로 가서 스폰할 것이다.

 

void ABreakableActor::GetHit_Implementation(const FVector& ImpactPoint)
{
	UWorld* World = GetWorld();
	if (World && TreasureClasses.Num() > 0)
	{
		FVector Location = GetActorLocation();
		Location.Z += 75.f;

		const int32 Selection = FMath::RandRange(0, TreasureClasses.Num() - 1);

		World->SpawnActor<ATreasure>(TreasureClasses[Selection], Location, GetActorRotation());
	}
}

 

0부터 배열의 수 - 1 사이의 숫자중 랜덤 숫자 하나를 뽑아 해당 배열에 있는 보물을 소환할 것이다. 이렇게 하면 배열의 인덱스를 벗어나 보물을 소환하려는 일 없이 제대로 보물을 소환할 수 있게 될 것이다.

 

 

이제 컴파일 하고 파괴가능한 액터의 블루프린트에 들어가 보물들을 설정해주자.

 

 

 

다양한 보물들이 제대로 소환되는 것을 볼 수 있다.

 

다음에는 항아리의 종류를 늘려볼 것이다.