개발/Unreal Engine / / 2022. 1. 28. 05:59

Learning Unreal 4 언리얼 공부일지 - 언리얼의 소켓

반응형

블루프린트에서 Skeletal Mesh를 들어가면 위와 같은 창을 볼 수 있다. 여기서 스켈레톤의 계층구조를 확인할 수 있다.

 

계층구조에서 필요한 부분에 소켓을 생성하고, 소켓 안에 에셋을 추가해서 또 다른 무기를 손에 쥐거나 하게 만들 수 있다.

소켓을 생성하더라도, 해당 위치에 모델을 넣기 위해서는 코드에서의 작업이 필요하다.

 

// MyCharacter.h

UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* Weapon;

Character 헤더에 무기의 MeshComponent를 선언한다.

 

// MyCharacter.cpp

AMyCharacter::AMyCharacter()
{
    /***/

	// 무기 소켓 이름 선언 
	FName WeaponSocket(TEXT("hand_l_socket"));
    // 소켓 존재 여부 판단
	if (GetMesh()->DoesSocketExist(WeaponSocket))
	{
    	// 헤더의 컴포넌트를 변수로 할당
		Weapon = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WEAPON"));
        // 경로에서 Mesh 가져오기
		static ConstructorHelpers::FObjectFinder<UStaticMesh> SW(TEXT("StaticMesh'/Game/ParagonGreystone/FX/Meshes/Heroes/Greystone/SM_Greystone_Blade_01.SM_Greystone_Blade_01'"));
		// 가져오기 성공 시 Mesh를 컴포넌트에 적용
        if (SW.Succeeded()) {
			Weapon->SetStaticMesh(SW.Object);
		}
		// SetupAttachment로 적용?
		Weapon->SetupAttachment(GetMesh(), WeaponSocket);
	}
}

Character cpp파일에 소켓에 Mesh를 할당하는 코드를 적는다. 

SetupAttachment는 적용하는 느낌인데 정확히 무슨 역할인지는 알아봐야할 것 같다.

 


 

이번에는 무기를 Scene에 배치하는 코드를 보자. Actor로 MyWeapon를 생성했다.

// MyWeapon.h

UCLASS()
class UNREALINTRODUCTION_API AMyWeapon : public AActor
{
	/.../
public:	
	// Weapon 컴포넌트 생성
	UPROPERTY(VisibleAnywhere)
	UStaticMeshComponent* Weapon;
};

 

weapon컴포넌트 담을 변수를 헤더에  생성한다.

 

// MyWeapon.cpp

AMyWeapon::AMyWeapon()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = false;

	Weapon = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WEAPON"));

	static ConstructorHelpers::FObjectFinder<UStaticMesh> SW(TEXT("StaticMesh'/Game/ParagonGreystone/FX/Meshes/Heroes/Greystone/SM_Greystone_Blade_01.SM_Greystone_Blade_01'"));
	if (SW.Succeeded()) {
		Weapon->SetStaticMesh(SW.Object);
	}

	Weapon->SetCollisionProfileName(TEXT("NoCollision"));
}

cpp에서는 weapon의 mesh component를 가져와서 SetStaticMesh로 mesh를 세팅, SetCollisionProfileName으로 충돌설정을 세팅한다.

 

// MyCharacter.cpp

void AMyCharacter::BeginPlay()
{
	Super::BeginPlay();

	FName WeaponSocket(TEXT("hand_I_socket"));

	// 특정 position에 Actor spawn
	auto Weapon = GetWorld()->SpawnActor<AMyWeapon>(FVector::ZeroVector, FRotator::ZeroRotator);
}

Character cpp파일에서 GetWorld를 통해 특정 포지션에 Actor클래스(AMyWeapon)를 생성한다.

아래와 같은 코드를 이용해서 다시 소켓에 붙일 수 있다.

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

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유