[UE5] 언리얼 기초 다지기-1

칼든개구리·2024년 12월 18일
0

[언리얼TO리얼]

목록 보기
34/42

언리얼 엔진의 Content 폴더 구조

프로젝트 디렉토리에서 Content폴더를 확인할 수 있다. 이 폴더는 여러 유형의 에셋 및 프로젝트 관련 데이터(블루프린트 포함)에 사용하는 폴더다. C++코드는 프로젝트의 Source 폴더에 위치한다.

비쥬얼 스튜디오 솔루션을 활용해 작업하기

언리얼 엔진의 모든 c++ 프로젝트는 비주얼 스튜디오 솔루션을 가진다. 비쥬얼 스튜디오는 모든 코드를 구동하며, 실행 로직을 구성하고, 동작 상태의 코드를 디버깅할 수 있는 기능을 개발자에게 제공한다


필요한 에셋을 가져오기 위해서 경로에 있는 것을 다운로드 하고 먼저 SK_Manneqine.fpx를 먼저 임포트 해준 뒤, 나머지 애니메이션도 스켈레탈 메시를 저 fbx로 가져오면 된다.
idle 애니메이션을 열어보면 한쪽 팔이 이상한 걸 볼 수 있는데, 이는 리타겟팅 문제가 발생했다는 것을 보여준다. 애니메이션이 스켈레톤과 별도로 임포트 되면 언리얼 엔진은 내부적으로 애니메이션의 모든 본일 스켈레톤의 본으로 대응시킨다. 간혹 이 과정에서 문제가 발생한다. 이를 해결해보자!


이 스켈레탈 트리에서 옵션 버튼을 눌러 리카겟팅 옵션을 보게 끔 설정해준다


여기서 spine_01, thigh_I, tigh_r 에 각각 오른쪽 버튼 클릭을 하여 트랜슬레이션 리타기팅 스켈레톤 재귀적 선택을 누르면 문제가 해결 된다!


언리얼 게임 모드 클래스

게임에 일시 정지 기능을 추가하고 싶은 경우를 생각해보자. 게임ㅇ르 일시 정지시키기 위한 모든 로직 및 구현 내용이 하나의 클래스 안에 배치돼야할 것이다. 이 클래스는 플레이어가 게임에 입장하면 게임 흐름을 처리하는 역할을 담당하게 될 것이다. 게임 흐름은 게임에서 발생하는 모든 상황이 될 수 있다. 예를 들면 일시 정지, 플레이, 재시작 등은 게임 흐름 행동이라고 할 수 있다. 이와 비슷하게 멀티플레이어 게임에서는 네트워크와 관련된 게임 플레이 로직이 한 곳에 배치돼야 한다. 게임 모드 클래스는 이런 역할을 한다.

게임 모드는 게임 로직을 실행하고 플레이어에게 게임 관련 규칙을 적용하는 클래스이다. 게임 모드는 게임 플레이 변수 및 이벤트 등 현재 플레이 중인 게임에 대한 정보를 포함한다. 게임 모드는 게임플레이 객체의 모든 관리자를 포함할 수 있다. 게임 모드는 싱글톤 클래스이므로 모든 객체 및 게임에 배치된 추상 클래스에 접근할 수 있다. 다른 모든 클래스와 마찬가지로 게임 모드 클래스 역시 블루프린트나 c++로 확장할 수 있다. 이를 통해 게임 안에서 발생하는 상황을 플레이어에게 업데이트하는데 필요한 추가 기능 및 로직을 포함시킬 수 있다. 게임 모드 클래스에 들어가는 몇 가지 게임 로직의 예를 살펴보자.

  • 게임에 입장할 수 있는 플레이어 수 제한
  • 새로 연결된 플레이어의 생성 위치 및 플레이어 컨트롤러 로직 제어
  • 게임 점수 계산 및 기록
  • 게임 승/패 상태 추적
  • 게임 오버 및 게임 재시작 시나리오 구현

게임 모드 기본 클래스

게임 모드는 그 자체뿐만 아니라 여러 클래스를 사용해 게임 로직을 구현한다. 게임 모드는 다음과 같은 기본 클래스를 지정할 수 있는 기능을 제공한다.

  • Game Session Class: 로그인 승인과 같은 관리자 수준의 게임 흐름을 처리한다.
  • Game State Class: 클라이언트가 게임 안에서 발생하는 상황을 볼 수 있도록 게임의 상태를 처리한다.
  • Player Controller Class: 폰을 소유하고 제어하는데 사용되는 메인 클래스다. 어떤 행동을 해야할지 결정하는 두뇌로 생각할 수 있다.
  • Player State Class: 게임 안에 있는 플레이어의 현재 상태를 저장한다.
  • HUD Class: 플레이어에게 보여주는 사용자 인터페이스를 처리한다.
  • Default Pawn Class: 플레이어가 제어하는 메인 액터다. 이 클래스가 플레이어 캐릭터가 된다.
  • Spectator Class: Default Pawn 클래스의 하위 클래스가 되며, 관리자 폰 클래스는 게임을 관람하는 기능을 담당하는 폰을 지정한다
  • Replay Spectator Player Controller: 게임 안에서 게임이 플레이되는 동안 리플레이를 조작하는 깆능을 담당한다.
  • Server State Replicator Class: 서버 네트워크 통계 데이터의 리플리케이션(복제)를 담당한다.

게임 플레이 이벤트

멀티플레이어 게임에서는 많은 플레이어가 게임에 입장할 때 플레이어가 게임으로 입장할 수 있도록 허용하고 플레이어의 상태를 유지하는 로직을 관리할 뿐만 아니라 다른 플레이어의 상태 및 다른 플레이어와의 상호작용을 처리하는 로직을 처리하는 것이 필요하다

게임 모드는 이런 멀티플레이어 게임플레이 로직을 처리할 수 있도록 오버라이딩 할 수 있는 몇가지 이벤트를 제공한다. 다음 이벤트는 네트워킹에 특히 유용하다.

  • On Post Log In: 이 이벤트는 플레이어가 게임에 성공적으로 로그인한 후에 호출된다. 이 시점 이후에 플레이어 컨트롤러 클래스에서 리플리케이션 로직(멀티플레이어 게임에서 네트워킹에 사용)을 호출하는 것이 안전하다
  • Handle Starting New Player: 이 이벤트는 On Post Log In 이벤트 이후에 호출되며, 플레이어가 새로 입장했을 대 처리할 일을 정의할수 있다. 기본적으로는 새로 입장한 플레이어에게 폰을 생성한다.
  • SpawnDefaultPawnAtTransform: 이 이벤트는 게임안에서 실제 폰 생성을 발생시킨다. 새로 연결된 플레이어는 특정 트랜스폼 또는 레벨에 사전 배치된 플레이어 스타트 위치에서 생성될 수 있다.
  • On Logout: 이 이벤트는 플레이어가 게임을 나가거나 플레이어가 삭제될 때 호출된다.
  • On Restart Player: 이 이벤트는 플레이어가 리스폰될 때 호출된다, 특정 트랜스폼이나 미리 설정된 위치에서 재생성될 수 있다.

네트워킹

게임 모드 클래스는 클라이언트나 입장한 플레이어에게 복제되지 않으며 게임모드 클래스의 범위는 생성한 서버로 제한된다. 기본적으로 클라이언트-서버 모델에서 클라이언트는 서버에서 실행 중인 게임안에서 입력 역할만 한다. 따라서 게임 플레이 로직은 클라이언트에 존재하지 않고 서버에만 존재해야 한다.

GameModeBase와 게임 모드 비교하기

에픽은 4.14 버전부터 AGameModeBase 클래스를 도입했다. 이 클래스는 모든 게임 모드 클래스의 부모 역할을 담당한다. AGameModeBase 클래스는 기본적으로 AGameMode의 단순 버전이다

반면 게임 모드 클래스는 매치 스테이트 개념을 구현한 추가 기능을 포함하는데, 이 덕분에 멀티플레이어 슈팅 게임 유형에 더 적합하다. 기본적으로 게임 모드 베이스는 템플릿 기반으로 새로 생성한 프로젝트에 포함된다.

또한 게임 모드는 플레이어의 상태를 처리하고 추적하는 스테이트 머신을 포함한다.

레벨과 레벨 블루프린트 이해하기

레벨은 게임의 한 부분이다. 규모가 큰 상당수 게임은 여러 레벨로 나뉘어 구성되며, 플레이어가 플레이할 수 있도록 필요한 레벨을 게임을 불러온다. 플레이어가 해당 레벨의 플레이를 완료하면, 다른 레벨을 로드해 플레이어가 게임을 계속 진행할 수 있도록 만든다. 게임을 완료하기 위해 플레이어는 일반적으로 특정 작업을 완료한 후 다음 레벨로 이동하고, 이런 과정을 거쳐 게임을 완료하게 된다.
게임 모드는 레벨에 직접 적용될 수 있다. 레벨이 로드되면 특정 레벨에 대한 모든 로직과 게임 플레이를 처리하기 위해 할당된 게임 모드 클래스를 사용하며 프로젝트에 할당된 기본 게임 모드를 덮어쓴다.
레벨 블루프린트는 레벨에서 실행되는 블루프린트이다. 하지만 레벨의 범위 밖에서는 접근할 수 없다. 게임 모드는 Get Game Mode 노드를 통해 모든 블루프린트에 접근할 수 있다.

언리얼 플레이어 컨트롤러 클래스

플레이어 컨트롤러 클래스는 플레이어로 생각할 수 있다. 플레이어 컨트롤러는 기본적으로 폰의 영혼이다. 플레이어 컨트롤러는 사용자로부터 입력을 받아 폰 및 게임에서 플레이어와 상호작용하는 다른 클래스에 입력을 전달한다. 하지만 플레이어 컨트롤러를 다루는 동안에는 다음과 같은 사항에 주의해야 한다.

  • 폰과 달리 레벨에서 플레이어를 대표하는 플레이어 컨트롤러는 1개만 존재 할 수 있다.
  • 플레이어 컨트롤러는 게임이 진행되는 동안 유지되지만, 폰은 그렇지 않을 수 있다.
  • 폰은 일시적인 특성을 갖고 플레이어 컨트롤러는 지속적으로 유지되는 특징을 갖기 때문에 개발자는 어떤 클래스에 추가해야 할지를 결정할 때 이런 특성을 고려해야 한다.
profile
메타쏭이

0개의 댓글