공식 문서
1. Skeletal Mesh Socket 이란?
Skeletal Mesh Socket을 이용해서 스켈레톤 계층에 소켓을 추가해 액터(Ex. 무기)를 연결시킬 수 있는 기능이다.
프리뷰 기능을 통해 애니메이션 중에 소켓이 제대로 설정되었는지도 확인이 가능하기 때문에 아주 좋은 기능이라 생각한다.
2. Socket 생성
Player의 Skeletal Mesh를 연 다음에 오른손에 소켓을 추가하자
우클릭 하면 창이 나온다.
이름은 “WeaponSocket”로 만들고 우클릭을 누르면 “프리뷰 에셋 추가”를 통해 원하는 에셋을 추가할 수 있다.
TPS게임을 만드는 중이었으니 필자의 경우 라이플을 추가했다.
그리고 우측 창을 보면 “프리뷰 씬 세팅”이 있는데 여기서 특정 애니메이션을 재생시킬 수 있다.
우선 Idle 상태 애니메이션을 기준으로 맞출 것이기 때문에 아래와 같이 세팅해 준다.
- 프리뷰 컨트롤러: 특정 애니메이션 사용
- 애니메이션: 가지고 있는 Idle 애니메이션
그러면 애니메이션이 재생되는 걸 볼 수 있는데 소켓의 Transform이 제대로 설정되어 있지 않아 이상한 모습이 출력되는 걸 볼 수 있다.
여러 애니메이션을 프리뷰 하면서 Socket의 Trasnform을 조절해 원하는 위치를 잡아주자!!
3. C++로 소켓에 무기 붙이기
소켓까지 마무리했으면 이제 소켓에 Actor를 소환해서 붙이는 작업을 해주면 된다.
이 작업은 예전에 UE4로도 자세히 설명했었는데 참고해도 좋을 것 같다.
Skeletal Mesh Socket을 이용한 무기 장착
일단 Header 파일에 TsubclassOf
그리고 무기를 붙이는 메서드인 AttachWeapon(TSubclassOf
1
2
3
4
5
6
7
// header 파일
UPROPERTY(EditAnyWhere, Category = "Weapon", meta = (AllowPrivateAccess = "true"))
TSubclassOf<class AWeapon> _weapon;
public:
void AttachWeapon(TSubclassOf<class AWeapon> weapon) const;
그리고 AttachWeapon() 메서드는 아래와 같이 구현했다.
자세한 내용은 주석으로 작성했으니 주석을 참고하자!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void APlayerCharacter::AttachWeapon(TSubclassOf<class AWeapon> weapon) const
{
if (weapon)
{
// SpawnActor를 통해 weapon 데이터를 기반으로 한 액터 생성
AWeapon* spawnWeapon = GetWorld()->SpawnActor<AWeapon>(weapon);
// 소켓 이름을 통해 현재 메시에서 소켓을 참조
const USkeletalMeshSocket* weaponSocket = GetMesh()->GetSocketByName("WeaponSocket");
if (spawnWeapon && weaponSocket)
{
// 소켓에 액터를 할당
weaponSocket->AttachActor(spawnWeapon, GetMesh());
}
}
}