[UE5] 무기 장착하기
캐릭터에 무기를 장착하는 법을 간단하게 알아봅시다.
우선 캐릭터 에셋의 Skeleton에 보면 위와 같이 캐릭터를 구성하는 Hierarchy가 보입니다. 여기서 무기를 찾아보면 저는 weapon_l과 weapon_r이 있는데, weapon_l은 hidden 처리 되어 있는 걸 보니 weapon_r을 사용하는 것 같습니다.
weapon_r의 하위에 "WeaponSocket"이라는 임시 소켓을 만들어둡니다.
<ShooterCharacter.h>
private:
UPROPERTY(EditDefaultsOnly)
TSubclassOf<class AGun> GunClass;
UPROPERTY()
AGun* Gun;
};
캐릭터 C++ 클래스 헤더에 위와 같이 Gunclass와 Gun 객체를 만들어줍니다.
Gun의 경우 포인터 타입을 헤더파일에 선언했기 때문에 언리얼의 Garbage Collection에 추가되도록 UPROPERTY()를 붙여줍니다.
참고: https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-object-handling-in-unreal-engine
TSubclassOf는 블루프린트 클래스나 다른 C++ 클래스를 객체로 가져와 사용하겠다는 뜻입니다. 나중에 무기 클래스인 Gun.cpp를 블루프린트 클래스로 만들어 사용할 것이기 때문에 나중에 블루프린트 에디터에서 "BP_Gun"을 GunClass에 넣어주어야 하고, 부모 클래스인 AGun을 템플릿에 넣어주었습니다.
전방 선언Forward Declaration을 위해 "class"를 앞에 붙여줍시다.
<ShooterCharacter.cpp>
void AShooterCharacter::BeginPlay()
{
Super::BeginPlay();
Gun = GetWorld()->SpawnActor<AGun>(GunClass);
...
}
그런 다음 cpp 파일로 와서 무기를 생성하는 코드를 작성해줍니다. 기존 스켈레톤에 있던 무기 대신 새 무기를 spawn하기 위해 SpawnActor를 사용해줍니다.
SpawnActor(GunClass)는 블루프린트 클래스가 들어갈 GunClass를 world에 생성하겠다는 뜻입니다. 이를 Gun 객체로 받아줍니다.
GetMesh()->HideBoneByName(TEXT("weapon_r"), EPhysBodyOp::PBO_None);
Gun->AttachToComponent(GetMesh(), FAttachmentTransformRules::KeepRelativeTransform, TEXT("WeaponSocket"));
Gun->SetOwner(this);
새 무기를 생성했으니 기존에 있던 무기, 즉 weapon_r을 숨김 처리해야 합니다.
우선 GetMesh를 통해 이 클래스의 Skeletal Mesh에 접근합니다. 이는 처음 말한 Skeleton과 동일합니다.
Mesh에 접근한 후 HideBoneByName을 통해 해당 무기를 숨김 처리합니다.
그리고 새로 생성한 무기를 캐릭터의 팔에 부착하여 위치가 기존 무기처럼 자연스럽게 연출되도록 해야 합니다.
Gun->AttachToComponent를 통해 앞에서 스켈레톤에 생성한 WeaponSocket의 위치에 부착해줍니다.
무기를 새로 생성했으니 그의 소유주owner를 해당 캐릭터로 설정하는 것도 잊지 맙시다.
블루프린트 에디터에서 GunClass를 장착할 무기의 BP로 설정해줍니다.
게임을 실행시켜 보면 캐릭터의 하위에 무기가 새로 생성된 것을 확인할 수 있습니다. 뷰포트에서도 확인할 수 있습니다.
이를 통해 기존 무기가 아닌 새로운 무기를 장착하거나, 여러 무기를 번갈아가며 사용하도록 하는 것도 가능합니다.
캐릭터에 무기를 장착하는 법을 알아보았습니다.