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을 이용하여 소유자인 캐릭터에 참조할 수 있게 되어 더 코드를 편하게 작성할 수 있다.
이제 적절히 총의 위치가 손에 맞도록 조정하고, 트랜스폼을 복사하여 BP_Rifle의 트랜스폼에 붙여넣으면 적용된다.
'UE 5 스터디 > C++' 카테고리의 다른 글
6. 액터에 데미지 입히기(FDamageEvent, TakeDamage) (0) | 2024.03.07 |
---|---|
5. 라인 트레이스(LineTraceSingleByChannel) (0) | 2024.03.06 |
4. 이펙트 스포닝하기(SpawnEmitterAttached) (0) | 2024.03.06 |
2. 런타임에 액터 스포닝(Spawning) 하기(SpawnActor) (0) | 2024.03.06 |
1. C++ 액터 클래스에 컴포넌트 추가하기(CreateDefaultSubobject, SetupAttachment) (2) | 2024.03.06 |