무기 근처에 가면 자동으로 캐릭터에 장착되는 것이 아닌 버튼을 눌러 장착할 수 있게 만들어보자
목차
- 입력키 매핑하기
- C++에서 키 입력으로 장비 장착하게 하기
- 캐릭터 블루프린트에서 액션 넣어주기
1. 입력키 매핑하기
키보드 버튼을 눌러 아이템을 장착하려면 키를 매핑해야 한다.
Input Action을 만들어 매핑을 진행해보자. 언리얼 엔진 5.1버전인가 5.2버전 정확히는 기억이 안나는데 어쨌든 그때나온 향상된 입력 기능을 사용할 것이다.
인풋 액션을 만들었으면 여기서 딱히 건들일 것은 없다. 키를 눌렀는지 안눌렀지만 알면 됨으로 Value Type은 그대로 불리언으로 놓아두면 된다.
이제 매핑 컨텍스트에 매핑을 하자
인풋 매핑 컨텍스트를 열고 Mappings의 + 버튼을 눌러 액션을 추가해준다.
아직은 딱히 트리거나 뭐 건들일께 없으니 이제 이것을 토대로 C++에서 코드를 작성해 보자
2. C++에서 키 입력으로 장비 장착하게 하기
이제 C++에서 키를 바인딩을 해보자. 캐릭터 클래스에서 진행할 예정이라 캐릭터 헤더파일과 cpp 파일을 열도록 하자.
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
UInputAction* EKeyAction;
void EKeyPressed();
프로텍트 영역에 다음과 같이 선언해준다.
인풋 액션을 담을 포인터 하나와 이 액션과 연결할 함수를 만들면 된다. 함수의 경우 실행 여부만 알면 되니 매개변수가 딱히 필요하지는 않다.
void AKnight::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent))
{
EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AKnight::Move);
EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AKnight::Look);
EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump);
EnhancedInputComponent->BindAction(EKeyAction, ETriggerEvent::Started, this, &AKnight::EKeyPressed);
}
}
다음과 같이 함수를 정의해주자. 각각의 액션들을 각각의 함수와 연결한다는 것이다.
이제 함수를 정의해서 장비를 장착할 수 있게 해보자.
private:
UPROPERTY(VisibleInstanceOnly)
class AItem* OverlappingItem;
프라이빗 영역에 다음과 같이 선언해 줄 것이다. 이곳에는 캐릭터와 오버랩된 아이템(장비)가 들어올 것이다.
포인터로 선언했기 때문에 언리얼 엔진에서 관리해줄 수 있도록 UPROPERTY 매크로를 사용하고 런타임 환경에서 캐릭터와 오버랩된 아이템이 어떤 것인지 볼 수 있게 VisibleInstanceOnly 속성을 주었다.
그리고 이 오버랩 된 아이템을 다른 클래스(아이템 클래스)에서 설정할 수 있게 Get과 Set 메서드를 만들어주자.
public:
FORCEINLINE void SetOverappingItem(AItem* Item) { OverlappingItem = Item; }
퍼블릭영역에 다음과 같이 인라인 함수를 만들어주자. FORCEINLINE 매크로는 컴파일러가 강제로 인라인 함수로 만들도록 지시하는 역할을 한다.
이 강의를 들으면서 처음안 사실인데 C++의 inline 키워드는 컴파일러에게 인라인으로 만들 것을 제안하는 것으로 컴파일러가 이득이 없다고 생각하면 그냥 일반적인 함수로 만든다고 한다.
이제 Item.cpp 파일로 돌아가 오버랩 부분의 함수를 바꾸자
#include "Knight.h" // 캐릭터 클래스를 캐스트 할꺼기 때문에 헤더파일을 가져와야 한다.
void AItem::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
AKnight* KnightCharacter = Cast<AKnight>(OtherActor);
if (KnightCharacter)
{
KnightCharacter->SetOverappingItem(this);
}
}
void AItem::OnSphereEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
AKnight* KnightCharacter = Cast<AKnight>(OtherActor);
if (KnightCharacter)
{
KnightCharacter->SetOverappingItem(nullptr);
}
}
이제 아이템과 오버랩 되면 캐릭터의 오버랩된 아이템 포인터가 해당 아이템으로 채워지고 아이템 바깥 영역으로 나가면 아이템 포인터가 비워진다.
이제 장비 클래스로 돌아가 근처에 가면 부착되는 대신 부착을 하는 함수를 따로 만들어보자.
//Weapons.h 파일
public:
void Equip(USceneComponent* InParent, FName InSocketName);
퍼블릭 영역에 장비를 장착하는 함수를 만들고 이를 캐릭터 클래스에서 사용할 것이다.
cpp 파일로 가 Equip 함수를 정의하고 오버랩 함수의 내용을 바꾸자
void AWeapons::Equip(USceneComponent* InParent, FName InSocketName)
{
FAttachmentTransformRules TransformRules(EAttachmentRule::SnapToTarget, true);
ItemMesh->AttachToComponent(InParent, TransformRules, InSocketName);
}
void AWeapons::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
Super::OnSphereOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult);
}
이제 이렇게 하면 Equip 함수를 통해 장비를 장착할 수 있게 된다.
이제 다시 캐릭터 클래스로 돌아가 E 키를 눌렀을때의 반응을 정의해보자
#include "Item.h"
#include "Weapons/Weapons.h"
void AKnight::EKeyPressed()
{
AWeapons* OverlappingWeapon = Cast<AWeapons>(OverlappingItem);
if (OverlappingWeapon)
{
OverlappingWeapon->Equip(GetMesh(), FName("RightHandSocket"));
}
}
아이템의 경우 여러 종류가 있을 수 있기 때문에 장비로 캐스트를 먼저하고 이후 이 장비를 캐릭터에 장착을 한다. 이렇게 하면 E키를 누르고 캐릭터가 아이템의 영역 안에 있을 경우 장비를 장착할 수 있게 된다.
이제 컴파일을 하고 에디터로 돌아가자
3. 캐릭터 블루프린트에서 액션 넣어주기
이제 매핑은 끝났으니 캐릭터 블루 프린트로 들어가 액션을 넣어주어야 한다.
현재 EkeyAction이 비어있는데 이 부분을 우리가 처음에 만들었던 인풋 액션을 넣어주면 된다. 블루프린트도 컴파일 하고 실행해보면 아주 잘 작동하는 것을 볼 수 있다.
다음에는 무기를 가지고 있는지 아닌지에 따라 캐릭터의 애니메이션을 변경해 볼 것이다.
'게임프로그래밍 > 실습1' 카테고리의 다른 글
[언리얼 실습] 14. Blend Poses 를 이용하여 상태에 따른 애니메이션 보여주기 (0) | 2024.10.13 |
---|---|
[언리얼 실습] 13. 무기 장착 여부에 따른 캐릭터의 상태 업데이트 하기 (0) | 2024.10.13 |
[언리얼 실습] 11. 캐릭터 소켓에 무기 에셋 붙이기 (0) | 2024.10.12 |
[언리얼 실습] 11. 공격 애니메이션 추가하기 (0) | 2024.10.12 |
[언리얼 실습] 10. 캐릭터에 Socket 추가하기 (0) | 2024.10.12 |