반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
언리얼 엔진에서 SpawnActor 와 SpawnActorDeferred 는 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
언리얼 엔진에서 SpawnActor 와 SpawnActorDeferred 는 무엇이며, 어떻게 활용할 수 있나요?
답변 >
언리얼 엔진에서 SpawnActor와 SpawnActorDeferred는 런타임에 액터를 생성하기 위한 함수입니다. 두 함수 모두 UWorld 클래스의 멤버이며, 액터를 동적으로 생성할 때 사용됩니다. 이 둘의 주요 차이점은 액터 초기화 시점과 세부적인 제어 가능성에 있습니다.
1. SpawnActor
SpawnActor는 액터를 즉시 생성 및 초기화하는 함수입니다. 생성과 동시에 모든 초기화 및 구성 작업이 완료됩니다.
구문
AActor* SpawnActor<T>(
UClass* Class,
const FTransform& Transform,
const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters()
);
특징
- 즉시 초기화:
- 액터가 생성된 직후 생성자(Constructor)와 BeginPlay가 호출됩니다.
- 간편성:
- 기본적인 액터 생성에 적합.
- 제한된 커스터마이징:
- 생성 후 추가적인 데이터 초기화가 필요할 경우 불편.
2. SpawnActorDeferred
SpawnActorDeferred는 액터를 지연 생성하는 함수입니다. 액터의 초기화 및 BeginPlay 호출을 연기하며, 생성 후 추가적인 초기화 작업을 수행할 수 있습니다.
구문
AActor* SpawnActorDeferred<T>(
UClass* Class,
const FTransform& Transform,
AActor* Owner = nullptr,
APawn* Instigator = nullptr,
ESpawnActorCollisionHandlingMethod CollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn
);
특징
- 초기화 지연:
- 생성자의 기본 초기화만 수행되며, BeginPlay는 호출되지 않음.
- 추가 초기화 가능:
- 생성된 액터에 필요한 추가 데이터를 설정 가능.
- 최종화 필요:
- 초기화 완료 후 FinishSpawningActor를 호출하여 액터를 최종화.
3. SpawnActor와 SpawnActorDeferred의 차이
특성 | SpawnActor | SpawnActorDeferred |
초기화 시점 | 생성 즉시 초기화 | 생성 후 수동으로 초기화 |
BeginPlay 호출 시점 | 즉시 호출 | FinishSpawningActor 호출 시 호출 |
사용 용도 | 간단한 액터 생성 | 세부적인 초기화가 필요한 액터 생성 |
사용 예 | 일반적인 발사체, 아이템, 적 스폰 | 초기값이 필요한 액터, 복잡한 스폰 로직 |
4. SpawnActorDeferred 사용 방법
예제: 초기화 데이터를 설정해야 하는 액터 스폰
1) 액터 클래스 정의
UCLASS()
class MYGAME_API AMyActor : public AActor
{
GENERATED_BODY()
public:
void InitializeData(int32 InitialValue);
private:
int32 Data;
};
2) 초기화 함수 구현
void AMyActor::InitializeData(int32 InitialValue)
{
Data = InitialValue;
}
3) 액터 생성 및 초기화
void AMySpawner::SpawnCustomActor()
{
if (MyActorClass)
{
FVector SpawnLocation(100.0f, 100.0f, 50.0f);
FRotator SpawnRotation(0.0f, 0.0f, 0.0f);
// 액터 생성 (지연 초기화)
AMyActor* SpawnedActor = GetWorld()->SpawnActorDeferred<AMyActor>(
MyActorClass,
FTransform(SpawnRotation, SpawnLocation),
this,
nullptr,
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn
);
if (SpawnedActor)
{
// 추가 초기화 작업 수행
SpawnedActor->InitializeData(42);
// 생성 완료 및 BeginPlay 호출
UGameplayStatics::FinishSpawningActor(SpawnedActor, FTransform(SpawnRotation, SpawnLocation));
}
}
}
5. 활용 사례
SpawnActor 활용 예
간단한 발사체 생성
- 초기화가 복잡하지 않은 발사체, 아이템 등.
void AMyCharacter::Fire()
{
FVector MuzzleLocation = GetActorLocation();
FRotator MuzzleRotation = GetActorRotation();
AMyProjectile* Projectile = GetWorld()->SpawnActor<AMyProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation);
}
SpawnActorDeferred 활용 예
상태를 가진 적 생성
- 적이 특정 상태나 데이터를 가진 채로 스폰되어야 하는 경우.
void AEnemySpawner::SpawnEnemyWithState()
{
FVector SpawnLocation = GetActorLocation();
FRotator SpawnRotation = GetActorRotation();
AEnemy* SpawnedEnemy = GetWorld()->SpawnActorDeferred<AEnemy>(
EnemyClass,
FTransform(SpawnRotation, SpawnLocation)
);
if (SpawnedEnemy)
{
// 초기 상태 설정
SpawnedEnemy->SetEnemyType(EEnemyType::Boss);
SpawnedEnemy->SetHealth(500);
// 생성 완료
UGameplayStatics::FinishSpawningActor(SpawnedEnemy, FTransform(SpawnRotation, SpawnLocation));
}
}
6. 주의사항
- FinishSpawningActor 호출 누락 방지:
- SpawnActorDeferred로 생성된 액터는 반드시 FinishSpawningActor를 호출해야 게임 월드에 추가되고 BeginPlay가 호출됩니다.
- 콜리전 처리:
- 스폰 위치의 충돌 처리 방식(예: AlwaysSpawn, AdjustIfPossible)을 명확히 설정.
- 클래스 유효성 검사:
- SpawnActor와 SpawnActorDeferred는 스폰할 클래스가 nullptr이면 충돌하거나 실패할 수 있으므로 사전 확인 필요.
7. 요약
- SpawnActor: 즉시 초기화가 필요한 간단한 액터 생성에 사용.
- SpawnActorDeferred: 초기화 작업이 필요한 복잡한 액터 생성에 사용.
- 필요에 따라 두 함수를 적절히 활용하여 게임플레이의 동적 요소를 유연하게 구현할 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
반응형