본문 바로가기
프로그래밍

👨‍💻 [Unreal] 언리얼 엔진에서 스포닝 (Spawning) 이란 무엇이고, 어떻게 활용할 수 있나요?

by 밝음의기둥 2024. 12. 27.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

언리얼 엔진에서 스포닝 (Spawning) 이란 무엇이고, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

언리얼 엔진에서 스포닝 (Spawning) 이란 무엇이고, 어떻게 활용할 수 있나요?

답변 >

스포닝(Spawning)은 언리얼 엔진에서 게임 중에 객체를 동적으로 생성하는 것을 의미합니다. 이 객체는 액터(Actor), 캐릭터(Character), 발사체(Projectile), 적(Enemy) 등 다양한 유형이 될 수 있습니다. 스포닝은 사전 배치된 객체만 사용하는 것이 아니라, 런타임에 필요한 객체를 생성하여 게임플레이의 동적 요소를 강화하는 데 사용됩니다.


1. 스포닝의 주요 특징

  • 동적 생성: 게임 실행 중 특정 조건에서 액터를 생성.
  • 메모리 관리: 필요하지 않은 객체는 파괴하여 리소스를 효율적으로 사용.
  • 블루프린트와 C++: 두 가지 방식으로 쉽게 구현 가능.
  • 네트워크 지원: 멀티플레이 환경에서 서버에서 객체를 스폰하여 클라이언트와 동기화.

2. 스포닝의 기본 구성 요소

  1. 클래스(Class): 스폰할 액터의 유형(예: MyEnemy, MyProjectile).
  2. 위치(Location): 생성될 월드의 위치.
  3. 회전(Rotation): 생성될 액터의 방향.
  4. Owner: 생성된 액터의 소유자(옵션).

3. 스포닝 구현 방법

3.1 블루프린트에서 스포닝

1) Spawn Actor from Class 노드 사용

  • Class: 생성할 액터 클래스 선택.
  • Spawn Transform: 생성 위치와 회전 지정.
  • Owner: 생성된 액터의 소유자를 지정(옵션).

활용 예:

  • 총알을 발사할 때 발사체 생성.
  • 적 생성기(Spawner)가 주기적으로 몬스터를 스폰.

2) 실제 블루프린트 예시

  1. 액션을 트리거(예: 키 입력, 이벤트)로 연결.
  2. Spawn Actor from Class 노드를 연결하여 특정 클래스를 스폰.

3.2 C++에서 스포닝

1) SpawnActor 함수 사용

언리얼 엔진의 UWorld 클래스의 SpawnActor 함수는 C++에서 객체를 생성하는 데 사용됩니다.

void AMyActor::SpawnMyActor()
{
    // 스폰할 클래스 설정
    TSubclassOf<AActor> ActorToSpawn = MyActorClass;

    if (ActorToSpawn) // 유효성 확인
    {
        FVector SpawnLocation(100.0f, 100.0f, 50.0f); // 위치
        FRotator SpawnRotation(0.0f, 0.0f, 0.0f);    // 회전

        // 액터 생성
        AActor* SpawnedActor = GetWorld()->SpawnActor<AActor>(ActorToSpawn, SpawnLocation, SpawnRotation);

        if (SpawnedActor)
        {
            UE_LOG(LogTemp, Warning, TEXT("Actor spawned successfully!"));
        }
    }
}

2) 스폰 시 초기화 값 전달

스폰 시 설정 값을 전달하려면 **FActorSpawnParameters**를 사용할 수 있습니다.

FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this;              // 소유자 설정
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;

AActor* SpawnedActor = GetWorld()->SpawnActor<AActor>(MyActorClass, SpawnLocation, SpawnRotation, SpawnParams);


4. 스포닝 활용 사례

4.1 발사체 생성

  • 총알, 로켓, 화살 등 발사체를 플레이어의 무기에서 생성.
void AMyCharacter::Fire()
{
    if (ProjectileClass)
    {
        FVector MuzzleLocation = GetActorLocation() + FVector(100, 0, 50); // 총구 위치
        FRotator MuzzleRotation = GetControlRotation(); // 플레이어가 바라보는 방향

        FActorSpawnParameters SpawnParams;
        SpawnParams.Owner = this;

        // 발사체 생성
        GetWorld()->SpawnActor<AProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);
    }
}


4.2 적 생성

  • 적 생성기(Spawner)를 사용하여 주기적으로 적을 스폰.

블루프린트:

  1. Timer를 사용하여 일정 시간마다 Spawn Actor from Class를 호출.
  2. 스폰된 적이 플레이어를 추적하거나 이동.

C++:

void AMySpawner::SpawnEnemy()
{
    if (EnemyClass)
    {
        FVector SpawnLocation = GetActorLocation(); // 스포너 위치
        FRotator SpawnRotation = FRotator::ZeroRotator;

        GetWorld()->SpawnActor<AEnemy>(EnemyClass, SpawnLocation, SpawnRotation);
    }
}


4.3 환경 객체 생성

  • 파괴 가능한 환경 객체, 파워업 아이템, 무작위 위치의 장애물 생성.
  • 예: 플레이어가 특정 조건을 충족하면 아이템 생성.

5. 스포닝과 네트워크

  • 서버에서만 스폰: 멀티플레이 환경에서 모든 스폰 로직은 서버에서 실행.
  • 클라이언트와 동기화: 서버에서 스폰된 객체는 자동으로 클라이언트에 복제.
  • 조건 확인: 서버에서 스폰 권한이 있는지 반드시 확인.

6. 스포닝 시 주의사항

  • 콜리전 처리:
    • 생성 위치에서 다른 객체와 충돌하지 않도록 설정.
    • ESpawnActorCollisionHandlingMethod를 사용하여 충돌 방식을 설정.
  • 리소스 관리:
    • 필요하지 않은 객체는 메모리 누수를 방지하기 위해 파괴(Destroy())해야 함.
  • 초기화 로직:
    • 생성된 객체에 초기 데이터를 설정하려면 커스텀 함수 또는 스폰 파라미터를 활용.

스포닝은 게임에서 동적이고 예측 불가능한 요소를 추가하는 데 필수적인 기능입니다. 발사체, 적, 아이템, 환경 객체 등 다양한 상황에서 활용 가능하며, 블루프린트C++ 모두에서 간단하고 강력하게 구현할 수 있습니다.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형