1. 개요

이전 포스트에서 BP_Rifle을 소환하였으나, 월드의 어딘가에 소환된 것을 확인할 수 있다.

이제 이 총을 캐릭터의 메쉬에 붙여 캐릭터의 손에 총이 붙어있게 소환할 것이다.

 

 

2. 스켈레톤 수정

(1) 본 제거

실제로 캐릭터의 스켈레톤을 살펴보면 무기가 부착되는 Bone인 Weapon_r이 있다.

먼저 해당 본을 제거해야 한다.

void AShooterCharacter::BeginPlay()
{
	Super::BeginPlay();
	
	Gun = GetWorld()->SpawnActor<AGun>(GunClass);
	GetMesh()->HideBoneByName(TEXT("Weapon_r"), EPhysBodyOp::PBO_None);
}

위와 같이 작성하고 게임을 실행하면 캐릭터가 잡고 있던 가짜 총이 사라지게 된다.

 

(2) 소켓 추가

- Wraith_Skeleton을 더블클릭하여 수정한다.

WeaponSocket이라는 이름의 소켓을 본에 추가하고 코드를 수정한다.

 

(3) 코드 수정(AShooterCharacter.cpp)

void AShooterCharacter::BeginPlay()
{
	Super::BeginPlay();
	
	Gun = GetWorld()->SpawnActor<AGun>(GunClass);
	GetMesh()->HideBoneByName(TEXT("Weapon_r"), EPhysBodyOp::PBO_None);
	Gun->AttachToComponent(GetMesh(), FAttachmentTransformRules::KeepRelativeTransform, TEXT("WeaponSocket"));
	Gun->SetOwner(this);
}

 

(3-1) AttachToComponent 함수

AActor에 정의되어 있는 함수이다.

해당 함수를 실행한 액터(Gun)의 루트 컴포넌트를 첫번째 인수인 지정된 컴포넌트(캐릭터의 스켈레탈 메쉬)에 붙인다.

 

두번째 인수는 붙일 때 붙여지는 액터(Gun)의 트랜스폼 규칙을 설정한다.

여기에서는 월드 트랜스폼이 아닌 캐릭터의 트랜스폼을 기준으로 사용할 것이므로 RelativeTransform 으로 선택한다.

 

세번째 인수로는 붙일 소켓의 이름을 전달하면 된다.

 

 

(3-2) 소유권 설정

추후에 Gun을 이용하여 소유자인 캐릭터에 참조할 수 있게 되어 더 코드를 편하게 작성할 수 있다.

캐릭터 액터의 메쉬에 Rifle이 붙어있다

 

이제 적절히 총의 위치가 손에 맞도록 조정하고, 트랜스폼을 복사하여 BP_Rifle의 트랜스폼에 붙여넣으면 적용된다.