본문으로 건너뛰기
Unreal Engine C++ 기초집LESSON 15

Spawn과 Destroy

난이도초급
예상 시간40분
선수지식14강의 공격 판정

15강. Spawn과 Destroy

1. 이번 강의에서 해결할 문제

적 클래스를 하드코딩하고 충돌하는 위치에 생성해 Spawn이 실패하거나 null 포인터에 접근합니다. 에디터에서 선택한 EnemyBase 자식 클래스를 검사한 뒤 생성합니다.

2. 학습 목표

3. 핵심 개념

SpawnActor는 UClass와 Transform을 받아 World에 Actor를 생성하고 포인터를 반환합니다. 충돌 처리 정책에 따라 위치 조정, 생성 실패 또는 강제 생성이 일어납니다. 반환값은 항상 검사합니다.

Destroy는 Actor를 제거 대상으로 표시하고 World와 엔진이 수명을 정리하게 합니다. Destroy 뒤 멤버 포인터가 즉시 C++ 메모리에서 사라진다고 가정하지 말고 IsValid로 접근을 보호하고 배열에서도 제거합니다.

4. 단계별 실습

파일 경로: Source/TopDownSurvival/Enemies/EnemyBase.h

EnemyBase.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "EnemyBase.generated.h"

UCLASS()
class TOPDOWNSURVIVAL_API AEnemyBase : public ACharacter
{
GENERATED_BODY()

public:
AEnemyBase();

UFUNCTION(BlueprintCallable, Category = "Enemy")
void RequestDespawn();
};

파일 경로: Source/TopDownSurvival/Enemies/EnemyBase.cpp

EnemyBase.cpp
#include "Enemies/EnemyBase.h"

AEnemyBase::AEnemyBase()
{
PrimaryActorTick.bCanEverTick = false;
AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;
}

void AEnemyBase::RequestDespawn()
{
Destroy();
}

파일 경로: Source/TopDownSurvival/Systems/EnemySpawner.h · 추가

EnemySpawner.h · 추가
class AEnemyBase;

UPROPERTY(EditDefaultsOnly, Category = "Spawning")
TSubclassOf<AEnemyBase> EnemyClass;

UPROPERTY(VisibleInstanceOnly, Category = "Spawning")
int32 SpawnedCount = 0;

void SpawnEnemy();

파일 경로: Source/TopDownSurvival/Systems/EnemySpawner.cpp · 추가

EnemySpawner.cpp · SpawnEnemy
#include "Enemies/EnemyBase.h"
#include "Engine/World.h"

void AEnemySpawner::SpawnEnemy()
{
if (!EnemyClass || !GetWorld())
{
UE_LOG(LogTemp, Warning, TEXT("EnemyClass or World is missing"));
return;
}

FActorSpawnParameters Params;
Params.Owner = this;
Params.SpawnCollisionHandlingOverride =
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding;

AEnemyBase* Enemy = GetWorld()->SpawnActor<AEnemyBase>(
EnemyClass, GetActorTransform(), Params);

if (IsValid(Enemy))
{
++SpawnedCount;
UE_LOG(LogTemp, Display, TEXT("Enemy spawned: %s"), *Enemy->GetName());
}
}

void AEnemySpawner::HandleSpawnTimer()
{
SpawnEnemy();
}

Blueprint Editor

BP_EnemyBase를 만들고 Capsule 안에 기본 Cube 또는 Engine Basic Shape를 연결합니다. BP_EnemySpawner의 EnemyClass에 BP_EnemyBase를 지정하고 바닥에서 약간 높은 위치에 배치합니다.

5. 코드가 동작하는 이유

TSubclassOf가 Blueprint 자식 클래스를 안전하게 선택하게 하고 SpawnActor가 그 클래스의 인스턴스를 만듭니다. 충돌 처리 정책이 생성 실패를 허용하므로 반환값 검사가 필수입니다. Owner를 Spawner로 지정하면 생성 출처를 추적하기 쉽습니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

Spawn과 Destroy 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Spawn과 Destroy” 실습을 안전하게 진행하기 위한 판단으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2‘매 프레임 Spawn’ 실수를 판단할 때 “Spawn과 Destroy” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

15강. Spawn과 Destroy 미완료 상태