[UE5 KDT2024] 30. SpawnActor
1. 몬스터도 스폰되도록 만들어보자
1) Actors 폴더, 액터 상속, SpawnPoint 클래스 생성
#include "EngineMinimal.h"
..
UCLASS()
class RESTART0501_API ASpawnPoint : public AActor
{
..
protected:
UPROPERTY( EditAnywhere, BlueprintReadWrite )
TSubclassOf<class AMonsterBase> mSpawnMonster;
UPROPERTY( EditAnywhere, BlueprintReadWrite )
float mSpawnTime;
UPROPERTY( EditAnywhere, BlueprintReadWrite )
int32 mSpawnRemainCnt;
...
public :
UFUNCTION( BlueprintCallable, Category = "Spawn")
void Respawn();
};
#include "MonsterBase.h"
// Sets default values
ASpawnPoint::ASpawnPoint()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
mSpawnTime = 0.f;
mSpawnRemainCnt = 5;
}
// Called every frame
void ASpawnPoint::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if ( !HasAuthority() )
return;
if ( mSpawnRemainCnt <= 0 )
return;
// 일정 시간마다 스폰
mSpawnTime += DeltaTime;
if ( mSpawnTime >= 3.f )
{
mSpawnTime -= 3.f;
Respawn();
}
}
void ASpawnPoint::Respawn()
{
FActorSpawnParameters params ;
params.Owner = this;
params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::Undefined;
// SpawnActor () : 액터를 스폰하는 함수
TObjectPtr<AMonsterBase> spawMonster = GetWorld()->SpawnActor<AMonsterBase>( mSpawnMonster, GetActorLocation(), GetActorRotation(), params );
if ( !IsValid( mSpawnMonster ) )
return;
mSpawnRemainCnt--;
}
▶️ TSubclassOf 클래스
UClass 유형의 안전성을 보장해 주는 템플릿 클래스입니다. 예를 들어 디자이너가 대미지 유형을 지정하도록 해주는 발사체 클래스를 제작중이라 가정합시다. 그냥 UPROPERTY 유형의 UClass 를 만든 다음 디자이너가 항상 UDamageType 파생 클래스만 할당하기를 바라거나, TSubclassOf 템플릿을 사용하여 선택지를 제한시킬 수도 있습니다.
ㄴ> 상속받은 자식(같은 유형의) 클래스만 지정해서 사용하도록 ‘안정성’을 보장 해주나봄 신기
ㄴ 오브젝트가 아닌 클래스를 가르킴
ㄴ 안정성 : 특정 타입의 클래스만 사용 가능하도록 제한
ㄴ 편의성 : 언리얼 에디터에서 변수를 설정할 때, 선택 가능한 클래스만 필터링됨.
▶️ SpawnActor() : 액터를 스폰하는 함수
1) 인자정보
- UClass * class : UClass 정보 -> 이걸 통해서 CDO를 참조하여 객체를 생성
- FVector const & Location : 생성될 위치 정보
- FVectorconst& Rotation : 생성될 회전 정보
- const FActorSpawnParameters& SpawnParameters : 생성될 액터의 부가정보
2) 내부 구조를 보면 NewObject를 하고 있고, 더 내부를 보면 언리얼에서 객체를 생성할 때 사용하는 동적할당을 어떻게 하는지도 볼 수 있다. Malloc 사용하는걸 알 수 있다. (크기만큼만 할당)
▶️ FActorSpawnParameters 변수
- Owner : 스폰될 액터의 소유주
ex ) params.Owner = this;
- SpawnCollisionHandlingOverride : 스폰 설정
ex ) params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::DontSpawnIfColliding;
▶️ESpawnActorCollisionHandlingMethod 스폰설정
- Undefined : 기본 스폰 설정. 충돌이 되면 소환 안함
(몬스터 컬리전 프로파일을 몬스터끼리 블록으로 변경시 같은 위치일경우 스폰되지않음)
- AlwaysSpawn : 충돌여부와 상관없이 지정된 위치에 액터를 반드시 스폰
- AdjustIfPossibleButAlwaysSpawn : 충돌이 감지되면 충돌하지 않은 위치를 찾아서 반드시 스폰한다.
-> 약간 위치 바뀌어서 스폰됨
- AdjustIfPossibleButDontSpawnIfColliding : 충돌이 감지되면 근처의 충돌하지 않는 위치를 찾아보고, 적합한 위치를 찾았을 때에만 스폰 => 이전거 죽으면 바로 다음거 스폰되드라거
- DontSpawnIfColliding : 충돌이 감지되면 스폰하지 않는다.
⇒ 스폰 장소에 바닥이랑 충돌되어서 안나올 수도 있으니까 잘 확인하기
2) 편하게 블루프린트로 스폰포인트 생성
Actors폴더에 블루프린트 생성 - SpawnPoint 부모클래스 설정 - BP_SpawnPoint

디테일창에서 monster와 SpawnTime 정보 설정
3) map위에 BP_SpawnPoint 올려두기
=> 실행하면 SpawnPoint에서 몬스터가 생성됨
생성횟수제한 적용됨
‼️ 리플리케이트가 비활성화 되어있으면 서버 화면에만 생성된다. (동기화가 되지 않는다)
- 생성자에서 bReplicates = true
- 블루프린트 - 디테일 - 리플리케이트 활성화
▶️ 테스트용 설정 몬스터끼리 블록(왼쪽), 오른쪽으로 하면 중복해서 만들어지기 가능 (기존값)

