에디터로 만들었던 GameOverTrigger를 StartLevel 함수에서 스폰하기 위해 C++ 클래스로 생성해서 씬컴포넌트, 스태틱메시컴포넌트, 박스컴포넌트를 붙였다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "GameOverTrigger.generated.h"
class UBoxComponent;
UCLASS()
class UNREAL_CPP_STUDY_API AGameOverTrigger : public AActor
{
GENERATED_BODY()
public:
AGameOverTrigger();
UPROPERTY(VisibleAnywhere)
USceneComponent* Scene;
UPROPERTY(EditDefaultsOnly)
UStaticMeshComponent* StaticMesh;
UPROPERTY(EditDefaultsOnly)
UBoxComponent* Box;
};
#include "GameOverTrigger.h"
#include "Components/BoxComponent.h"
AGameOverTrigger::AGameOverTrigger()
{
Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
SetRootComponent(Scene);
StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
StaticMesh->SetupAttachment(Scene);
Box = CreateDefaultSubobject<UBoxComponent>(TEXT("GameOverBox"));
Box->SetupAttachment(StaticMesh);
PrimaryActorTick.bCanEverTick = false;
}
에디터에서 GameOverTrigger를 블루프린트로 만들고 크기를 맵 크기에 맞게 키우고 머티리얼을 빨간색으로 적용했다.
스태틱 메시의 콜리전을 No Collision으로 설정하고 Box콜리전에 닿으면 OnGameOver 함수가 호출되도록 구현했다.


90초에 걸쳐서 위로 서서히 올라오는 효과를 InterpToMovement 컴포넌트를 사용해서 구현했다.

그 후 레벨 3이 시작될 때 이 액터가 스폰되는 로직을 JinGameState의 StartLevel 함수에서 구현했다.
// JinGameState.h
UPROPERTY(EditAnywhere)
TSubclassOf<AGameOverTrigger> GameOverTriggerClass;
// JinGameState.cpp
void AJinGameState::StartLevel()
{
bEndLevel = false;
bIsTrigger = false;
if (UGameInstance* GameInstance = GetGameInstance())
{
if(UJinGameInstance* JinGameInstance = Cast<UJinGameInstance>(GameInstance))
{
CurrentLevelIndex = JinGameInstance->CurrentLevelIndex;
UE_LOG(LogTemp, Warning, TEXT("Level: %d Start!"), CurrentLevelIndex + 1);
switch (CurrentLevelIndex) // 레벨에 따라 스폰 위치 정하기
{
case 1:
StartLocation = { -5200, 6310, 92 };
break;
case 2: // 여기가 레벨 3일때 실행되므로 여기에 추가함.
StartLocation = { 3250, -10, 92 };
GetWorld()->SpawnActor<AGameOverTrigger>(
GameOverTriggerClass,
FVector(4310, -2660, -400),
FRotator::ZeroRotator
);
break;
}
에디터의 BP_JinGameState에서 GameOverTriggerClass에 BP_GameOverTrigger를 넣어줬다.

여기까지 하고 테스트를 해보니 레벨 1, 2에서는 스폰이 안되고 3에서만 스폰이 되는게 확인이 됐고 시간이 흐르면 점점 올라오는 로직도 잘 실행이 됐다.

다음으로 올라가는 길에 SpawnVolume을 배치해서 아이템을 스폰이 되도록 했다.

레벨 3에 배치된 SpanwVolume의 액터 태그에 3을 입력해줬다.

테스트를 해보니 레벨 1, 2의 SpawnVolume에는 아이템이 스폰이 되지 않고 레벨 3에서만 스폰이 되는게 확인이 됐다.

이제 올라가는 길에 이동을 방해하는 장애물을 만들어야 한다.
장애물로 생각한것은 벽에서 왔다갔다 하는 장애물과 회전하는 망치 장애물이다.
우선 실린더를 3개 붙여서 회전축과 망치를 만들었다.

0과 1을 랜덤하게 받아서 회전하는 방향을 랜덤하게 회전하도록 구현했다.

부딪혔을 때 별로 방해가 되지 않는 것 같아서 부딪히면 캐릭터의 반대 방향으로 살짝 날아가도록 구현했다.

레벨 3에 배치하고 레벨 2에 썼던 BounceTrap도 배치했다.

내일은 벽에서 나오는 장애물과 도전 과제들을 하나씩 구현해 볼 예정이다.
'개인 프로젝트(과제)' 카테고리의 다른 글
| 8번과제 - 도전 과제 2, 3번 (0) | 2025.10.14 |
|---|---|
| 8번과제 장애물 만들기2, 도전 과제 1번 (0) | 2025.10.13 |
| 8번과제 맵 만들기 - 레벨3 (0) | 2025.10.08 |
| 8번과제 레벨 2 맵에 아이템 스폰하기 (0) | 2025.10.07 |
| 8번과제 맵 만들기 - 레벨2 (0) | 2025.10.06 |