언리얼5 무기 장착

달봉·2024년 4월 23일

언리얼엔진5

목록 보기
6/12

모션은 어느정도 되었으니 이제 캐릭터에 무기를 달아보고 싶어져 예전 기억을 떠올려 봤습니다 분명 애니메이션 유무에 따라 스태틱 & 다이나믹 매시를 만들어서 특정 본의 이름을 기준으로 해당 위치를 얻어와 매트릭스 연산을.. 크기 자전 이동 공전 부모 ...

그럼 가상본도 있으니 가상본으로 위치를 잡고 이용하면 될까요?

몇가지 경우를 시뮬레이션 하고 정보를 찾아보니 언리얼에서는 좀 더 쉬운 접근성의 기능을 제공하고 있습니다

스켈레탈 메시 소켓

기능 정의 내용을 보면..
수학 연산을 사용하여 오프셋 트랜스폼을 추정하는 대신 소켓 을 생성할 수 있습니다.
네 본에서부터 위치를 추정할 필요 없이 원하는 위치에 소켓을 만들고 적당한 위치로 이동&회전까지 세팅해놓을 수 있습니다.
적용또한 간단하게 가능합니다


스켈레탈 메시를 열고 원하는 위치의 본에 Add Socket

해당 소켓에 Add Preview Asset 을 통해 미리 세팅됬을 경우 위치정보를 확인하고 소켓 위치와 회전값을 조정해줍니다 Preview니깐 실제로 세팅 해줘야겠지요?

//Weapon클래스를 만들고 스켈레탈매시 생성
//pMesh < 헤더에 USkeletalMeshComponent* 선언;
pMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Weapon"));
	RootComponent = pMesh;
	static ConstructorHelpers::FObjectFinder<USkeletalMesh> FObj_WeaponSkmesh(TEXT("/Script/Engine.SkeletalMesh'/Game/Props/Meshes/Pistol/Desert_Eagle.Desert_Eagle'"));
	if (FObj_WeaponSkmesh.Succeeded())
		pMesh->SetSkeletalMesh(FObj_WeaponSkmesh.Object);
//플레이어 클래스에서 Weapon클래스에 해당하는 Actor 생성
	FName WeaponSocket(TEXT("r_hand_socket"));
	auto Weapon = GetWorld()->SpawnActor<AWeapon>(FVector::ZeroVector, FRotator::ZeroRotator);

	if (GetMesh()->DoesSocketExist(WeaponSocket))
	{
		Weapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponSocket);
	}

플레이어 액터의 컴포넌트로 들어간 상태가 됨으로 유저가 Weapon 클래스에서 위치를 계산해줄 필요가 없어졌습니다
여기서 플레이어의 GetMesh는 상속된 Character 클래스에서 가져온 것으로 자신이 새로 만든 Mesh 객체를 사용하고 싶거나 이 클래스를 상속한 블루프린트엑터에서 매시를 할당했을 경우 그에 맞는 접근을 해야합니다.

총 메시를 손에 붙인 모습
Gun-Gang 하게만 자라다오
profile
개발 블로그

0개의 댓글