728x90
반응형
블루프린트에서 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);
}
728x90
반응형
'개발 · 컴퓨터공학' 카테고리의 다른 글
Learning Unreal 4 언리얼 공부일지 - GameInstance로 데이터 만들어 사용해보기 (0) | 2022.01.30 |
---|---|
Learning Unreal 4 언리얼 공부일지 - 충돌을 이용한 아이템 습득 (0) | 2022.01.29 |
Learning Unreal 4 언리얼 공부일지 - 충돌 감지 해보기 (0) | 2022.01.27 |
Learning Unreal 4 언리얼 공부일지 - 블렌드 스페이스가 뭐지 (0) | 2022.01.26 |
Learning Unreal 4 언리얼 공부일지 - 애니메이션 노티파이 (0) | 2022.01.25 |