본문 바로가기

게임 개발/이득우의 언리얼 C++

(14)
[이득우의 언리얼 C++ 게임개발의 정석] #15. 게임의 완성 완전한 게임 제품으로 발전하려면게임의 시작, 게임의 종료, 미션 달성, 게임 데이터의 저장 및 로딩 등의 기능이 필요하다.이를 구현하기 위해 알아두면 좋은 언리얼 엔진의 기능을 학습한다.. 게임 데이터의 저장과 로딩여태 게임플레이의 기본적인 틀을 확장하여 플레이어의 데이터를 저장하고 이를 불러들이는 로직을 구현해 본다. ※ SaveGame이라는 언리얼 오브젝트를 상속받은 클래스를 설계하고, 이를 세이브게임 시스템에 넘겨주면 게임 데이터의 저장과 로딩을 간편하게 구현할 수 있다. (Saved 폴더에 있는 SaveGames라는 폴더에 데이터가 저장된다.) ※게임 세이브 기능에는 각 저장 파일에 접근할 수 있는 고유 이름인 '슬롯 이름'이 필요하다. 처음에는 세이브된 데이터가 없으니 '기본 세이브 데이터를 생..
[이득우의 언리얼 C++ 게임개발의 정석] #14. 게임플레이의 제작 여태까지 프로토타입을 만들었다면,앞으로 실제 게임으로 확장할 때 필요한 기능을 채워 넣어야 한다.플레이어 스테이트, 게임 스테이트에 대해 학습하고이들을 바탕으로 데이터를 체계적으로 관리하도록 게임 기능을 구현한다.. 캐릭터의 스테이트 설정플레이어 캐릭터, AI 캐릭터의 기능을 체계적으로 관리하기 위해 캐릭터에도 스테이트 머신 모델을 구현한다.PREINIT 스테이트 : 캐릭터 생성 전의 스테이트. 기본 캐릭터 에셋이 설정돼 있지만 캐릭터, UI를 숨긴다. 데미지를 입지 않는다.LOADING 스테이트 : 선택한 캐릭터 에셋을 로딩하는 스테이트. 게임이 시작된 시점이므로, 현재 조종하는 컨트롤러가 AI인지 플레이어인지 구분하고 플레이어인 경우 에셋 로딩이 완료될 때까지 조종하지 못하게 입력을 비활성화함.REA..
[이득우의 언리얼 C++ 게임개발의 정석] #13. 프로젝트의 설정과 무한 맵의 제작 현재 프로젝트의 소스를 효과적으로 관리할 수 있도록 프로젝트 구조를 변경하고게임 설정에 관련된 데이터를 별도의 모듈로 분리하는 한편,언리얼 엔진의 설정 시스템을 이용해 게임의 기본 데이터를 INI 파일로 관리하는 방법을 학습한다.또한, 레벨을 섹션이라는 단위로 개편하고 무한으로 증가하는 레벨을 설계한다.. 프로젝트의 정리와 모듈의 추가프로젝트 정리 : 확장자가 '.h'인 헤더 파일들은 Public 폴더로, '.cpp' 파일들은 Private 폴더로 옮긴다.모듈의 추가 : 지금까지 작업한 코드는 'ArenaBattle'이라는 '주 게임 모듈'에서 관리한다. 게임 세팅을 위한 별도의 게임 모듈(ArenaBattleSetting)을 생성해서 두 개의 모듈로 게임 프로젝트를 구성해 보자.※ 추가 모듈 제작을 위..
[이득우의 언리얼 C++ 게임개발의 정석] #12. AI 컨트롤러와 비헤이비어 트리 비헤이비어 트리 모델을 사용해 컴퓨터 인공지능을 설계하고인공지능에 의해 스스로 정찰하고 플레이어를 쫓아와 공격하는 NPC 제작. AIController와 내비게이션 시스템언리얼 엔진에는 컴퓨터가 인공지능으로 NPC를 제어하도록 'AI 컨트롤러'를 제공한다.→ AIController를 상속받는 "ABAIController" 클래스 생성//ABCharacter.cpp#include "ABAIController.h"AABCharacter::AABCharacter(){ AIControllerClass = AABAIController::StaticClass(); //AIControllerClass의 클래스 속성을 ABAIController 의 클래스로 정한다. AutoPossesAI = EAutoPos..
[이득우의 언리얼 C++ 게임개발의 정석] #11. 게임 데이터와 UI 위젯 엑셀 데이터로부터 캐릭터의 능력치를 관리할 수 있도록테이블 데이터를 언리얼 엔진에 불러들이는 방법을 알아본다.게임 데이터를 효과적으로 관리하는 게임 인스턴스 클래스,방대한 로직을 분산시킬 수 있도록 액터 컴포넌트를 설계해 액터에 적용캐릭터의 현재 스탯을 HP바로 표시하는 기능 구현. 엑셀 데이터의 활용엑셀에 저장돼 있는 캐릭터의 스탯 데이터 테이블을 언리얼 엔진에 불러들여보자. 스탯 데이터는 변하지 않는 데이터이므로, 보통 게임 앱이 초기화될 때 불러들인다.→ 게임 앱을 관리하기 위해 '게임 인스턴스'라는 언리얼 오브젝트가 제공된다.→ "ABGameInstance" 게임 인스턴스 클래스를 생성하고, 맵&모드 탭에 있는 GameInstance를 바꿔준다.→ GameInstance의 Init 함수를 호출해 ..
[이득우의 언리얼 C++ 게임개발의 정석] #10. 아이템 상자와 무기 제작 언리얼 엔진의 '소켓 시스템'을 활용해 캐릭터 에셋에 액새서리를 부착하는 방법을 학습한다.물리 엔진 기능을 활용해 플레이어 캐릭터만 감지하는 아이템 상자를 제작하고상자를 먹으면 아이템을 생성한 후 캐릭터에 부착시키는 기능을 구현해 본다. . 캐릭터 소켓 설정캐릭터 오른손에 무기를 장착해 보자. 무기는 캐릭터에 트랜스폼으로 배치하는 것이 아니라 메시에 착용해야 한다.언리얼 엔진은 캐릭터에 무기, 액세서리를 부착하기 위한 용도로 '소켓'이라는 시스템을 제공한다.※예제에는 'hand_rSocket' 이름의 소켓이 오른쪽 손에 있다. 무기는 스켈레탈 메시이기 때문에 스켈레탈 메시 컴포넌트를 캐릭터 메시에 부착한다.//ABCharacter.hUPROPERTY(VisibleAnywhere, Category = We..
[이득우의 언리얼 C++ 게임개발의 정석] #9. 충돌 설정과 대미지 전달 게임 콘텐츠는 액터와 액터 간의 상호작용을 기반으로 한다.좋은 게임 콘텐츠는 시각적인 요소뿐 아니라 기획의 의도대로 액터들이 상호작용할 수 있도록물리 엔진을 제대로 설정하는 것이 중요하다.물리 엔진을 설정하는 방법을 살펴보고, 기획한 대로 물리 시스템이 동작하는지 파악해 보자. . 콜리전 설정 - (콜리전 = 물리적 충돌 영역)※ 액터의 움직임을 사실적으로 표현하는 데 물리 엔진이 활용된다.→ 물리 엔진을 활용하려면 콜리전부터 학습해야 한다. -콜리전 제작 방법스태틱메시 에셋 : 스태틱메시 에셋에 콜리전 영역을 심는 방법.기본도형 컴포넌트 : 구체, 박스, 캡슐 등의 도형을 사용해 충돌 영역을 지정하는 방법. 스태틱메시와 별도로 충돌 영역을 제작하는 데 사용한다. / 스켈레탈 메시를 움직일 때 주로 사용..
[이득우의 언리얼 C++ 게임개발의 정석] #8. 애니메이션 시스템 활용 애니메이션 몽타주, 노티파이라는 기능을 활용하여연속으로 공격 명령을 내리면 콤보 공격을 순서대로 연계하는,만약 입력이 늦으면 다시 처음부터 공격을 시작하는 콤보 시스템을 구현해 보자. 애니메이션 몽타주위에서 말한 콤보 시스템은 지난 장에서 배운 스테이트 머신을 사용해서 모든 공격에 대해 스테이트를 생성하면 구현할 수 있다. 하지만 이렇게 되면 너무 복잡해진다.스테이트 머신의 확장 없이 특정 상황에서 원하는 애니메이션을 발동시키는 '애니메이션 몽타주'라는 기능이 있다. ※애니메이션 몽타주 : 여러 애니메이션 클립들의 일부를 떼어내고 붙여서 새로운 애니메이션을 생성하는 기법 '애님 몽타주' 생성 후, WarriorAttack1, 2, 3, 4를 드래그로 등록하고 각 모션이 끝나는 시각을 파악하여 '끝 시간'..