Unreal Engine5/KDT 2024

[UE5 KDT2024] 30. SpawnActor

유잉유잉유잉 2025. 3. 14. 00:05
728x90

 

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

- 블루프린트 - 디테일 - 리플리케이트 활성화 

 

 ▶️ 테스트용 설정 몬스터끼리 블록(왼쪽), 오른쪽으로 하면 중복해서 만들어지기 가능 (기존값)

 

728x90