UE4

[UE4] 무기 액터 제작

Honey Badger 2022. 11. 9. 01:43

무기 액터 생성  

새로운 C++클래스 추가> Actor클래스 하나 만들기 -> 스켈레탈 메쉬를 담을 변수를 헤더에 하나 선언 후 코드에서 스켈레탈 메쉬 불러와서 액터에 적용시켜주기.

 

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<USkeletalMeshComponent>(TEXT("WEAPON"));
	RootComponent = Weapon;

	static ConstructorHelpers::FObjectFinder<USkeletalMesh> SK_WEAPON(TEXT("SkeletalMesh'/Game/InfinityBladeWeapons/Weapons/Blade/Swords/Blade_BlackKnight/SK_Blade_BlackKnight.SK_Blade_BlackKnight'"));
	if (SK_WEAPON.Succeeded())
	{
		Weapon->SetSkeletalMesh(SK_WEAPON.Object);
	}
	Weapon->SetCollisionProfileName(TEXT("NoCollision"));

}

 

 

 

캐릭터에 무기 부착

 

  월드에서 새롭게 액터를 생성하는 명령은 SpawnActor이다. 액터는 월드에 존재하는 물체이므로 이는 월드의 명령어다. 따라서 GetWorld함수로 월드의 포인터를 가져와서 해당 함수를 실행해야 한다. SpawnActor의 인자에는 생성할 액터의 클래스와 액터가 앞으로 생성할 위치 및 회전을 지정한다.

// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
	Super::BeginPlay();

	//위에서 제작한 무기 클래스 캐릭터에 부착.
	FName WeaponSocket(TEXT("FX_weapon_base"));
	auto CurWeapon = GetWorld()->SpawnActor<AMyWeapon>(FVector::ZeroVector, FRotator::ZeroRotator);
	if (nullptr != CurWeapon)
	{
		CurWeapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponSocket);
	}
	
}

 

이때 AttachToComponent라는 함수가 쓰이는데 우리가 늘 쓰던 SetupAttachment와 모양이 좀 다르다. SetupAttachment는 아래와 같이 액터 하위의 컴포넌트들의 관계를 명시해주는 역할을 하지만,

 

SetupAttachment() 사용, 클래스 내의 여러 컴포넌트들 사이의 관계명시.

 

AttachToComponent() 사용. 내 클래스의 부모클래스를 연결해줌.

위와 같이 내가만든 MyWeapon클래스가 게임 실행시 캐릭터 밑에 spawn되어 캐릭터에 무기가 부착된다면 성공이다!

 

 

 

" AttachToComponent() "에 대하여   

 

AttachToComponent는 위와 같이 액터들의 부모자식관계 명시에 사용되는 것 같다.  Document를 보면 "이 Actor의 RootComponent를 지정된 소켓에 있는 제공된 구성 요소에 연결합니다."라고 설명되어 있다. 인자를 살펴보면 다음과 같다.

void AttachToComponent
(
    USceneComponent * Parent,
    const FAttachmentTransformRules & AttachmentRules,
    FName SocketName
)

1. Parent : 연결하고 싶은 부모 컴포넌트.

2. AttachmentRules : 연결할 때 위치와 연결을 어떻게 다룰지.

3. SocketName : 부모에서 연결할 소켓(Optional).

 

  위의 코드를 미루어보아 해석하면 , CurWeapon에서 AttachToComponent메소드를 이용해서 부모에 연결할건데, 연결하고 싶은 부모는 MyCharacter이며 연결할 때 스케일 정보를 includ하지 않고 빠르게 진행하며, 부모의 "@@"소켓에 연결하겠다. 라는 뜻인 것 같다. 

 

  한가지 궁금한 점은  GetMesh()가 거의 MyCharacter를 불러오는 기능처럼 쓰이는데 GetMesh는 반환값도 스켈레탈 메쉬포인터이고, 스켈레탈 메쉬는 캐릭터 클래스에 딸린 하위컴포넌트일 뿐인데 왜 캐릭터에 에님 블루프린트를 적용시킬때나 위와 같이 상위클래스에 연결시킬때 쓰이는걸까...? 스켈레탈 메쉬 만능설.. 공부가 더 필요하다. 에님 블프나 소켓이 스켈레탈 메쉬와 관련이 있다는 건 알지만.. 유니티에 너무 익숙해져있어서 그런가 자꾸 직관적인 해답을 찾게된다.