언리얼4 C++ 보스 스폰

Intro

  • 액터수에 따른 보스 스폰

좀비 수 감소

좀비가 죽을때 실행되는 Death함수에 게임모드의 DercreaseMonster 함수를 추가

AFPSGameMode* gameMode = Cast<AFPSGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
gameMode->DecreaseMonster();
void AFPSGameMode::DecreaseMonster()
{
	RemainZombie--;
	if (RemainZombie == 0)
	{
		Spawnning.Broadcast();
	}
}

DecreaseMonster 함수는 RemainZombie를 감소시키고 0이되면 Spawnning 델리게이트를 브로드캐스트한다.

스포너 액터 추가

보스 좀비 레퍼런스 저장

static ConstructorHelpers::FObjectFinder<UBlueprint> BossZombie(TEXT("Blueprint'/Game/Character/BP_BossZombie.BP_BossZombie'"));
if (BossZombie.Object)
{
    BossActor = (UClass*)BossZombie.Object->GeneratedClass;
}

SpawnBossZombie 함수 구현

void AZombieSpawner::SpawnBossZombieDelay()
{
	UE_LOG(LogTemp, Log, TEXT("Waiting Boss"));
	GetWorld()->GetTimerManager().SetTimer(timer, this, &AZombieSpawner::SpawnBossZombie, 5.0f, false);
}

void AZombieSpawner::SpawnBossZombie()
{
	UWorld* world = GetWorld();
	if (world)
	{
		FActorSpawnParameters SpawnParams;
		SpawnParams.Owner = this;
		FRotator rotator(0, 0, 0);
		FVector  SpawnLocation = GetActorLocation();

		world->SpawnActor<AActor>(BossActor, SpawnLocation, rotator, SpawnParams);
	}
}

5초의 딜레이를 준다음 Spawnner 위치에 보스좀비를 스폰시키게한다.

델리게이트 바인딩

AFPSGameMode* gameMode = Cast<AFPSGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
if (gameMode != nullptr)
{
    gameMode->Spawnning.AddUObject(this, &AZombieSpawner::SpawnBossZombieDelay);
}

Spawnning 델리게이트에 바인딩해준다.

결국 남은 좀비의 숫자가 0이되면 Spawnning이 브로드캐스트되어 5초뒤에 보스좀비가 등장하게된다.

미션 텍스트 추가

미션 텍스트를 추가하고 현재 상황에 따라 애니메이션이 실행되도록 함

1

현재 미션을 나타내는 텍스트를 추가한다음 부모클래스를 BasicWidget으로 교체해준다.

void UBasicWidget::NativeConstruct()
{
	AFPSGameMode* gameMode = Cast<AFPSGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
	if (gameMode != nullptr)
	{
		gameMode->Spawnning.AddUObject(this, &UBasicWidget::TextChange);
	}
}

BasicWidgetTextChange 함수를 바인딩 해준다.

TextChange 블루프린트

2

보스가 스폰되는 5초뒤에 애니메이션을 실행시키도록 한다.

카메라 쉐이크

보스가 스폰될때 화면이 흔들리는 연출을 구현함

카메라 쉐이크 블루프린트 추가

3

1초동안 카메라가 흔들리도록 구현

블루프린트 함수 추가

4

함수 바인딩

void AFPSPlayer::BeginPlay()
{
	Super::BeginPlay();
	if (gameMode != nullptr)
	{
		gameMode->Spawnning.AddUObject(this, &AFPSPlayer::CameraShake);
	}
}

실행 결과

6

5

댓글남기기