본문 바로가기

개발/Unreal

FActorSpawnParameters란 무엇인가? 구조체 변수 정리 및 예제 코드

 

안녕하세요 오늘 설명해 드릴 것은

FActorSpawnParameters 라는 구조체 입니다

 

언리얼 도큐먼트에도 정리가 되어있기는 하지만 

직접 코드에 들어가서 제가 나름 정리해보고 싶어서 이렇게 글을 남기게 되었어요 ㅎㅎ

 

솔직히 간단한 내용이지만 한글로 정리된곳도 잘 안보일 뿐더러 제가 나중에 헷갈릴때마다 볼까 싶어서 이렇게 정리해두고 있는거라서 그렇게 좋은 정보는 아닐지라도 하나하나 쌓아가는 느낌으로 진행해볼려고 해요.

 

혹시라도 특정 구문만 궁금하신것이라면은 Ctrl + F를 이용해서 검색해서 찾아가는것이 좀 더 빠른 검색이 될 것 입니다.

 

struct ENGINE_API FActorSpawnParameters 
{     
	FName Name = NAME_None; 
	AActor* Template = NULL; 
	AActor* Owner = NULL; 
	APawn* Instigator = NULL; 
	class ULevel* OverrideLevel= NULL; 

	ESpawnActorCollisionHandlingMethod SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::Undefined; 

private: 
	friend class UPackageMapClient; 
    
	uint8 bRemoteOwned:1 = false; 

public: 
	bool IsRemoteOwned() const { return bRemoteOwned; } 
	uint8 bNoFail:1 = false; 
	uint8 bDeferConstruction:1 = false; 
	uint8 bAllowDuringConstructionScript:1 = false; 

#if WITH_EDITOR 
	uint8 bTemporaryEditorActor:1 = false; 
	uint8 bHideFromSceneOutliner:1 = false; 
#endif 

	EObjectFlags ObjectFlags = RF_Transactional; 
}; 

위에 코드는 제가 unreal 코드에서 가져온 코드입니다.

주석을 지워서 좀더 간결하게 보이는게 보이실 것입니다

 

그럼 주로 사용하는 변수만 하나하나 설명과 함께 분석해보시지요 

Name 파라미터 구조체를 이용해서 스폰되는 액터의 이름을 지정할 수 있습니다.
예를들어서 나는 Actor를 생성하고 싶은데
Actor에 이름은 "Cube"라고 주고 싶다고 한다면은 이 값을 변경해주시면 됩니다.
Template 새 액터를 스폰할때 템플릿으로 사용할 액터를 지정하는 구문입니다.
NULL로 남겨두면 기본 오브젝트(CDO)가 스폰된 액터를 초기화 하는데
사용하는데 내가 이 기본 오브젝트에서 수정을 해서 그 값을 기준으로
액터를 초기화 하고 싶을때 넣어주시면 됩니다
Owner 이 액터를 스폰 한 액터를 지정할 수 있습니다.
일부로 Owner를 지정할 필요는 없습니다.
NULL 남겨놔도 작동에는 이상이 없습니다.
Instigator 언리얼 도큐먼트 해석으로는 액터의 피해를 담당하는 APawn이라고 하는데
제가 생각하는 Instigator은 가해자라고 생각합니다.
이 액터를 만든자? 이런느낌으로 보시면 됩니다.
여기서 궁금한게 Owner과 Instigator의 혼동이 오실 수도 있는데
예를들어서 제가 몬스터를 화살로 공격을 했을 때
화살은 몬스터에 붙어 있어야 합니다.
그래서 Owner는 몬스터로 잡으시고 캐릭터가 발생시킨 가해자이기 때문에
Instigator를 캐릭터로 잡는걸로 설명드릴 수 있습니다.
OverrideLevel 액터를 스폰시킬 ULevel을 지정하는 변수입니다.
이 변수같은 경우는 Level에 SubLevel의 개념을 이해하고 계시다면은
쉽게 이해가 될것입니다. Level의 구성은 PersistentLevel과 그 안에
존재하는 SubLevel로 구성이 되고 있습니다.
그렇기에 NULL을 넣으시면은 PersistentLevel에 스폰시키고
특정 SubLevel에 스폰시키고 싶다고 하시면 그 특정 SubLevel을
넣어주시면 됩니다. 

* PersistentLevel과 SubLevel의 관한건 다음에 포스팅 하겠습니다. 추후 링크 달아드리겠습니다
SpawnCollisionHandlingOverride 참 길죠....? 이 변수같은 경우는 액터를 스폰 할 때 충돌을 해결하는
방법을 정의를 해주고 있습니다.
스폰이 되었을 때 충돌이 일어나게 된다면은
스폰을 어떤 방법으로 시킬지를 묻고 있습니다.
종류는 다음과 같습니다
ESpawnActorCollisionHandlingMethod::Undefined
ESpawnActorCollisionHandlingMethod::AlwaysSpawn
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding
ESpawnActorCollisionHandlingMethod::DontSpawnIfColliding

간단하게 설명드리자면은 
Undefined
액터의 설정을 사용합니다.

AlwaysSpawn
액터 충돌과 상관없이 원하는 위치에 스폰됩니다.

AdjustIfPossibleButAlwaysSpawn
액터가 충돌 시 근처 충돌하지 않는 위치에 스폰을 합니다.
찾지 못한다면은 AlwaysSpawn으로 동작합니다

AdjustIfPossibleButDontSpawnIfColliding
액터가 충돌 시 근처 충돌하지 않는 위치에 스폰을 합니다.
찾지 못한다면 스폰되지 않습니다

DontSpawnIfColliding
액터를 스폰하지 않습니다

각각의 기능은 추후 포스팅 후 링크 달아드리겠습니다.

이처럼 주로 사용하는 변수만 이렇게 알아보았습니다. 

 

처음 사용하시다보면은 헷갈리는 경우도 있으실텐데 그냥 예제따라서 사용해보는것도 좋은 방법중에 하나지만

이렇게 하나하나 구성요소를 알고 있는것도 매우 중요한 일이라고 생각해서 이렇게 정리를 해보게되네요 ㅎ

 

간단한 예제코드도 남겨드려요

/*
예제 설명
캐릭터가 몬스터에게 활을 쏘고 그 활이 몬스터에게 박혀서 남아있는 상황을 예로 쓴 것이다.
*/

//구조체 생성
FActorSpawnParameters SpawnParameters;

//가해자는 캐릭터
SpawnParameters.Instigator = Character;

// 무조건 생성하게 셋팅
SpawnParameters.SpawnCollisionHandlingOverride 
	= ESpawnActorCollisionHandlingMethod::AlwaysSpawn;

// 활이 몬스터에 붙으므로 Owner는 Monster로 설정
SpawnParameters.Owner = Monster;

// 활을 특정 위치에 생성하게 하고있다.
//위치와 회전 크기는 모두 기본값으로 생성하였다.
//원하는 위치를 넣어주길 바랍니다.
AActor* NewActor = 
	GetWorld()->SpawnActor(CreateActor::StaticClass(), &FVector::ZeroVector , &FRotator::ZeroRotator, SpawnParameters);

// 이 후반 부분은 부족한 부분을 더 넣은 코드이므로 위에 설명에는 없고 후에 포스팅 하겠습니다

//이 구문은 다음에 포스팅 해드리겠습니다
//쉽게 설명하자면은 Attach 된 액터를 부모 기준으로 어떻게 영향을 받을지에 대한 값입니다.
FAttachmentTransformRules AttachmentTransformRules 
	= FAttachmentTransformRules(EAttachmentRule::KeepRelative , EAttachmentRule::KeepRelative , EAttachmentRule::KeepRelative , false);

//생성한 액터를 Monster에 특정 위치에 붙이는 함수
//이 기능도 다음에 포스팅 해보도록 하지요.
NewActor->AttachToComponent(Monster->GetMesh(), AttachmentTransformRules, FName("어태치 위치"));

 

'개발 > Unreal' 카테고리의 다른 글

Unreal Nested containers are not supported 오류 해결법  (0) 2020.06.30