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 이후 사용
- AGameMode : 4.14 이전 버전용. 슈팅 게임 유형에 적합. AGameModeBase 의 자손이 됨
- 여러 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() : 새 클래스, 함수, 변수를 인식하게 하는 리플랙션 매크로. 이 매크로는 엔진이 수집하는 가비지.
'Unreal Engine5 > KDT 2024' 카테고리의 다른 글
[UE5 KDT2024] 6. TMap, TSet, TQueue (0) | 2025.02.18 |
---|---|
[UE5 KDT2024] 5. 입력 키 변경하기 EnhanceInput_KeyChange (0) | 2025.02.17 |
[UE5 KDT2024] 4. 플레이어 기본 코드 생성 (0) | 2025.02.16 |
[UE5 KDT2024] 2. 블루프린트 액터 생성 해보자. (0) | 2025.02.14 |
[UE5 KDT2024] 1. 개발환경 세팅 (0) | 2025.02.13 |
댓글