처음에는 Ray를 쏴서 hitpoint의 위치 값을 활용할 생각이였지만, hitpoint의 값이 일정하게 떨어지지 않아서 그냥
hitpoint의 위치와, Ray와 부딪힌 모델의 콜라이더 위치를 사용하여 방향을 구하여 x,z 방향의 부호값을 이용하였다.
조금 무식한 방법인거 같아 나중에 다시 한번 코드를 살펴볼 예정이다.
방향을 통해 sampleModel의 회전값도 바꿔줬다.
2. 에디터의 UI 마무리 및 버튼들의 이벤트 등록
StructureEditor의 UI 디자인을 마무리하고, UI상의 버튼들의 클릭시 이벤트를 위의 SetClickedModel 함수로 묶어줬다.
클릭했을때의 Active가 켜진 카테고리의 버튼을 받아와서 그 버튼중에 마우스와 충돌한 버튼의 모델이름을 받아 SampleModel에 해당이름의 모델을 새로 할당해줬다.
3. 주점 안 바닥 설치
따로 Plane 객체를 만들어 바닥을 깔았다. 이후에 바닥의 이미지를 원하는 이미지로 바꿀수 있도록 하는 기능을 만들 예정이다. 또한 현재 전체적으로 나오고 있는 Grid를 주점 내 바닥이 깔린곳에만 그리드를 출력하게끔 할 생각이다.
작업 소감 :
현재 촛불 모델에 point light를 구현하는것과 주점 내 의자의 노드까지의 캐릭터 이동이 제일 고민이 많이 된다 ( 촛불에 point light 한번 붙여봤으나, 생각한 만큼 잘 나오지 않고, 의자의 노드까지 노드를 깔아서 이동할건지 그냥 노드 없이 주점의 입구 노드에서 해당 의자로 바로 갈건지 ). 의자까지의 노드에 노드로 연결하지 않으면 책상과 같은 장애물도 피해서 가야하기 때문에 생각이 길어진다.
또한 프레임 출력을 신경쓰면서 작업을 하다보니 어떻게하면 프레임을 줄일 수 있을지에 대해 생각이 많아져서 작업이 지체되는 느낌이 있지만, 오래 걸릴거 같다고 생각될시 나중으로 미루면서 작업을 할 생각이다.
캐릭터들이 길을 따라다니게 하기 위한 노드를 설치하고 A*알고리즘을 사용하여 이동을 구현했다.
노드 설치는 TerrainEditor에서 AlphaMap을 활용하여, rgb값중 b값을 검사하여, b값이 0보다 크면 노드를 설치하게끔 구현했다. 노드간의 연결은 노드의 Pos에서 일정 범위안에 노드가 있다면 해당 노드를 서로 연결하는 식으로 구현했다.
기존에 공부했던 3D에서의 A* 알고리즘에서는 더 자연스러운 길찾기 이동을 위하여, 다닐 수 있는 노드 이외 노드는 장애물 타입의 노드로 설정하여 출발지점으로부터 도착지점까지 Ray를 쏴서 Ray가 장애물에 충돌하지 않는지점까지를 검색하여 해당 노드를 꺾는 노드 기준으로 삼는 식으로 공부했지만, 현재 포트폴리오로 제작하는 게임에서 길위의 노드 이외의 지점에 전부 장애물노드를 설치했더니, 상당한 프레임 드랍이 일어나서 일단 현재는 장애물 노드는 설치하지 않았다.
2. 시간에 따른 밤, 낮 구현
게임의 몰입감을 높이기 위해 Skybox의 텍스쳐와 Environment의 조명을 조절하여, 밤낮을 약식으로 구현했다.
현재는 간단하게 Delta타임을 체크하여, 시간에 따라서 텍스처 변경과, light를 조절하고 있고, 좀 더 보완하여 light에 보간값을 적용시켜, 서서히 light가 밝아지게 하고, Skybox의 텍스쳐도 쉐이더에 secondMap를 적용시켜 더 현실성있는 하늘을 구현해볼 생각이다. 생각은 하고 있지만, 생각보다 로직이 잘 떠오르지 않아 조금 시간이 걸릴듯 하다.
3. 캐릭터의 랜덤 모델, 이동시 랜덤 StartPos 적용시킨 Pooling 기법 적용
한쪽에서만이 아닌 양쪽에서 랜덤하게 캐릭터들을 출현시키고, 여러 캐릭터들을 사용하기 위해 Pooling 기법을 적용시켜, 미리 할당한 캐릭터들을 돌리면서 출력시켰다.
DirectX3D를 공부하면서 배운것으로 원래는 엘든링을 만들어보려했지만, 엘든링에서 추출한 메쉬 모델에 본 정보가 따로 없어서, 직접 본을 리깅해야되는 상황이였고, 본인에게는 조금 무리가 있을거 같아서 태번 마스터라는 여관 경영 시뮬레이션 게임을 모작해보기로 했다. 해당 게임의 모델은 대부분 로우폴리 모델이고, 캐릭터에 들어가는 애니메이션도 믹사모로 대체할 수 있기 때문에, 부담이 적다.
작업 내용 :
1. 게임 맵 제작 ( Terrain, Water 등 )
전에 TerrainEditor를 다뤘을때 사용한 높이맵과 알파맵을 사용하여, 지형의 재질과 높이를 디자인했다.
캐릭터가 다닐수 있는 길을 만들어뒀고, 나중에 해당 길에 노드를 설치하여 캐릭터들이 A*알고리즘으로 길을 다닐 수 있게 구현할 예정이다.
아래로 파놓은 지형에는 강을 구현하기 위해 물을 설치해뒀다.
2. Tree, Stone, Grass 배치 ( Instancing 기법 활용 )
맵에 배치되는 기본적인 자연물인 나무, 돌, 풀 등을 Instancing 기법을 사용하여 배치했다.
배치는 원하는 수 만큼 모델을 인스턴싱으로 출력하여, ImGui를 통해 배치하고 transform 정보를 저장하였다. ( 배치하고 끄더라도 Load를 통해 해당 transform에 출력됨 )
이후 추가적인 배치가 필요하다면 size 수만 늘려주면 기존의 모델은 저장된 transform에 배치되고, 추가된 인스턴싱 모델만 배치할 수 있기 때문에, 맵 편집이 용이해졌다.
3. UI 틀 구상 및 제작
이번 포트폴리오는 에디팅이 메인이 되기 때문에, 평소보다 먼저 UI 작업을 진행하였다.
에디팅할때 사용하는 UI 및 게임의 상태를 보여주는 상단 UI바도 구현하였다.
싱글톤으로 UIManager를 따로 만들었고, 내부에는 맵을 에디팅할 수 있는 MapEditor, 게임의 상태 및 맵 에디터를 불러올 수 있는 버튼 등을 가지고 있는 Menu와 기본적인 Cursor를 구현하였다.
4. 게임 진행 속도 조절
게임의 속도를 조절할 수 있는 버튼을 구현했다.
카메라만을 조절하는 CAMDelta time과, 카메라 이외 캐릭터 등을 조절하는 기존의 Delta time으로 차별화시켰다.
작업 소감 :
태번 마스터를 모작하기로 결정하기 전까지도 어떤 게임을 참고로 포트폴리오를 만들지 많은 고민을 했지만, 모델링이나 애니메이션 작업에 덜 시간을 투자할 수 있는 게임을 찾고 싶었고, 그 조건에 부합하는 게임으로 태번 마스터를 결정했다.
처음에는 그냥 RPG를 제작하는게 나았나 싶었지만, 작업을 조금씩 진행하고, Base 기능들을 구현하면서 나름 잘 선정한거같다라는 생각이 들었다.
UI창으로 모델 배치 및 에디팅 기능에 많은 시간을 투자하게 될것 같고, 현재도 많은 고민을 하고 있다.
작업 예정 :
나무, 돌, 풀, 꽃 등 맵 디자인 마무리하기
길에 A* 노드 설치하여 캐릭터가 다닐수 있도록 테스트하기
맵 에디터 UI 버튼 등 마무리하고, 모델에 모델 부착할 수 있도록 기능 구현하기 ( 중요 )