목차
- 서론
- C++에서 캐릭터 소켓에 무기 에셋 부착하기
1. 서론
무기를 캐릭터에 붙이는 방법은 다음과 같다.
- 무기 클래스에 액터가 오버랩 된다.
- 오버랩 된 액터가 우리가 만든 캐릭터 클래스로 캐스팅 될 수 있는 지 확인한다.
- 캐스팅이 성공하면 플레이어가 무기에 접근한 것이다.
- 무기클래스의 스태틱 매시를 캐릭터의 소켓에 부착한다.
2. C++에서 캐릭터 소켓에 무기 에셋 부착하기
C++ 코드를 작성하기 전에 Item.h 파일을 수정을 하였다.
protected:
virtual void BeginPlay() override;
UFUNCTION()
virtual void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
UFUNCTION()
virtual void OnSphereEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
UStaticMeshComponent* ItemMesh;
UStaticMeshComponent* ItemMesh 변수를 프라이빗 영역에서 프로텍트 영역으로 옮겼다. 하위클래스인 웨폰 클래스에서 아이템 매시를 사용할 것이기 때문에 자식 클래스에서 쓸 수 있게 위치를 옮긴 것이다.
이제 다시 웨폰 클래스로 돌아가 cpp 파일을 수정하자
void AWeapons::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
Super::OnSphereOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult);
}
오버랩이 발생하면 otherActor가 캐릭터인지 아닌지 알아야하고 그 방법은 캐스트가 성공하는지 실패하는지를 알아보는 것이라고 했다.
그러기 위해서는 캐릭터 타입에 관한 정보를 가져와야한다. 헤더파일을 추가하자
#include "Knight.h"
이제 캐스팅을 할 수 있나 확인해보자
void AWeapons::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
Super::OnSphereOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult);
AKnight* KnightCharacter = Cast<AKnight>(OtherActor);
if (KnightCharacter)
{
// 캐스팅 성공시 할 행동
}
}
캐스팅에 성공하면 이 캐릭터 매시에 아이템 매시를 부착할 것이다.
매시를 부착하기 위해서는 FAttachmentTransformRules 구조체를 만들어주어야 한다.
FAttachmentTransformRules 구조체는 액터나 컴포넌트가 다른 컴포넌트에 부착될때 어떻게 변환이 처리될지 처리하는 규칙이 담긴 구조체라고 한다.
FAttachmentTransformRules 구조체는 EAttachmentRule 라는 enum(열거형)을 사용하여 세부규칙을 지정한다고 한다.
규칙을 만들고 이제 캐릭터 매시에 아이템 매시를 부착해보자
if (KnightCharacter)
{
FAttachmentTransformRules TransformRules(EAttachmentRule::SnapToTarget, true);
ItemMesh->AttachToComponent(KnightCharacter->GetMesh(), TransformRules, FName("RightHandSocket"));
}
AttachToComponent() 의 매개변수로는
첫번째: 부착할 scene 컴포넌트 (매시또한 scene 컴포넌트에서 유래한다)
두번째: 부착 규칙 ( FAttachmentTransformRules 구조체)
세번째: 부착할 소켓 이름 (없을 경우 쓰지 않아도 된다.)
이제 컴파일을 하고 잘 작동하는지 확인해보자.
작동을 아주 잘 하는 것을 볼 수 있다. 비록 움직일때나 점프할때 검이 캐릭터를 베는 문제가 있지만 이 부분은 애니메이션을 수정하면 되는 부분이라 나중에 다듬으면 될 것 같다.
다음에는 캐릭터가 접근하자마자 아이템이 부착되는 것이 아닌 E 버튼을 누르면 부착이 되도록 해볼 것이다.
'게임프로그래밍 > 실습1' 카테고리의 다른 글
[언리얼 실습] 13. 무기 장착 여부에 따른 캐릭터의 상태 업데이트 하기 (0) | 2024.10.13 |
---|---|
[언리얼 실습] 12. E 버튼을 눌러 무기 장착하기 (1) | 2024.10.12 |
[언리얼 실습] 11. 공격 애니메이션 추가하기 (0) | 2024.10.12 |
[언리얼 실습] 10. 캐릭터에 Socket 추가하기 (0) | 2024.10.12 |
[언리얼 실습] 9. 무기 클래스 추가하기 - Quixel Bridge 이용 (1) | 2024.10.12 |