프로젝트 디렉토리에서 Content폴더를 확인할 수 있다. 이 폴더는 여러 유형의 에셋 및 프로젝트 관련 데이터(블루프린트 포함)에 사용하는 폴더다. C++코드는 프로젝트의 Source 폴더에 위치한다.
언리얼 엔진의 모든 c++ 프로젝트는 비주얼 스튜디오 솔루션을 가진다. 비쥬얼 스튜디오는 모든 코드를 구동하며, 실행 로직을 구성하고, 동작 상태의 코드를 디버깅할 수 있는 기능을 개발자에게 제공한다
필요한 에셋을 가져오기 위해서 경로에 있는 것을 다운로드 하고 먼저 SK_Manneqine.fpx를 먼저 임포트 해준 뒤, 나머지 애니메이션도 스켈레탈 메시를 저 fbx로 가져오면 된다.
idle 애니메이션을 열어보면 한쪽 팔이 이상한 걸 볼 수 있는데, 이는 리타겟팅 문제가 발생했다는 것을 보여준다. 애니메이션이 스켈레톤과 별도로 임포트 되면 언리얼 엔진은 내부적으로 애니메이션의 모든 본일 스켈레톤의 본으로 대응시킨다. 간혹 이 과정에서 문제가 발생한다. 이를 해결해보자!
이 스켈레탈 트리에서 옵션 버튼을 눌러 리카겟팅 옵션을 보게 끔 설정해준다
여기서 spine_01, thigh_I, tigh_r 에 각각 오른쪽 버튼 클릭을 하여 트랜슬레이션 리타기팅 스켈레톤 재귀적 선택을 누르면 문제가 해결 된다!
게임에 일시 정지 기능을 추가하고 싶은 경우를 생각해보자. 게임ㅇ르 일시 정지시키기 위한 모든 로직 및 구현 내용이 하나의 클래스 안에 배치돼야할 것이다. 이 클래스는 플레이어가 게임에 입장하면 게임 흐름을 처리하는 역할을 담당하게 될 것이다. 게임 흐름은 게임에서 발생하는 모든 상황이 될 수 있다. 예를 들면 일시 정지, 플레이, 재시작 등은 게임 흐름 행동이라고 할 수 있다. 이와 비슷하게 멀티플레이어 게임에서는 네트워크와 관련된 게임 플레이 로직이 한 곳에 배치돼야 한다. 게임 모드 클래스는 이런 역할을 한다.
게임 모드는 게임 로직을 실행하고 플레이어에게 게임 관련 규칙을 적용하는 클래스이다. 게임 모드는 게임 플레이 변수 및 이벤트 등 현재 플레이 중인 게임에 대한 정보를 포함한다. 게임 모드는 게임플레이 객체의 모든 관리자를 포함할 수 있다. 게임 모드는 싱글톤 클래스이므로 모든 객체 및 게임에 배치된 추상 클래스에 접근할 수 있다. 다른 모든 클래스와 마찬가지로 게임 모드 클래스 역시 블루프린트나 c++로 확장할 수 있다. 이를 통해 게임 안에서 발생하는 상황을 플레이어에게 업데이트하는데 필요한 추가 기능 및 로직을 포함시킬 수 있다. 게임 모드 클래스에 들어가는 몇 가지 게임 로직의 예를 살펴보자.
게임 모드는 그 자체뿐만 아니라 여러 클래스를 사용해 게임 로직을 구현한다. 게임 모드는 다음과 같은 기본 클래스를 지정할 수 있는 기능을 제공한다.
멀티플레이어 게임에서는 많은 플레이어가 게임에 입장할 때 플레이어가 게임으로 입장할 수 있도록 허용하고 플레이어의 상태를 유지하는 로직을 관리할 뿐만 아니라 다른 플레이어의 상태 및 다른 플레이어와의 상호작용을 처리하는 로직을 처리하는 것이 필요하다
게임 모드는 이런 멀티플레이어 게임플레이 로직을 처리할 수 있도록 오버라이딩 할 수 있는 몇가지 이벤트를 제공한다. 다음 이벤트는 네트워킹에 특히 유용하다.
게임 모드 클래스는 클라이언트나 입장한 플레이어에게 복제되지 않으며 게임모드 클래스의 범위는 생성한 서버로 제한된다. 기본적으로 클라이언트-서버 모델에서 클라이언트는 서버에서 실행 중인 게임안에서 입력 역할만 한다. 따라서 게임 플레이 로직은 클라이언트에 존재하지 않고 서버에만 존재해야 한다.
에픽은 4.14 버전부터 AGameModeBase 클래스를 도입했다. 이 클래스는 모든 게임 모드 클래스의 부모 역할을 담당한다. AGameModeBase 클래스는 기본적으로 AGameMode의 단순 버전이다
반면 게임 모드 클래스는 매치 스테이트 개념을 구현한 추가 기능을 포함하는데, 이 덕분에 멀티플레이어 슈팅 게임 유형에 더 적합하다. 기본적으로 게임 모드 베이스는 템플릿 기반으로 새로 생성한 프로젝트에 포함된다.
또한 게임 모드는 플레이어의 상태를 처리하고 추적하는 스테이트 머신을 포함한다.
레벨은 게임의 한 부분이다. 규모가 큰 상당수 게임은 여러 레벨로 나뉘어 구성되며, 플레이어가 플레이할 수 있도록 필요한 레벨을 게임을 불러온다. 플레이어가 해당 레벨의 플레이를 완료하면, 다른 레벨을 로드해 플레이어가 게임을 계속 진행할 수 있도록 만든다. 게임을 완료하기 위해 플레이어는 일반적으로 특정 작업을 완료한 후 다음 레벨로 이동하고, 이런 과정을 거쳐 게임을 완료하게 된다.
게임 모드는 레벨에 직접 적용될 수 있다. 레벨이 로드되면 특정 레벨에 대한 모든 로직과 게임 플레이를 처리하기 위해 할당된 게임 모드 클래스를 사용하며 프로젝트에 할당된 기본 게임 모드를 덮어쓴다.
레벨 블루프린트는 레벨에서 실행되는 블루프린트이다. 하지만 레벨의 범위 밖에서는 접근할 수 없다. 게임 모드는 Get Game Mode 노드를 통해 모든 블루프린트에 접근할 수 있다.
플레이어 컨트롤러 클래스는 플레이어로 생각할 수 있다. 플레이어 컨트롤러는 기본적으로 폰의 영혼이다. 플레이어 컨트롤러는 사용자로부터 입력을 받아 폰 및 게임에서 플레이어와 상호작용하는 다른 클래스에 입력을 전달한다. 하지만 플레이어 컨트롤러를 다루는 동안에는 다음과 같은 사항에 주의해야 한다.