Coding/Devlog
#22: Multi-cell(Jigsaw) Inventory System
Multi Cell Inventory 디아블로나 이스케이프 프롬 타르코프처럼 인벤토리가 2차원 모눈종이 상에 아이템을 보관하는 방식을 의미한다. 사진 출처 보통 이런 인벤토리 방식은 난이도와 리얼리티를 더해준다. Inventory 구성 요소 InventoryComponent : UActorComponent 메인 캐릭터에 붙어 있는 액터 컴포넌트. 인벤토리의 논리적 기능 (아이템 추가, 제거 등)을 담당한다. InventoryWidget : UUserWidget 인벤토리 UI에 해당하는 위젯 InventoryGridWidget : UUserWidget 인벤토리 UI에서 아이템 그리드를 그리는 위젯 ItemWidget : UUserWidget InventoryComponent가 가지고 있는 아이템들의 UI에..
#21: 전투 시스템 개선
분석 게임의 코어 시스템만 만든 채로 테스트 플레이를 해봤는데, 문제가 많았다. 물리엔진 오류(서로 부딪히면 적이 날라가버림)이나 일정 경우에 페이탈 에러가 뜨기도 했다. 해본 결과 가장 문제는 "전투가 재미없다"였다. 왜 그럴까? 다크소울3와 엘든링을 플레이하며 분석을 해봤다. 크게 2가지 문제로 나누었다. 위협적이지 않은 AI AI는 굉장히 방어적이다. 문제는 방어적이면 방패라도 들고 있던가해서 플레이어가 무턱대고 공격하지 못하도록 해야 하는데, 아직 방패 구현이 되어 있지 않아서 그냥 샌드백이었다. 이를 위해서 AI를 좀더 공격적으로 만들 필요가 있다. 리스크가 없는 공격 플레이어의 공격 모션이 적에 비해서 아주 빨라서 공격하기가 너무 쉽고, 적은 어떤 공격이라고 맞으면 휘청거리니 가까이 다가가서 ..
#19 테스트 레벨 제작
테스트 맵 테스트 맵은 Geometry Brush로 빠르게 제작했다. 미로를 만들어야 해서 Maze Generator를 사용했다. 나중에는 Mesh Generation을 C++로 구현해야 할 것이다. 어떤 방식으로 할지는 고민해봐야겠다. 메인 메뉴 제작 구색을 맞추기 위해 시작 - 나가기만 구현된 메인 메뉴를 만들었다. 이 때, 잘 쓰는 블루프린트 노드는 AddViewport / Set Input Mode / Set Show Mouse Cursor 등이 있다. 재시작 구현 플레이어가 죽으면, 재시작을 할 수 있다는 Widget을 띄어야 한다. 이게 생각보다 코드로 나타내기 난감한데, 양은 적다. // Header class TSubclassOf RestartWidgetClass; // cpp if (Re..
#18 Enemy AI 향상: EQS, LineTrace
EQS 현재는 AI가 Agro Sphere이라는 콜리젼을 가지고 있고, 여기에 메인 캐릭터가 들어오면 인식하는 구조다. 이렇게 되니 시야각 설정이 복잡해지는 문제점이 있다. 언리얼 엔진은 이에 대한 해답으로 EQS(Environment Query Sysyem)을 제시한다. EQS는 쉽게 얘기해서 Pawn과 Pawn 사이 인식을 쉽게 가능하게 해주는 인터페이스다. 인식(Perception)은 다양한 방식의 자극(Stimuli)을 통해 이뤄진다. Stimuli의 종류는 다음을 포함한다. (밑의 목록말고 더있음) 소리 데미지 시야 그러니까 사람과 비슷하다. 누가 내 눈에 보이거나, 무언가에게 공격받거나, 들으면 우리는 그게 뭔진 몰라도 인식할 수 있다. 이러한 EQS 시스템을 쓰는 건 또 꽤 간편하다. 다음의..
#14 패트롤 포인트를 Spline으로 에디터 수준에서 그리기
Spline 본격적으로 Enemy AI를 손보기 시작했다. 기존에 단순한 애니메이션을 벗어나 플레이어의 애니메이션을 가져와서 쓸 수 있도록 새롭게 Enemy Animation Instace 클래스를 만들었다. 일단 오늘은 패트롤 포인트를 에디터에서 쉽게 찾아볼 수 있도록 했다. 에디터에서 잘 보려면 블루프린트 수준에서 코드를 구현해야 했다. 구현한 블루프린트는 다음과 같다. 결과
#13 3번째 스프린트 수립
지난 스프린트 회고 지난 스프린트는 일주일간 진행됐고, 주로 메인 캐릭터의 전투 시스템 개선에 목적을 두었다. 의도했던 정도로 업데이트하는 데에 전혀 차질이 없었다. 사실 생각보다 빨리 끝났는데, 언리얼 엔진을 계속 쓰다보니 아무래도 헤매는 시간이 줄어든 것 같다. 그래서 기능이나 함수를 찾지 못해 허비하는 시간이 줄어들었고, 이로 인해 진짜로 신경써야 하는 부분에 빠르게 접근할 수 있었다. 이번 스프린트 계획 이번 스프린트의 목표는 "흥미로운 적 AI 개발"이다. 이를 위해 4가지 세부 목표로 나누었다. AI가 Player와 비슷한 수준의 Animation을 가지고 있다. AI가 패트롤할 수 있다. AI가 시야가 있고 이에 따른 행동을 취한다. (현재는 무조건 적대) AI 공격 시 저마다의 행동 패턴을..
#12 연속 공격 시스템 구현
연속 공격 시스템 연속 공격 시스템이 작동하는 방식은 간소화했다. 일정 타이밍, 정확히는 CombatStatus가 Recovery일 때, 다시 공격하면 다른 공격모션이 발동한다. 약공격은 3연속, 강공격은 2연속 공격을 할 수 있다. 타이밍이 정확해서 구현하는 데에 어려움이 없었다. 구현은 빠르게 했는데, 다른 곳에서 발생한 다른 버그가 있어서 그런 부분들을 남은 시간에 해결했다. 메가 스캔을 써보면서 퀵셀 에셋을 둘러봤는데, 아직 애매하다. 결과
#11 Strafe Movement with Evade
Root motion in blend space 이 작업에서 가장 헤맸던 부분은 Evade 애니메이션을 Root Motion으로 재생해야 하는데, 4방향 밖에 없다는 것이었다. 45도나 135도는 물론, 패드까지 지원하려면 Blend Space를 써야한다. 문제는 Blend Space에 애니메이션을 넣어도 Root Motion이 적용되지 않는 것이었다. 정확히 말하면 애니메이션은 재생되는데, 위치는 움직일 수 없는 상태였다. 문제는 AnimInstance의 Root Motion Mode 였다. Root Motion Mode는 다음 4가지다. No Root Motion Extraction 루트 모션 추출 없음 - 루트 모션은 그대로 놔둡니다 (루트 본에 적용됩니다). Ignore Root Motion 루트..