본문 바로가기
Unreal Engine5/KDT 2024

[UE5 KDT2024] 3. EnhancedInput 입력 테스트

by 유잉유잉유잉 2025. 2. 15.
728x90

 

1. 입력을 받아보자 

 

1) Blueprint / Input 폴더에 - 입력 - 입력 매핑컨텍스트 - IA_Context 생성

  • 입력 매핑 컨택스트 : 입력액션을 모아놓음

 

2) 입력 - 입력 액션 - IA_Move 생성

  • 값 타입 : Axis2D (Vector2D) 

 

▶️입력액션 :  직접 움직이거나, 공격을 하거나 이런걸 입력 액션으로 처리 

  • 역할에 대한 정보만 구분함. 직접 키 매핑이 된건 아님. 
  • 입력 변수 구분(value Type) :
    • 문을연다, 장비 착용 같은건 bool로 설정
    • 이동같은 경우엔 vector2D

 

▶️ 입력 매핑 컨텍스트(Input Mapping Context) : 입력액션을 모아둔 애들

  • 사용자의 입력값을 만들어준 인풋 액션과 바인딩.
  • 여러개의 Input Mapping Context를 가질 수도 있음. 
  • 각각 우선순위를 지정하여 같은 키를 입력해도 어떤 액션이 나갈지 지정가능.
    • 이동키를 눌러도 인벤이 열렸다면, 인벤토리 탐색하도록 설정할 수 있다.
    • 예전엔 인벤이 열렸는지 bool값을 통해 체크했으나 이젠 input Mapping Context 를 연결하는 것으로 해결 가능하다.

 

3) IA_Context에서 이동 생성 

(1) 매핑추가 - IA_Move 

(2) IA_Move에서 키보드 키별로 추가

(3) 트리거 : 입력 어느 상태에서 반응할건지 -> 추가 -> 다운 ( 키 눌리자마자)

(4) 모디파이어

  • 앞으로 이동 : 스무드델타 
  • 뒤로 이동 : 스무드 델타 + 부정
  • 왼쪽 :  스위즐 입력 측값 + 부정
  • 오른쪽 : 스위즐 입력 측값



트리거 인덱스(배열 엘리먼트 옆에) 플러스 눌러서 트리거 추가

 

▶️ 트리거 : 어떤방식으로 입력을 받을지인듯, 입력 받은 값을 어떻게 활용할지. 

 

▶️모디파이어 Modifier  : 입력받은 값을 변환해주는 장치 

  • 스무드 델타 : 현재 입력값과 마지막 입력값의 스무드델타값을 생성
  • 스위즐 입력 축값 :  입력값의 스위즐축 컴포넌트
    • 입력받은 값의 우선순위 넣어주는 순서 인듯 
    • 인덱스 YXZ 가 되어있으면 Y축 값이 상승

 

 

▶️ 언리얼에서 입력은 입력 - 입력액션을 사용

 

▶️ 다운 : 누르고있을때 계속 트리거가 발생

누르고 뗐을 때 - 누르고, 뗐을때 두번 발생 

 

 

▶️ 값타입

bool : 입력시 true, false로 

입력(눌렀을때)했을때 값의 리턴값 설정

 

  • 부정 : 입력값 반대 . Y축 부정이면 뒤쪽으로 이동 




 

 

2. 캐릭터 생성 - 블루프린트 생성 및 설정

 

  • 테스트 작업용으로 편한 Paragon:Aurora 팹에서 저장 -> 라이브러리에서 프로젝트로 가져오기 -> 끄고하는게 안전하고 빠름.

 

(1) 블푸/액터 폴더에 캐릭터 상속받은 BP_Character 생성

 

(2) 블프 에디터 - 추가 spring Arm - 디테일창에서 카메라 - 타겟 암 길이 : 500으로 조정해서 캐릭터와 카메라간 길이 조정해주기 

  • spring Arm : 카메라와 캐릭터간 거리, 각도 등등 조절 , 셀카봉의 막대기 같은거라고 생각하면됨

(3) 추가 - 카메라 생성 후 - Arm 자식으로 변경, 위치 올리고 각도 내려주자.





 

 

3. 캐릭터 생성 - 이벤트 그래프 BP_Character - 이동을 블루프린트에서 적용해보자 

 

1) 플레이어 컨트롤러에 입력 매핑 컨텍스트 지정해주기

 

(1) GetController 추가, Cast To PlayerController (Cast가 형변환이라고 생각하면 됨) 

 

(2)  Cast To PlayerController 의 AS플레이어 컨트롤러에서 GetEnhancedInputLocalPlayerSubSystem 추가하여 연결

 

(3) GetEnhancedInputLocalPlayerSubSystem 에서 Add MappingContext 추가,

Mapping Context를 IA_Context로 선택 








▶️ 구조 

액터

 폰 

ㄴ 액터를 상속받고 있음

입력 받을 수 있음

 

캐릭터

ㄴ 폰을 상속받고 있음

ㄴ 화살표 컴포넌트는 디버그모드에서만 보임

ㄴ캐릭터 무브먼트 

 

UObject가 언리얼에서 최상위 객체

 



2) 블루프린트에서 IA_Move 적용하기 - 앞으로 이동


(1) IA_Move 추가

  • ActionValue 구조체 핀 분할을 통해 x,y,z 좌표를 나눌 수 있다.

 

(2) Get Actor Forward Vector 추가 

 

(3) Add Movement Input 추가

  • 언리얼에서 입력에 따라 움직일때 사용

 

(4) 연결



▶️ Get Actor Forward Vector + Add Movement Input - ‘선택에서 코멘트 생성’ 누르면

위 이미지처럼 메모 남길 수 있다.

 

 

3) 좌우 이동도 동일하게 적용

 

 


 

 

4. 게임모드생성 

  • 블루프린트 생성 - 게임모드 베이스 - GameModeMain 생성
  • 디폴트 폰 클래스 - BP_Character 설정
  • 맵 아웃라이너 - 월드세팅탭 - 게임모드 오버라이드에서 GameModeMain 설정 

 

=> 실행하면, 캐릭터 자동 스폰되고 이동도 가능하다. 

 

 

 

▶️ GameMode와 GameState

: 플레이중 게임 정보를 처리하는 클래스는 GameMode와 GameState가 있다. 

 

1️⃣ GameState

: 규칙 관련 이벤트 발생하고 트래킹을 통해 모든 플레이어와 공유할 필요가 있을 때 보관되고,

게임 스테이트를 통해 처리된다.

  • 클라이언트가 게임의 상태를 모니터링할 수 있도록 해준다. 
  • AGameStateBase 클래스  
  • 정보에 포함되는 것들
    •  
    • 게임 실행 기간 ( 로컬 플레이어 참가 전 실행시간 포함 )
    • 각 플레이어의 게임 참가 기간, 플레이어 현재 상태
    • 현재 게임 모드의 베이스 클래스
    • 게임 시작 여부

 

2️⃣ GameMode 

  • 게임 플레이 하는데 관련된 규칙을 정의하고 구현. (ex: 플레이어 수, 플레이어 참가 방식 등 )
  • 베이스 클래스 : 
    • AGameMode : 4.14 이전 버전용. 슈팅 게임 유형에 적합.  AGameModeBase 의 자손이 됨
    • AGameModeBase : 4.14 이후 사용
  • 여러 AGameModeBase를 만들 수 있으나 한번에 하나의 게임 모드만 사용할 수 있다.
  • 게임 모드 액터는 UGameEngine::LoadMap()을 통해 플레이할 레벨을 초기화시킬 때마다 인스턴스를 만든다.
  • 게임 모드는 멀티플레이어 게임에 는 원격 클라이언트에 리플리케이트 되지 않는다.
    • 서버에만 존재하므로, 로컬 클라이언트는 원본 모드 클래스 (또는 블루프린트)를 볼 수 있지만 실제 인스턴스에 접근하여 변수를 확인하고 게임 도중 무엇이 변경되었는지 확인할 순 없다.
    • 플레이어가 현재 게임 모드 관련해서 업데이트된 정보가 필요한 경우 그 정보는 AGameStateBase 액터에 저장된 내용을 통해 쉽게 동기화 상태를 유지할 수 있으며, 이 중 하나를 게임 모드와 함께 생성한 다음 모든 원격 클라이언트로 리플리케이트한다. 

  • 게임모드 설정하기 우선권 순위 DefaultEngine.ini에서 GameMapsSettings 섹션에 GlobalDefaultGameMode 설정
    • 개별 맵 디테일창에서 월드세팅 
    • URL을 실행파일에 붙여서 게임 시작시 로드할 맵 강제 지정 가능 
    • DefaultEngine.ini의 WorldSettings섹션에 맵 접두사 설정하기

 

 

 

▶️ AGameModeBase 기본 함수 

InitGame() : ( PreInitializeComponents 포함 ) 다른 스크립트 전에 호출. 파라미터 초기화 시키고, 헬퍼 클래스 스폰.

  • 이 함수는 다른 액터가 GameMode 인스턴스 자체를 포함해서 PreInitializeComponents()를 호출 하기전에 호출됨

 

PreLogin() : 서버에 접근 시도중인 플레이어를 수락 또는 거부한다. 

  • ErrorMessage에 공백 아닌 스트링을 입력하면 Login 함수가 실패하도록 만든다.
  • PreLogin()은 Login() 전 호출되며, 참가하는 플레이어가 게임 콘텐츠를 다운로드 해야하는 경우 시간이 한참 지나서야 Login()이 호출될 수도 있다.

 

PostLogin() : 로그인 성공 이후 호출. 

  • PlayerController 에서 리플리케이트 되는 함수 호출을 하기에 안전한 첫번째 장소이다.
  • 블루프린트로 OnPostLogin을 구현하여 부가로직을 추가할 수 있다.

 

HandleStartingNewPlayer() : PostLogin 또는 심리스 트래블 이후 호출. 

  • 블루프린트에서 덮어써서 새 플레이어에게 벌어지는 일을 변경할 수 있다. 기본적으로 플레이어에 대한 폰 생성

 

RestartPlayer () : 플레이어의 폰 스폰을 시작하기 위해 호출.

  • 폰 스폰 위치를 지정 함수 : RestartPlayerAtPlayerStart(),  RestartPlayerAtTransform()
  • OnRestartPlayer()를 블루프린트에서 구현하여 이 함수 완료후의 로직을 추가할 수 있다.

 

SpawnDefaultPawnAtTransform() : 플레이어의 폰이 실제 스폰되는곳으로, 블루프린트에서 덮어쓸 수 있다.

 

Logout () : 플레이어가 게임을 떠나거나 소멸 되었을 때 호출.

  • OnLogout을 구현하여 블루프린트 로직을 짤 수 있다.



 

 

 


 

 

5. 캐릭터 이동을 C++로 구현하기 

 

1) 코드 없을때, c++ 스크립트 추가하는 방법 :  틀 - 새로운 c++클래스 추가 

 

2) 캐릭터 상속, Actors폴더 생성, PlayerBase 생성 

 

▶️ SetupPlayerInputComponent () : 입력 관련 바인딩 처리 함수 

▶️  포함파일을 열 수 없다고 뜬다면 새로 추가한 스크립트의 cpp의 include를 살펴봅시다 ( 파일명만 남기고 앞경로 지우기 )

▶️  생성자에서 PrimayActorTick.bCanEverTick  = true ; 일 경우 프레임마다 tick()이 호출된다.

 

3) 카메라랑 암 추가해보자 - 헤더 

#include "EngineMinimal.h" // 변경 

protected:

    UPROPERTY( VisibleAnywhere )

    TObjectPtr<UCameraComponent> mCamera;

    UPROPERTY( VisibleAnywhere )

    TObjectPtr<USpringArmComponent> mArm;


▶️ UPROPERTY() : 새 클래스, 함수, 변수를 인식하게 하는 리플랙션 매크로. 이 매크로는 엔진이 수집하는 가비지.

728x90

댓글