포스트

[UE5] 공격 기능 구현 1 - Enhanced Input 사용하기

마우스 좌클릭 입력 시 실행할 공격 함수 구현(UE5의 향상된 입력 사용)

구현 목표

마우스 좌클릭으로 공격 애니메이션을 재생하고 다른 캐릭터에게 대미지를 입히는 기능 구현하기

구현해야 할 것들

  1. 마우스 좌클릭 입력 시 실행할 공격 함수 구현(UE5의 향상된 입력 사용) <- 오늘 할 것
  2. 캐릭터가 사용할 무기 클래스 구현
  3. 공격과 피격 매커니즘 구현
  4. 공격 시 재생할 애니메이션과 몽타주 구현

기존 UE4에서 사용하던 방식이 아닌 UE5에서 새로 도입된 Enhanced Input 을 사용하여 구현하는 것이 목표이다.


언리얼 에디터에서 입력 에셋 만들기

먼저 언리얼 에디터에서 Input Action, Input Mapping Context 에셋을 만들어 주어야 한다.

나의 경우 IA_Attack, IMC_MainCharacter 이라는 이름으로 생성하였다.

IMC_MainCharacter을 열어 매핑을 추가하고, 아까 생성한 IA_Attack을 등록해 주었다. 왼쪽 마우스 버튼을 클릭했을 때 공격하고 싶으므로 왼쪽 마우스 버튼으로 매핑한다.

입력 에셋을 캐릭터에 연동하기

캐릭터에 아까 언리얼 에디터에서 만든 IA_AttackIMC_MainCharacter를 연동해주기 위해 캐릭터 클래스의 헤더 파일에 DefaultMappingContextAttackAction 변수를 만들고, UPROPERTY 매크로로 블루프린트에서도 수정할 수 있도록 EditAnywhere라고 선언해 주었다.

1
2
3
4
5
UPROPERTY(EditAnywhere, Category = Input, meta = (AllowPrivateAccess = "true"))
UInputMappingContext* DefaultMappingContext;

UPROPERTY(EditAnywhere, Category = Input, meta = (AllowPrivateAccess = "true"))
UInputAction* AttackAction;

이렇게 변수를 만들어 두면 C++ 캐릭터 클래스를 상속한 블루프린트 클래스에서 변수에 다음과 같이 할당해 줄 수 있다.

다음으로 캐릭터 클래스 헤더 파일에 공격 시 실행할 Attack 함수와 공격 끝날 때 실행할 AttackEnd 함수를 정의하였다.

1
2
void Attack();
void AttackEnd();

지금 당장은 AttackEnd 함수가 없어도 될 것 같다는 생각이 드는데 혹시 나중에 써먹을 일이 생길지도 모른다는 생각에 그냥 미리 만들어두기로 했다.

이 함수들을 입력 이벤트와 연동해 주어야 하는데, 캐릭터 클래스의 부모 클래스인 APawn 인터페이스 SetupPlayerInputComponent 가 준비되어 있으므로 그대로 쓰면 된다. 아마 캐릭터 클래스 헤더 파일에 다음과 같이 이미 선언되어 있을 것이다.

1
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

이제 캐릭터 클래스의 C++ 파일로 가서 다음과 같이 Cast하여 EnhancedInputComponent 를 얻어오자.

1
UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent)

PlayerInputComponent의 경우 APawn 인터페이스 SetupPlayerInputComponent 에 인자로 전달되므로 그대로 써먹으면 된다.

이렇게 얻은 EnhancedInputComponent을 이용해 아까 만든 두 공격 함수를 Bind 해주었다 (BindAction 전에 null 체크 해주는게 좋음)

1
2
EnhancedInputComponent->BindAction(AttackAction, ETriggerEvent::Started, this, &Aproject1Character::Attack);
EnhancedInputComponent->BindAction(AttackAction, ETriggerEvent::Completed, this, &Aproject1Character::AttackEnd);

나의 경우 project1Character 라는 매우 대충 지은 이름으로 캐릭터 클래스를 만들었는데 클래스명에 따라 &A(클래스명) 이 부분은 클래스명에 따라 다를 것이다.

이제 게임상에서 마우스 좌클릭 이벤트가 트리거되었을 때 Attack 함수가, 이벤트가 완료되었을 때 AttackEnd 함수가 실행되게 된다.

잘 작동하는지 테스트 해보고 싶다면 UE_LOG 등의 디버그 기능을 Attack 함수와 AttackEnd 함수에 추가하여 확인해 볼 수 있다.


다음 목표

캐릭터가 대미지를 입히기 위해 사용할 무기 클래스 구현하기

© w9865t. All Rights Reserved.

인기 태그