Project C
실시간 산업 데이터 기반 게이미피케이션
  • PC
  • UnityEngine
  • MariaDB

담당 업무

세부 내용

에디터 확장 기능

주행 경로 에디터

원하는 경로로 차량이 이동할 수 있도록 자율 주행 경로를 제작할 수 있는 경로 제작 기능을 구현하였습니다.
경로 에디터 윈도우에 UIToolkit을 사용하여 노드의 추가 및 삭제 버튼, 선택된 노드의 정보를 표시하였으며,
씬 뷰에서 Gizmos와 Handles를 사용하여 각 노드의 위치와 각도를 수정할 수 있도록 하였습니다.

주행 경로 베이커

NavMeshAsset을 생성하는 대신 별도의 ScriptableObject를 통해 NavMesh 폴리곤 좌표와 커스텀한 주행 경로를 저장하는 베이킹 기능을 구현하였습니다.
기존의 Navigation 윈도우를 사용하는 대신 각 씬마다 설정이 필요한 정보만 노출하는 전용 에디터 윈도우를 구현하였습니다.

실시간 파츠 교체 시스템

주행 도중 정지 없이 차량의 부품을 변경하고, 주행 성능에 반영되는 시스템을 구현하였습니다.
바퀴가 변경되었을 때, MeshRenderer의 Bound 크기를 통해 WheelCollider의 반지름을 조절합니다.
또한 차체의 무게나 길이가 변경되었을 때, 무게 중심을 변경하고 예상 회전 반경을 계산하여(관련자료), 주행 경로를 수정하였습니다.

차량 AI 및 자율 주행 시스템

Unity AI Navigation의 NavMesh Baking을 통해 생성되는 폴리곤의 좌표를 활용하여, NavMeshAgent없이 WheelCollider를 통해 이동하는 자율 주행 시스템을 구현하였습니다.
별도의 베이킹 프로세스를 구현하여, NavMesh와 관련된 애셋을 생성-사용하지 않고, 노드 정보가 저장된 ScriptableObject를 생성하여 사용하였습니다.
차량 AI는 전략 패턴과 커맨드 패턴을 응용하여 주행 시 발생하는 각종 사건(충돌, 우회 등)과 환경의 변화에 따라 다른 주행 방식을 적용할 수 있도록 구현하였습니다.

산업 데이터 기반 게이미피케이션 로직

UnityWebRequest와 UniTask를 사용, 백엔드에서 제공한 API를 호출하여 실제 공장 작업자의 조립 데이터를 송수신하였습니다.
데이터 송수신 로직을 독립적으로 분리하고 Behaviour Tree의 구조를 차용하여,
수신된 데이터를 통해 피버타임 진입, 게임 내 스테이지나 씬 변경 등의 필요를 판단하여 각 상황에 맞는 API를 호출하거나 게임을 진행시키는 자동화된 플레이를 구현하였습니다.

Troubleshooting

수정 불가능한 씬 환경에서 NavMesh 데이터를 통한 물리 주행 구현

문제 상황

개발 도중 플레이어의 이동 방식이 NavMeshAgent에서, 물리가 적용된 WheelCollider로 변경되었습니다.
하지만 기존 스테이지는 NavMesh 규격으로 이미 제작되어 수정이 불가능한 상황이었으며,
단순히 NavMeshAgent를 사용할 경우 물리적 상호작용(충돌, 서스펜션 등)을 구현하는 데 한계가 있었습니다.
따라서 기존 NavMesh 데이터를 활용하면서도, 물리 엔진 기반의 주행이 가능한 시스템을 새롭게 구축해야 했습니다.

해결 과정

1. NavMesh 데이터 추출

Unity AI Navigation Package의 Baking 함수를 추적하여, 베이킹 시 생성되는 NavMesh 폴리곤의 좌표 데이터를 추출하는 기능을 구현했습니다.
추출된 데이터를 별도의 ScriptableObject로 저장하여, NavMeshAsset 없이 런타임에 경로 데이터를 참조할 수 있도록 구조화했습니다.

2. 주행 경로 수정

NavMesh가 지원하는 경로 따라가기 함수 사용 시 폴리곤의 꼭짓점 부분을 이용하여 이동하기 때문에 시각적으로 부자연스러운 문제가 발생하였습니다.
이를 해결하기 위해 삼각형의 무게중심을 선형 보간한 경로를 사용하였으나, 삼각형 형태에 따라 불필요한 움직임이 발생했습니다.
최종적으로는 인접한 폴리곤이 맞닿는 모서리의 중점을 연결하여 경로를 수정하는 로직을 적용하여, 차량이 도로의 중앙을 따라 부드럽게 이동할 수 있도록 구현했습니다.

3. 장애물 회피 로직 구현

NavMeshAgent의 회피 기능을 대체하기 위해, Raycast를 사용하여 전방의 오브젝트를 감지하고 정지/후진하는 로직을 추가했습니다.
박스나 캡슐 콜라이더를 가진 고정 장애물 감지 시, 콜라이더의 좌표와 회전값을 분석하여 우회 경로를 생성합니다.
현재 속도를 기반으로 예상 도착 시간을 계산하고, 지연이 심할 경우 경로를 재탐색하도록 설계했습니다.

결과

기존 스테이지 리소스를 수정하지 않고도 WheelCollider 기반의 물리 주행 시스템을 성공적으로 도입했습니다.
자체적인 경로 보정 알고리즘을 적용하여 자연스러운 차량 주행감을 구현할 수 있었습니다.