사용할 무기 Actor를 만들어준뒤 기본설정
public:
virtual void Tick(float DeltaTime) override;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "MySword")
class USceneComponent* sceneComp;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "MySword")
class UStaticMeshComponent* swordMesh;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "MySword")
class UCapsuleComponent* swordCapsuleComp;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "MySword")
class USceneComponent* capsureTraceStartPoint;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "MySword")
class USceneComponent* capsureTraceEndPoint;
};
ABasicSword::ABasicSword()
{
PrimaryActorTick.bCanEverTick = true;
sceneComp = CreateDefaultSubobject<USceneComponent>(TEXT("SceneComp"));
SetRootComponent(sceneComp);
swordMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("swordMesh"));
swordMesh->SetupAttachment(RootComponent);
static ConstructorHelpers::FObjectFinder<UStaticMesh> crowMesh(TEXT("/Game/MainCharacter/Sword/futuristic_sword_upload.futuristic_sword_upload"));
if (crowMesh.Succeeded())
{
swordMesh->SetStaticMesh(crowMesh.Object);
}
swordCapsuleComp = CreateDefaultSubobject<UCapsuleComponent>(TEXT("capsuleComp"));
swordCapsuleComp->SetupAttachment(swordMesh);
swordCapsuleComp->SetRelativeLocation(FVector(195.26f, 18.9f, -2.14f));
swordCapsuleComp->SetRelativeRotation(FRotator(90.0f, 180.f, 173.7f));
swordCapsuleComp->SetCapsuleHalfHeight(179.0f);
swordCapsuleComp->SetCapsuleRadius(15.77f);
capsureTraceStartPoint = CreateDefaultSubobject<USceneComponent>(TEXT("startPoint"));
capsureTraceStartPoint->SetupAttachment(swordMesh);
capsureTraceStartPoint->SetRelativeLocation(FVector(31.27f, 0.f, 0.f));
capsureTraceStartPoint->SetRelativeRotation(FRotator(0.f, 4.54f, 0.f));
capsureTraceEndPoint = CreateDefaultSubobject<USceneComponent>(TEXT("EndPoint"));
capsureTraceEndPoint->SetRelativeLocation(FVector(372.8f, 40.87f, -2.6f));
capsureTraceEndPoint->SetupAttachment(swordMesh);
}

프리뷰 메시를 달아주어 허리춤에 Sword_Holder소켓을 만들고
오른손에 WeaponSocket을 만들어 프리뷰애니메이션을 통해 무기를 잡을때
허리춤의 소켓칼의 위치와 손의 소켓칼 위치를 겹쳐지도록 세팅하였습니다


Sword_Holder의 소켓과 Grab의 소켓 즉
허리춤의 소켓과 잡을때의 grab의 소켓의 위치가 같아질때
노티파이를 사용하여 해당 소켓의 위치로 붙게 설계하였습니다
우선 생성자에서 기본값으로 허리춤의 소켓으로 붙게하였습니다
대상은 블루프린트 칼 액터를 ChildActorComponent식으로 달아주었습니다
swordActorComp = CreateDefaultSubobject<UChildActorComponent>(TEXT("swordActorComp"));
//기본적으로 허리춤 홀더에 달기
swordActorComp->SetupAttachment(GetMesh(), TEXT("Sword_Holder"));
swordActorComp->SetChildActorClass(ABasicSword::StaticClass());
매개변수로 받는 FName 타입 socketName의 위치로 컴포넌트가 붙은 함수를 만들어준뒤
void AMainCharacter::WeaponAttachToSocket(FName socketName)
{
swordActorComp->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetIncludingScale,
socketName);
}
애니메이션에 노티파이를 찍어준뒤
노티파이를 사용하여 해당 함수를 호출하여주었습니다
void UMainCharacterAnimInstance::AnimNotify_Sword_DrawPoint()
{
//소켓이름
FName drawSocket = "WeaponGrapSocket";
if (mainCharacter)
{
mainCharacter->WeaponAttachToSocket(drawSocket);
}
}
void UMainCharacterAnimInstance::AnimNotify_Sword_SheathPoint()
{
//소켓이름
FName drawSocket = "Sword_Holder";
if (mainCharacter)
{
mainCharacter->WeaponAttachToSocket(drawSocket);
}
}
APawn* myPawn;
AMainCharacter* mainCharacter;
결과물


칼집을 추가해주었습니다
제가 사용할수있는 애니메이션이 제한적이라 완전 자연스럽게는 불가능했네요..ㅠ

'Unreal 프로젝트 다이어리 > 두번째 프로젝트' 카테고리의 다른 글
| Unreal - Hash 기반 AI/Enemy 데이터 설계하기 (0) | 2025.08.23 |
|---|---|
| Unreal - 콤보 공격 (0) | 2025.08.22 |
| Unreal - Layered Per Bone (상 하체 애니메이션 분리) (0) | 2025.08.17 |
| Unreal - Foot IK (0) | 2025.08.17 |
| Unreal - 모션매칭(Motion Matching) - 스키마 데이터 관리하기 (점프,달리기) (0) | 2025.08.15 |