Unreal - 무기 Draw

2025. 8. 19. 21:01·Unreal 프로젝트 다이어리/두번째 프로젝트

사용할 무기 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
'Unreal 프로젝트 다이어리/두번째 프로젝트' 카테고리의 다른 글
  • Unreal - Hash 기반 AI/Enemy 데이터 설계하기
  • Unreal - 콤보 공격
  • Unreal - Layered Per Bone (상 하체 애니메이션 분리)
  • Unreal - Foot IK
lucodev
lucodev
언리얼 포폴개발 일기
  • lucodev
    루코 개발테이블
    lucodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (218) N
      • Unreal 프로젝트 다이어리 (115) N
        • 첫번째 프로젝트 (73)
        • 두번째 프로젝트 (42) N
      • Unreal 팁 (8)
      • Unreal 디버깅 (8)
      • C++ 프로그래머스 (52)
        • Stack,Queue (7)
        • Hash (4)
        • Heap (2)
        • Sort (5)
        • Exhaustive search (5)
        • Greedy (2)
        • BFS , DFS (7)
        • Graph (2)
        • Dynamic Programming (1)
        • C++ Math (2)
        • 기타 문제 (14)
      • C++ 백준 (4)
      • C++ 팁 (1)
      • 개인 코테 & 스타디 <비공개> (29)
        • 코드 개인보관함 (9)
        • 코딩테스트+@ (11)
        • 알고리즘 스타디 (6)
        • 알고리즘 스타디 과제 (3)
        • 비공개 (0)
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 링크

  • 공지사항

  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 태그

    언리얼 파쿠르
    unreal 시퀀스
    언리얼 퀘스트시스템
    unreal inventory
    unreal npc
    언리얼 시퀀스
    언리얼 ui
    unreal 인벤토리
    unreal
    언리얼 parkour
    언리얼
    언리얼 비헤이비어트리
    언리얼 behavior tree
    언리얼 컷씬
    언리얼 프로그래스바
    언리얼 인벤토리
    언리얼 npc
    언리얼 behaviortree
    언리얼 상호작용
    unreal 파쿠르
  • hELLO· Designed By정상우.v4.10.3
lucodev
Unreal - 무기 Draw
상단으로

티스토리툴바