본문 바로가기
Unreal Engine5/KDT 2024

[UE5 KDT2024] 31. SpawnActor Deferred

by 유잉유잉유잉 2025. 3. 15.
728x90

 

1. 스폰액터 다른 방식으로 -> 스폰액터 확장편 : SpawnActorDeferred()

 

▶️SpawnActorDeferred() 

: 액터 스폰전 속성이나 함수를 호출하여 값을 미리 세팅할 수 있게 해주는 함수.

- SpawnActorDeferred() 만 호출한다고 액터가 스폰되진 않음. 셋팅만됨.

- 인자

  UClass* Class : UClass 정보 

  FTransform const& Transform : Transform정보 ( 위치, 회전, 크기 )

  AActor* Owner = nullptr : 소유주

  APawn* Instigator = nullptr : SpawnActor 되는 원인을 제공한 Pawn

     ex) 스킬 발사시 스킬을 사용한 플레이어 

  ESpawnActorCollisionHandlingMethod CollisionHandlingOverride =   ESpawnActorCollisionHandlingMethod::Undefined, : 스폰방법 

  ESpawnActorScaleMethod TransformScaleMethod = ESpawnActorScaleMethod::MultiplyWithRoot : 스폰시 스케일을 지정하는 Enum

⭐SpawnActorDeferred() 를 사용할 경우 데이터 셋팅 및 BeginPlay()가 언제 호출될지 조절을 할 수 있어서 좋다. 

 

 

▶️UGameplayStatics::FinishSpawningActor ();

- 이걸 호출해줘야 오브젝트 생성됨

 

 

1) SpawnActorDeferred() 사용하여 몬스터 스폰 

void ASpawnPoint::Respawn()
{
	TObjectPtr<AMonsterBase> spawnMonster = GetWorld()->SpawnActorDeferred<AMonsterBase>
		( mSpawnMonster, FTransform( GetActorRotation(), GetActorLocation()), this, nullptr, ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn );

	if ( IsValid( spawnMonster ) )
	{
		spawnMonster->SetHP( 2, 2 );

		UGameplayStatics::FinishSpawningActor( spawnMonster, FTransform( GetActorRotation(), GetActorLocation() ) );
		mSpawnRemainCnt--;
	}	
}

 

 

2) 몬스터 hp 설정하는 함수 추가 

MonsterBase.h

	UFUNCTION()
	void SetHP(int32 Hp, int32 Hp2);

 

AMonsterBase::AMonsterBase()
{
	..
	mHP  = 0;
	mHP2 = 0;
}


void AMonsterBase::SetHP( int32 Hp, int32 Hp2 )
{
	mHP  = Hp;
	mHP2 = Hp2;
}

 

=> 실행하면 몬스터 스폰이 정상적으로 진행된다.



 


 

 

2. 몬스터 죽었을 때 다시 리스폰 기능 넣기

 

SpawnPoint.h

public :
	UFUNCTION()
	void DieMonster();

 

void ASpawnPoint::DieMonster()
{
	if ( mSpawnRemainCnt <= 0 )
		return;

	mSpawnTime = 4;
}


float AMonsterBase::TakeDamage( float Damage, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser )
{
	...
	if ( mHP2 > 0 )
		ChangeAnimMonster_Server( EAnimType::ANIMTYPE_HIT );
	else
	{
		ChangeAnimMonster_Server( EAnimType::ANIMTYPE_DIE );

		ASpawnPoint* owner = Cast<ASpawnPoint>( GetOwner());
		if ( IsValid( owner ) )
			owner->DieMonster();
	}

	return Damage;
}

 

=> 몬스터 죽으면 죽은 자리에서 바로 다음 몬스터가 스폰된다. 

 



728x90

댓글