2분반-시그모이드
프로젝트 개요
기술개발 과제
국문 : STT(Speech to Text) & SER(Speech Emotion Recognition)을 활용한 퍼즐 어드벤쳐 게임
영문 : A Puzzle Adventure Game With STT(Speech to Text) and SER(Speech Emotion Recognition)
과제 팀명
시그모이드
지도교수
김민호 교수님
개발기간
2024년 9월 ~ 2024년 12월 (총 4개월)
구성원 소개
서울시립대학교 컴퓨터과학부 20199200** 손*수(팀장)
서울시립대학교 컴퓨터과학부 20198900** 오*환
서울시립대학교 컴퓨터과학부 20199200** 이*훈
서울시립대학교 컴퓨터과학부 20189200** 임*석
서론
개발 과제의 개요
개발 과제 요약
◇ 음성 인식 및 감정 인식 모델 훈련 및 모델 배포
◇ 게임 내 음성 인식을 이용한 전투 시스템 구현
◇ 유니티 내 패키지들을 활용한 씬 구성 및 음성, 감정 인식을 이용한 캐릭터 기능 구현
◇ 절차적 생성 기능을 통한 인게임 맵의 유동적인 생성
◇ 절차적으로 생성된 맵에 맞는 퍼즐 시스템 구현
개발 과제의 배경
◇ AI와 게임의 결합이라는 관점에서 유저와 좀 더 상호작용을 할 수 있는 게임 개발 가능. 또한 단순 개발 보조나 편의 기능으로 게임에서 사용되던 AI기술이 아닌, 직접 기믹에 사용되고 유저와 소통할 수 있는 AI 기술을 활용한다는 점에서 머리 속으로 생각만 했던 여러 기믹들을 실현할 수 있는 기회. 거대 게임사에서 활용하고 채택하는 AI 기믹들을 학부생 때 접함으로서 최신 트랜드 기술과 개발 방향성을 직접 느낄 수 있음.
◇ 소규모 프로젝트의 특성 상 데이터 부족과 개발 환경 열악, 배포할 모델의 크기 문제 등, AI 개발자라면 현실에서 접할 수 있는 다양한 제한점 등을 극복하고 해결할 수 있는 경험을 접해볼 수 있음. 향후 모바일 기기의 높은 점유율, 음성 데이터 수집의 어려움 등의 실무적인 문제들을 효과적으로 극복할 수 있는 방향성을 제시.
◇ 유니티 내 시네머신과 Navigation 기술 등을 이용하여 유니티만의 개발 특색을 익히며 또한 게임 플레이를 관장하는 기저를 직접 개발하여 게임 시스템의 이해도를 높이고 그 흐름을 알아 볼 수 있음.
◇ 음성 인식 기술을 게임에 적용하기 위해 이를 활용한 각종 시스템을 구상했으며, 해당 기술이 게임에서 다양한 방면으로 활용될 수 있음을 보여줄 수 있다.
◇ 인게임에서 반복되지 않는 다양한 플레이 경험을 제공하고, 컨텐츠 제작 효율을 높인다. 이를 통해 플레이어의 몰입감을 높이고 게임 기획 과정을 단순화 할 수 있다.
개발 과제의 목표 및 내용
◇ 여러 논문들을 비교 분석하여 적절한 모델을 선정하고, 데이터 전처리, 모델 학습, 미세 조정 과정들을직 접 설계하고 실행. 그 후 게임 환경에서 실행 될 수 있는 모델 배포.
◇ 음성 인식 결과를 가져오고, 이를 활용하여 기획한 AI 협동 시스템, 다양한 퍼즐 등을 온전히 구현하여 게 임 진행을 다채롭고 매끄럽게 만드는 것을 목표로 함.
◇ 유니티 내 여러 기술들을 조화롭게 사용하여 원활한 게임 플레이가 이루어질 수 있도록 함. 이에 따라 적 절한 씬 구성과 오브젝트 간의 상호작용을 구현할 수 있도록 함.
◇ 효과적인 절차적 생성 알고리즘을 개발해 환경, 퍼즐, 아이템 등을 자동으로 생성함으로써 매번 새로운 플 레이 경험을 제공하고, 설정한 난이도에 따라 적절한 밸런스를 맞춰 안정적인 시스템을 만드는 것이 목표이다.
관련 기술의 현황
관련 기술의 현황 및 분석(State of art)
- 전 세계적인 기술현황
- 가. 음성 인식
- ◇ MFCC (Mel-Frequency Cepstral Coefficient)
- ● 오디오에서 추출할 수 있는 특징으로 소리의 고유한 특징을 추출하는 알고리즘. 대표적인 hand-crafted 특징 중 하나이다.
- ◇ Wav2vec 2.0
- ● facebook에서 2020년에 발표한 모델로 약 53000시간의 unlabeled 데이터로 self-supervised learning을 한 모 델이다. 이렇게 일반화되고 언어에 구애받지 않는 음향 특징을 추출할 수 있으며, 미세조정하기에 유리하다.
- ◇ Conformer
- ● CNN과 transformer 모델을 합친 모델이다. transformer의 경우 self-attention 메커니즘을 통해 전역적인 정보 를 얻는데 유리하며, CNN의 경우 지역적인 정보를 얻는데 유리하다. 음성의 경우 전역적인 정보와, 지역적인 정보 모두 중요한데 이 때문에 둘을 결합한 conformer 모델이 음성인식에서 좋은 성능을 나타내고 있다.
- ◇ 최신 기술 (기술 현황)
- ● 최신 기술의 트렌드는 사람이 만든 특징인 hand-crafted 특징을 사용하는 것이 아닌 end-to-end 모델을 사용 하는 것이다.
- ● 그래픽 카드의 발전으로 대형 모델 또한 학습 가능하며, 이에 성능이 비약적으로 향상
- ● 데이터 부족 문제를 해결하기 위해 self-supervised learning 기반 거대 사전학습 모델을 사용하는 것이 활발 하게 연구되고 있으며, 현재 탑급 conference에서 발표되는 논문 중 이런 SSL 기반 모델을 활용하는 논문이 많은 비중을 차지하고 있다.
- 나. 게임 개발
- ◇ 최신 기술 (기술 현황)
- ● 나나이트와 루멘 (UE5)
- ○ 매우 높은 폴리곤 수의 모델을 성능 저하 없이 실시간으로 렌더링하는 기술(나나이트)
- ○ 실시간 전역 조명과 반사 기능을 제공하여 보다 현실적이고 자연스러운 조명과 반사 구현(루멘)
- ● Unity Muse, Unity Sezntis
- ○ 생성형 AI와 같은 도구를 제공하여 개장 중 창작과 관련된 작업을 AI로 지원, 효율을 높이는 크리에이티브 AI 툴(Unity Muse)
- ○ 머신러닝 모델을 Unity 내에서 온 디바이스 실행 및 배포할 수 있게 해주는 툴킷(Unity Sentis)
- ● 나나이트와 루멘 (UE5)
- ● GPU Resident Drawer : 대규모 객체 렌더링 시 GPU에 데이터를 상주시키고 직접 처리함으로써 CPU의 부하를 줄이고 성능을 향상시키는 기술
- ● MARS (2020년 6월) : Mixed and Argumented Reality Studio. 혼합 현실과 증강 현실을보다 쉽고 직관적으로 개발할 수 있도록 지원하는 도구
- ◇ 유니티 주요 기술
- ● 네비게이션 시스템 (AI) : AI 캐릭터의 경로 찾기를 구현하는데 사용되며, A* 알고리즘을 기반으로 AI 캐릭터 가 자동으로 장애물을 피하고 목적지까지 이동하는 것을 쉽게 구현하는데 사용됨
- ● Cinemachine : 인게임 카메라 시스템을 관리하는 강력한 툴로, 액션 장면이나 컷씬에서 유용하며 복잡한 카메라 연출을 더 쉽게 관리할 수 있도록 도와줌
- ● 애니메이터, Behaviour Tree
- ○ FSM을 기반으로 하여 캐릭터의 애니메이션을 관리하는 시스템으로, state와 transition을 통해 다양한 애니 메이션을 구현 가능
- ○ 복잡한 애니메이터를 손쉽게 표현하기 위한 방식으로 다양한 상황에 대응할 수 있는 AI를 만드는데 매우 유용함
- ● URP & HDRP
- ○ 다양한 렌더링 파이프라인을 통해 성능과 그래픽 품질을 선택적으로 조정 가능
- ○ 낮은 사양의 플랫폼에서 효과적임(URP) 고사양 플랫폼을 대상으로 뛰어난 그래픽 품질을 제공하며, 물리 기반 렌더링(PBR) 및 고품질의 빛과 그림자 처리를 지원(HDRP)
- ● URP & HDRP
- ● Unity XR : 유니티 내에서 AR 및 VR 콘텐츠 제작을 위한 다양한 도구와 라이브러리를 제공하며 Oculus, SteamVR, ARKit, ARCore 등 다양한 AR/VR 플랫폼 지원, 공간 맵핑, 오브젝트 추적, 가상 현실 인터랙션 기능 보유
- ◇ 유니티를 이용한 메타버스 AR과 VR기술 현황
- ● U+ 가상 오피스
- ○ 2021년 11월 출시된 유니티 엔진을 활용한 3D 공간 제작 기술과 LG유플러스 개발진의 커뮤니케이션 솔루 션 역량을 합쳐 선보인 플랫폼.
- ○ U+가상오피스에는 실제 사무실과 같은 공간이 구축되며, 스몰톡, 개인 면담, 화상 회의, AI 회의록 등의 협 업 툴을 통해 실제 사무실에서의 업무 과정과 동일한 사용자 경험 제공과 생산성을 보장한다.
- ● U+ 가상 오피스
- ● 메타갤러리(대우건설), 디센트럴랜드와 마이하우스(삼성전자)
- ● Pokemon GO(AR), IKEA Place(AR), Tilt Brush(VR), Google Expeditions(VR, AR)
- ◇ 게임에 대한 AI 활용
- ● AI를 이용해 절차적 생성을 함으로써, 개발자가 매일 콘텐츠를 수작업으로 만드는 대신 자동으로 게임 콘텐 츠를 생성하는 방법으로 오픈월드 게임 제작에 매우 유용함
- ● 유니티의 네비게이션 시스템처럼 유동적인 경로 탐색과 활용형 행동, 적응형 AI를 통해 AI가 플레이어의 행동 패턴에 적응하게 함
- ● QA 측면에서는 자동 플레이 테스트를 통한 빠른 테스트와 버그 픽스 가능
- 다. 절차적 생성
- ◇ 절차적 생성의 역사
- ● 절차적 생성은 1980년대부터 게임의 저장 공간 제약 문제를 해결하기 위한 수단으로 활발히 사용되었음.
- ● 대표 사례로 1984년작 게임 《엘리트(Elite)》는 방대한 우주를 절차적 생성으로 실시간으로 생성함.
- ● 대체적으로 랜덤 알고리즘을 기반으로 한 2D 타일맵이나 미로 등 단순한 콘텐츠 생성에 사용되었음.
- ◇ 최신 기술 동향
- ● 머신러닝을 활용하며, 플레이어 행동에 반응하는 콘텐츠 생성으로 확장되었음.
- ● 3D나 XR 게임에서도 절차적 생성이 도입되었으며, 오픈월드 게임의 복잡한 지형과 생태계가 절차적 생성으로 실시간으로 생성되기도 함.
- ● 대표 사례로 2016년작 게임 《노 맨즈 스카이(No Man's Sky)》는 다양한 행성과 동식물 생태계를 절차적으로 생성함.
- ● 또한, 영화나 애니메이션, 건축 시뮬레이션 분야에서도 배경과 건물 디자인 등의 자동 생성에 활용되고 있음.
- ◇ 절차적 생성과 랜덤 생성의 차이점
- ● 절차적 생성은 사전에 정의된 규칙에 따라 무작위성을 적용하기 때문에 논리적이고 구조적으로 유의미한 콘텐츠를 생성할 수 있음.
- ● 랜덤 생성은 순수하게 무작위성에 의존하여 콘텐츠를 생성하므로 통제하기 어려우며 논리적이지 않고 구조적으로 무의미한 콘텐츠가 생성됨.
- 절차적 생성은 어느 정도의 통제 하에서 복잡한 규칙에 기반한 랜덤 콘텐츠를 만들 수 있기 때문에 목적을 갖고 의도된 디자인을 생성하는데 적합함.
- 특허조사 및 특허 전략 분석
본 프로젝트는 특허와 관련된 내용보단, 논문을 탐구하고 최신 기술을 적용하는 것에 더욱 중점을 두었다.
- 기술 로드맵
- ◇ 인공지능 모델을 훈련 후 Unity 내부에 Import 진행, 게임을 시작할 때마다 절차적 생성을 통해 맵을 랜덤하게 생성, 후 게임을 플레이를 할 수 있으며, 퍼즐과 미로, 전투를 진행할 수 있음.
시장상황에 대한 분석
- 경쟁제품 조사 비교
- 마케팅 전략 제시
개발과제의 기대효과
기술적 기대효과
◇ 게임과 AI 기술의 결합이라는 접근에서 발전 가능성이 무궁무진함.
◇ 비단 음성인식 뿐만 아니라 음성 관련 AI 기술을 사용하여 TTS나 음성 합성 기술을 사용하면, 좀 더 완성도 있 는 게임을 만들 수 있으며, 성우를 직접 고용하는 비용도 절감할 수 있음
◇ 절차적 생성 기술을 통한 예측할 수 없는 맵을 생성하여 플레이어에게 탐험의 재미를 느낄 수 있게 함
◇ 음성 인식 기술을 통해 유저에게 게임과 좀 더 가깝게 상호작용하는 느낌을 주어, 게임에 더욱 몰입할 수 있음
◇ 절차적 던전 생성 알고리즘을 사용하면 수작업으로 일일이 맵을 제작할 필요 없이 자동으로 생 성되므로, 개발 소요 시간이 크게 단축될 것으로 예상함.
경제적, 사회적 기대 및 파급효과
◇ 다양한 선택지를 사람이 직접 넣는 것이 아닌, 음성 인식 모델 하나로 압축할 수 있어 개발 리소스가 줄어 들음
◇ 절차적 생성은 반복적인 레벨 디자인이나 콘텐츠 제작에 들어가는 수작업을 크게 줄이므로 인건비와 개발 비용을 절감할 수 있음.
◇ 절차적 생성을 통한 실시간 콘텐츠 생성으로 서버 저장 공간을 아끼면 에너지 사용량을 줄일 수 있음.
◇ 온라인 게임의 경우 실시간 콘텐츠 생성을 통해 서버에 저장되는 콘텐츠의 양 을 줄이면 서버 운영 비용이 절감될 수 있음.
기술개발 일정 및 추진체계
개발 일정
구성원 및 추진체계
◇ 손지수 : 음성 및 감정 인식 모델의 훈련과 배포 ◇ 오성환 : 인게임 환경의 절차적 생성 시스템 구현 ◇ 이치훈 : 기획 보조 및 인게임의 전체적인 기능 구현 ◇ 임재석 : 주 기획 및 인게임의 전체적인 기능 구현
설계
설계사양
제품의 요구사항
◇ 게임은 기본적으로 1인칭 뷰로 실행되도록 구현한다. ‘움직이는’ 오브젝트는 플레이어와 몬스터로 두고 필요한 경우 NPC도 포함한다. 음성인식과 감정인식이 인게임에 녹아들 수 있도록 적절한 플레이어의 기능을 설정하여 구현한다. 절차적 생성 알고리즘에 따라 만들어진 방의 형태(규칙)에 따라 퍼즐 방, 전투 방으로 구 분되어 기믹을 클리어하여 진행하는 방식으로 게임 흐름이 진행될 수 있도록 한다.
◇ 이 게임의 맵은 절차적 생성 알고리즘을 통해 매번 새롭게 생성된다. 우선 랜덤한 형태의 방과 통로를 만 들어 던전의 기본 구조를 형성한다. 그 다음에 각 방의 중심점을 기준으로 들로네 삼각분할을 적용해 방과 방 사이의 통로를 생성하고, 그중 최소 스패닝 트리를 사용해 주요 경로만 남겨 던전의 기본 통로를 구성한다. 마지막으로, 필수 경로 이외의 통로들을 일정 확률로 추가하여 플레이어가 던전을 탐험하며 전략적으로 경로를 선택할 수 있도록 한다.
◇ 마이크로 입력되는 음성이 들어오면, 음성을 모델을 통해 추론하고 알맞은 text로 산출할 수 있어야한다. 모델은 음성인식에 맞게 훈련되어야한다. 모델의 크기가 유니티 내부에서 돌아갈 수 있을 정도로 최적화되어 야 하며, 마이크로 음성이 들어오면, 음성을 분석해 감정을 추론할 수 있어야한다. 또한 알맞은 데이터셋을 찾 은 후 모델 훈련을 진행해야하며 동시에 추론의 지연시간이 너무 길어지면 안된다.
◇ 음성 인식 모델
- - 다양한 환경에서의 오류율 확인을 통한 신뢰성 평가
◇ 절차적으로 생성된 맵과 시스템
- - 자동 생성된 맵의 연결성, 난이도 균형, 시각적 오류 여부 확인
◇ 게임 시스템
- - 기획 의도에 맞게 각 시스템의 오류 여부 및 정확성 검토
◇ 음성 인식과 감정 인식
- - 정해둔 답과 일치 후 로직 수행 확인
◇ 게임 플레이 내 오류 확인
- - 플레이 구간별 오류 빈도 및 치명적 오류 발생 여부
설계 사양
◇ 게임의 요구사항 중 인공지능 시스템이 담당한 부분은 크게 2가지다. 첫째는 음성인식, 둘째는 감정 인식이다. 이런 기능을 사용하기 위해선 크게 2가지 방법이 있는데 첫째는 API, 둘째는 AI 모델을 직접 훈련시켜 Unity 내부에 넣는것이다. API는 간단하고 편하다는 장점이 있지만 가격, 유지보수, 실력 향상의 측면에서 모델을 직접 넣는것이 유리하다 판단하여 후자를 프로젝트에서 진행하였다.
- ● Speech to Text (STT)
- ○ 음성인식 모델이란 음성 신호를 입력으로 받아 이에 대응하는 문자나 단어를 추론하여 텍스트로 변환하는 모델을 의미하며, 심층신경망(DNN)을 활용하여 모델을 훈련시킨다. 모델을 훈련시키기 위해 사용한 전략이자 기술은 Self-supervised learning(SSL) based Pre-trained large model(PLM)을 사용하는 것이다. 이렇게 거대한 비라벨링 데이터를 기반으로 자가주도학습을 하게되면, 음성에 대한 풍부하고 일반화 된 특징을 얻을 수 있다는 장점이 존재한다. 때문에 최신 연구 및 해외 학회의의 트렌드의 경우 이런 거대 모델을 어떻게 잘 활용하여, 자신이 필요한 분야에 맞게 적용하는지가 주된 목표이다. 우리 프로젝트 또한 이런 모델 사용의 방식을 차용하여, front-End로 SSL 모델을 사용하고, 모델 앞 뒤에 토크나이저를 추가하는 방식으로 사용하였다. SSL 모델의 경우 OpenAI에서 개발한 Whisper 모델을 차용하였으며, 이 모델의 경우 transformer의 구조를 하고 있다.
- ● Speech emotion Recognition (SER)
- ○ 감정인식 모델이란 음성 신호를 입력으로 받아 발화자가 느끼는 감정을 추론하는 모델을 의미한다. SER 모델의 경우에도 SSL based PLM을 사용하는 것이 트렌드이다. 하지만 위의 STT와 다른 점은 SSL based PLM은 본디 음성 인식을 위해 개발되고 사전 학습된 모델임으로 음성인식 모델을 훈련시킬 때 따로 downstream(요구 분야)에 미세 조정 과정이 필요없다. 하지만 SER의 경우 STT와는 요구 분야가 다르기에 SSL based PLM이 SER의 분야에 맞는 일을 하도록 fine-tuning(미세 조정)을 진행해야 한다. 따라서 모델의 총 구조는front-end: SSL based PLM, Back-end, classifier로 구성하기 되었다. 또한 이 모델의 경우 E2E(End to End)기술을 사용해 모델을 설계 하였다. E2E의 특징은 사람의 인위적인 가공을 거치지 않고 모델이 입력 데이터로부터 바로 출력까지 진행하는 모델을 의미한다. E2E방식의 특징은 입력 데이터에 front-end, back-end가 공동 최적화가 된다는 것이다. 이는 우리가 필요한 SER이란 작업에 front-end, back-end가 공동 최적화 된다는 의미이다.
- ■ SSL based PLM: front-end, 음성 특징을 추출,
- ■ Emotion feature extractor: back-end, 감정 특징을 추출
- ■ Classifier: 분류기, 특징을 종합하여 감정을 추론
- ○ SSL 모델의 경우 여러가지 task에서 우수한 성능을 보인 Wav2vec, back-end의 경우 LSTM을 사용하였다.
- ● DDP(DistributedDataParallel)
- ○ AI 모델 훈련을 위한 멀티 쓰레딩 기술이다. 모델의 훈련시간은 데이터셋 크기, 모델의 크기에 따라 상이하지만, 우리가 사용하는 SSL 기반 PLM은 매우 큰 모델이며 데이터셋도 많이 존재한다. 따라서 단일 쓰레드로 훈련을 진행하게 된다면 대략 한 번 훈련에 1주일 이상이 소요된다. 기한이 정해진 프로젝트에선 분산 프로그래밍이 필수적이다. 또한 모델과 배치 사이즈가가 커질수록 그래픽 메모리가 많이 필요하지만 End급 그래픽카드의 경우 가격이란 현실적 문제가 생긴다.때문에 GPU 여러개에 데이터를 분산시켜 메모리를 효율적으로 사용한다. 최종적으로 사용한 형태는 4개의 그래픽카드에 연산을 4개로 분할시켜 병렬적으로 진행시켰다. 이를 통해 작업에 소요되는 시간을 실제 약 5배 이상을 단축할 수 있었다. (4배의 병렬 속도 & 배치 사이즈 확대를 통해 소요하는 시간 감소)
- ● ONNX, Sentis
- ○ 우리의 최종 목표는 훈련시킨 모델이 실시간으로 게임 안에서 데이터를 받고 추론을 진행하는 것이다. 즉 On-device 환경에서 구동해야한다. 이를 위해 먼저 ONNX라는 공유 플랫폼을 사용한다. 이는 서로 다른 DNN 프레임워크 환경에서 만들어진 모델을 서로 호환되게 해주는 Docker와 비슷한 개념이다. ONNX는 내부 그래프를 정적으로 단순화시키기에, 파이썬 기반 모델의 오버헤드를 제거하게 된다. 이를 통해 모델 경량화 및 추론 속도의 이점을 얻을 수 있으며, On-device 상황에서 실시간 작동해야하는 게임에선 필수적인 기술이다.
- ○ 이렇게 변환한 ONNX를 Unity에 넣고 모델을 실행시키기 위해 Sentis를 사용하였다. Sentis는 Unity에서 지원하는 AI 추론 패키지이며, 변환시킨 ONNX를 Unity에 import한 후, input을 지정해주면 Unity 내부에서 추론을 진행하게 된다.
- ○ 또한 내부의 모델은 비동기로 진행하게 된다. 비동기 작업이란 작업이 완료될 때까지 기다리지 않고, 다른 작업을 동시에 수행하는 것을 말한다. 모델의 추론은 어느정도의 시간이 소요되는데 이를 동기적으로 수행한다면 게임 진행에 방해가 될 수 있다. 따라서 게임의 진행과 모델의 추론을 병렬적으로 진행하게 코드를 작성하였다. 하지만 비동기로 병렬 진행하게 된다면 쓰레드를 많이 차지하게 되며, 진행중인인 비동기 작업의 결과를 다른 프로세스에서 참조를 하게 되면 잘못된 값을 참조하게 되는 문제도 존재한다. 때문에 참조 부분전에 반드시 모든 프로세스의의 동기화를 진행해야하는 주의점도 존재한다.
◇ 미로의 무작위 생성을 위해 Recursive Backtracking 알고리즘을 선택했다. 미로 생성 알고리즘은 다양하게 존재했는데, 그 중 Recursive Backtracking 알고리즘을 선택한 이유는 2가지가 있다. 첫 번째, DFS를 이용한 알고리즘이기 때문에 익숙한 방식이고 구현하기 쉽다. 두 번째, DFS를 이용하였기에 모든 칸들을 방문한다는 보장이 되어 있다. 이 점이 중요한 이유는 절차적으로 생성된 맵이 단순 직사각형이 아닌 다각형이라는 데에 있다.
◇ 씬 구성을 위해 Cinemachine을, 전투 시스템을 구현하기 위해 Navigation 시스템을 사용하였다. Cinemachine을 채택한 이유는 자동으로 카메라를 제어할 수 있으며 여러 카메라 효과를 적용할 수 있기 때문이었다. 무엇보다도 가상 카메라 추가 등 씬 뷰의 확장성을 고려해서 선택한 것이 가장 큰 이유였다. 또한 Navigation 시스템을 활용하여 몬스터 AI를 편리하게 관리할 수 있게 하였으며, 몬스터 AI가 설정되어 있는범위 내에서만 효율적으로 경로 탐색을 할 수 있게 로직을 구현하였다. 마지막으로, 몬스터처럼 지속적으로 생성되고 파괴되는 오브젝트는 오버헤가 크기 때문에 최적화를 위하여 Object pooling 방식을 선택하였다.
◇ 절차적 맵 생성 디자인 본 프로젝트에서는 인게임 맵의 유동적이고 다채로운 생성을 위해 절차적 맵 생성 기법을 도입하였다. 절차적 맵 생성은 매번 다른 맵을 제공함으로써 플레이어에게 반복되지 않는 신선한 경험을 제공하고, 개발자에게는 콘텐츠 제작의 효율성을 극대화할 수 있는 장점을 제공한다. 절차적 맵 생성을 구현하기 위해 다음과 같은 알고리즘과 기술을 선택하였다.
- ● 절차적 맵 생성을 위해 다양한 알고리즘을 검토한 결과, 본 프로젝트의 요구사항에 가장 적합한 알고리즘으로 Cellular Automata, Delaunay Triangulation, Minimum Spanning Tree (MST), 그리고 A* 알고리즘을 선정하였다. 이러한 선택은 다음과 같다
- ○ Cellular Automata: 동적인 방과 벽의 배치를 통해 자연스럽고 복잡한 던전 구조를 생성할 수 있으며, 구현이 비교적 간단하여 초기 단계에서 효과적으로 사용할 수 있다.
- ○ Delaunay Triangulation: 생성된 방들 사이의 연결성을 확보하고, 효율적인 경로를 생성하는 데 유용하다. 방들 간의 최적의 연결을 보장함으로써 맵의 논리적 일관성을 유지할 수 있다.
- ○ Minimum Spanning Tree (MST): 불필요한 경로를 제거하고, 필수적인 연결만을 남겨 던전 내 방들이 고립되지 않도록 한다. 이는 맵의 탐험성을 높이고, 플레이어가 전략적으로 경로를 선택할 수 있도록 돕는다.
- ○ A* 알고리즘: 최단 경로 탐색을 통해 맵 내 이동의 효율성을 극대화하며, 플레이어의 이동패턴에 따라 맵의 동적 변화를 지원한다.
- ● 절차적 맵 생성을 위해 다양한 알고리즘을 검토한 결과, 본 프로젝트의 요구사항에 가장 적합한 알고리즘으로 Cellular Automata, Delaunay Triangulation, Minimum Spanning Tree (MST), 그리고 A* 알고리즘을 선정하였다. 이러한 선택은 다음과 같다
개념설계안
◇ 사용자의 음성을 입력값으로 하여 사전에 훈련한 모델을 통해 텍스트 및 감정을 추론한다.
◇ Singleton 패턴을 활용하여 게임을 관장하는 시스템을 설계한다. GameManger라는 전체 시스템을 관장하는 스크립트를 만든 뒤 하위에 각 기능 별 Manager 스크립트(e.g. UIManager, SkillManager)를 활용하여 시스템을 구성한다.
◇ 절차적 맵 생성 과정은 Cellular Automata → DT → MST → A* 으로 이루어진다. 먼저 Cellular Automata를 통해 절차적 생성 알고리즘으로 동굴 모양의 방들을 생성한다. 그 다음, Delaunay Triangulation으로 방들 사이의 삼각 분할된 경로를 생성한다. 최종적으로 MST를 찾고 남아있는 경로들을 직교 좌표계에 맞추기 위해 A* 알고리즘을 사용한다.
- ● 좌상단 그림: Cellular Automata 적용 전 랜덤하게 점을 고른 상태
- ● 우상단 그림: Cellular Automata의 5번째 generation까지 적용된 상태
- ● 좌하단 그림: Delaunay Triangulation을 적용한 상태
- ● 우하단 그림: MST를 찾고 나머지 엣지는 삭제한 상태
이론적 계산 및 시뮬레이션
◇ 퍼즐 시스템 유즈케이스 다이어그램
- ● Player는 퍼즐 방에 있는 두 가지 퍼즐을 해결해야 다음 방으로 이동할 수 있다.
- ● 퍼즐은 MazePuzzle과 AI Cooperate Puzzle로 나뉘며 각각 미로를 해결하거나 AI 조력자가 전해준힌트를 보고 정해진 순서대로 발판을 눌러서 퍼즐을 해결해야 다음 방으로 진행할 수 있다.
◇ 시스템의 전체 아키텍쳐 다이어그램
◇ AI system의 전반적인 아키텍처 다이어그램
- ● AI_training_system에서는 모델을 훈련시키고 가장 좋은 성능의 모델의 파라미터를 저장한다
- ● server_system에서는 모델을 돌리기 위한 서버 환경에 모델을 올리고 gpu를 활용해서 실험을 진행한다.
- ● ONNX_convert 에서는 훈련이 완료된 모델을 unity에서 사용하기 위해 변환을 진행한다.
- ● Inference는 onnx파일 기반으로 unity 내부에서 추론을 진행하고 사용자가 원하는 output을 출력한다.
상세설계 내용
가. 컴포넌트 다이어그램
◇ 맵 절차적 생성의 컴포넌트 다이어그램
- ● 이 컴포넌트도는 본 프로젝트에서 구현된 던전 생성 시스템의 주요 구성 요소와 이들 간의 상호작용을 시각적으로 나타낸다. 본 시스템은 Main, MapGenerator, DelaunayTriangulation, MinimumSpanningTree, MapDisplayer로 구성되며, 각 컴포넌트는 서로 명확히 구분된 역할을 수행한다.
- ● Main 컴포넌트는 전체 시스템의 시작점으로, 던전 생성을 초기화하고 다른 주요 컴포넌트들을 호출하여 작업을 수행한다. 우선 MapGenerator를 호출하여 던전의 기본 맵 데이터를 생성한다. 그 다음 MapGenerator는 던전의 구조를 정의하고, 각각의 방과 벽을 구성하는 알고리즘을 실행하여 던전의 기초를 형성한다. 이 과정에서 생성된 맵 데이터는 이후 작업을 위해 DelaunayTriangulation 컴포넌트로 전달되며, 이 단계에서 방의 중점 데이터를 활용하여 들로네 삼각분할을 수행한다. 들로네 삼각분할은 던전의 각 방을 연결하는 삼각형으로 이루어진 네트워크를 생성하며, 이를 통해 방 간의 연결 통로가 생성된다.
- ● 이후, MinimumSpanningTree 컴포넌트가 호출되어 들로네 삼각분할에서 생성된 삼각형 네트워크의 간선 데이터가 입력된다. MinimumSpanningTree는 최소 신장 트리(MST) 알고리즘을 활용하여 불필요한 간선을 제거하고 방 사이의 최단 경로를 효율적으로 계산한다. 이를 통해 던전 내에 고립된 방이 없는 구조가 완성된다.
- ● 최종적으로, MapDisplayer 컴포넌트는 생성된 맵과 MST 데이터를 화면에 시각적으로 렌더링한다.MapDisplayer는 방과 벽, 그리고 연결된 경로를 시각적으로 보여줌으로써 사용자에게 던전과 방을 직관적으로 표시한다. 이를 통해 사용자는 던전의 생성과정 및 결과를 확인할 수 있다.
나. 시퀀스 다이어그램
◇ 주문 발동 시스템의 시퀀스 다이어그램
- ● 플레이어에 부착된 AudioListener 컴포넌트를 통해 유저의 말을 인식한다.
- ● CheckSpell 함수를 통해 유저의 말을 인식하고, 미리 정의된 주문과 일치하는지를 확인한다.
- ● PrepareSkill 함수를 통해 정의된 주문에 맞는 스킬을 생성하고, 인식된 감정을 통해 상태효과 역시 적용한다.
- ● 마우스 좌클릭 시 UseSkill 함수가 발동되며 이를 통해 유저의 말을 통해 생성된 스킬을 사용한다.
- ● 스킬이 몬스터에게 적중하면 몬스터 내 GetHit 함수가 동작하여 몬스터에게 피해가 들어간다.
- ● 상태이상이 적용되는 감정이 스킬에 포함되어 있는 경우 감정에 따른 상태이상을 몬스터에게 적용한다.
스테이트 다이어그램
◇ 몬스터 행동 스테이트 다이어그램
- ● 몬스터는 최초 스폰 시 PATROL 상태이며, 미리 정의된 범위 내에서 자유롭게 움직일 수 있다.
- ● 플레이어와의 거리가 traceDist(float) 이상이면 TRACE 상태로, 그렇지 않으면 TRACE 상태에서 traceDist 이하면 PATROL상태로 돌아간다. TRACE 상태에서는 몬스터가 플레이어를 인식하고 플레이어를 향해 다가오게 된다.
- ● 플레이어와의 거리가 attackDist(float) 이상이면 ATTACK 상태로, 그렇지 않으면 ATTACK 상태에서 traceDist 이하면 TRACE상태로 돌아간다. ATTACK 상태에서는 몬스터가 플레이어를 향해 공격을 시작한다.
- ● PAUSED 상태는 적용되며 몬스터의 모든 상태에서 전이될 수도(UI mode일 때 ), 모든 상태로(First Person mode일 때) 전이할 수 있다. PAUSE 상태는 몬스터의 이동과 공격을 모두 멈춘다.
- ● DIE 상태는 몬스터의 모든 상태에서 전이가 가능하며 몬스터 사망 애니메이션을 재생시킨 후 몬스터 오브젝트를 Destroy하며 상태를 종료시킨다.
다. 클래스 다이어그램
◇ AI_system의 클래스 다이어그램
- ● 먼저 run class에서 실험을 진행하기 위한 전반적인 함수들을 실행하고 실험을 진행시킨다.
- ○ data_processing을 통해 dataset을 가져온다.
- ○ data_loader를 통해 가져온 dataset을 dataloader로 배치에 맞게 감싼다.
- ○ get_args를 통해 실험에 필요한 arguments들을 가져온다.
- ○ set_experiment_environment를 통해 실험에 필요한 gpu를 연결하고 DDP를 통해 4개의 gpu로 분산 계산을 설정한다. 또한 실험의 random seed를 설정하고, cuda 함수들을 이용하여 gpu 설정 값이 변하지 않도록 지정한다.
- ● data_processing의 LibriSpeech, AI_Hub의 경우 각 sr, ser 모델의 훈련에 필요한 데이터가 저장되어 있는 경로에 접근하여 데이터를 k-fold하여 train과 test로 나눈다. 그 후 레이블 지정을 하여 list로 저장한다.
- ● data_loader는 가져온 data set list를 getitem을 통해 가공, 전처리한다. 전처리를 통해 samplerate를 재 가공하고, frame별로 음성을 잘라서 반환한다. 이렇게 반환된 음성을 batch 사이즈만큼 넣고 loader로 감싸서 main에게 반환한다.
- ● arguments는 실험에 필요한 여러 변수 및 하이퍼 파라미터들을 편하게 시각화하고 유지보수와 여러 실험 진행에 용이하도록 하는 역할이다.
- ● set_experiment_environment는 서버에서 실행되는 실험이기에 gpu 설정을 하고, 다중 gpu를 사용할때 ddp를 통해 분산시키는 역할을 한다. 또한 실험의 seed를 설정하고, 같은 실험 설정에 다른 모델 결과가 나오지 않도록 쿠다로 gpu 파라미터를 고정시킨다.
- ● modeltrainer는 모델을 실제 훈련시키는 부분으로, run, train, evaluation, test_acc, save_best_model로 나뉜다.
- ○ run부분은 각 epoch마다 train과 evaluation을 호출한다.
- ○ train은 각 데이터loader를 불러와 모델에 넣고 loss.backward를 통해 손실함수를 계산, 최적화를 진행한다. 모델의 파라미터를 미세조정 및 훈련시키는 부분이다.
- ○ evaluation은 평가 단계로 test_acc와 save_best_model을 불러온다
- ○ test_acc는 모델의 파라미터를 고정시키고 test set의 input을 넣어 output을 뽑는다. 그 후 output을 정답 label과 비교하여 정답률을 구해 acc로 반환한다.
- ○ save_best_model은 반환된 acc를 통해 기존의 best_acc보다 높다면 그 epoch의 모델 파라미터를 저장하는 역할을 한다.
- ● 먼저 run class에서 실험을 진행하기 위한 전반적인 함수들을 실행하고 실험을 진행시킨다.
◇ 미로 생성 시스템의 클래스 다이어그램
- ● 기본적으로 MazeManager를 통해 미로 생성이 시작된다. ConvertToMap 클래스를 통해 절차적으로 생성된 방에 대한 데이터를 담은 Room 자료구조 리스트를 2차원 배열로 변환한 뒤, MazeManager에서 이를 토대로 MazeCell 자료구조 리스트를 생성한다. MazeGenerate 클래스로 MazeCell 리스트를 보내서 미로를 생성한다. 그 결과 미로의 정보를 담은 MazeCell 자료구조 리스트가 완성되고, MazeTileMapGenerate 클래스로 해당 미로 데이터를 보내서 유니티 씬에 미로를 생성한다.
- ● ConvertToMap 클래스는 Room 자료구조 리스트를 2차원 배열로 변환하는 함수를 가지고 있다. 그리고 2차원 배열을 로그 창에 출력해주는 함수를 갖고 있다.
- ● MazeManager 클래스는 절차적으로 생성된 방에 대한 데이터를 담은 Room 자료구조 리스트를 받아서 2차원 배열과 MazeCell 리스트로 변환해준 뒤, 미로를 생성하는 절차를 시작한다. InitializeMap() 함수에서 먼저 자료구조를 초기화하고 FindDoors() 함수에서 출입구 칸을 찾아 배열을 생성한다. 이후 ConvertToMap 클래스로 보내서 Room 리스트를 2차원 배열로 변환하고 MazeGenerate 클래스로 보내서 미로를 생성한 뒤, MazeTileMapGenerate 클래스로 보내서 미로를 게임 씬에 생성한다.
- ● MazeGenerate 클래스는 자료구조 상에서 미로를 생성한다. GenerateMaze() 함수는 DFS를 이용한 Recursive Backtracking 미로 생성 알고리즘을 사용해서 자료구조에 포함된 모든 칸들을 방문하면서 미로를 생성한다. ShuffleArray() 함수와 Swap() 함수는 배열의 순서를 섞고, 배열의 순서를 바꿔주는 helper 함수들이다. returnOppositeDirection() 함수는 특정 방향을 넣으면 반대 방향을 출력해주는 helper 함수다.
- ● MazeTileMapGenerate 클래스는 게임 씬에 미로를 실제로 생성한다. Awake() 함수는 변수를 초기화하는 함수다. GenerateMap() 함수에서 미로를 게임 씬에 생성하게 된다. 이 때,ChoosePrefabForCell() 함수를 통해 특정 칸에 어떤 프리팹을 생성할 지, 어떤 방향으로 회전해야 하는지 정한다. returnOppositeDirection() 함수는 MazeGenerate 클래스의 함수와 동일한 역할을 한다.
- ● MazeCell 클래스는 각 칸마다 미로를 생성할 때 필요한 정보들을 담은 자료구조다. 어떤 방향으로 통로가 존재하는지 여부, 벽이 아예 없는지 여부, 칸의 타입이 무엇인지, 유니티 게임 상에서 어떤 좌표에 위치해 있는지 등에 대한 변수들이 있다. setPathFlagTrue() 함수는 특정 방향에 통로가 존재한다고 저장하는 함수다. getPathFlag() 함수는 특정 방향에 통로가 존재하는지 bool값을 반환하는 함수다. getRandomFlagIndex() 함수는 벽이 존재하는 방향 중 무작위로 한 방향을 선택해서 반환하는 함수다.
◇ 절차적 맵 생성의 클래스 다이어그램
- ● 본 시스템은 Main, MapGenerator, MapDisplayer, DelaunayTriangulation, MinimumSpanningTree와 같은 주요 구성 요소로 이루어지며, Data Structures 패키지 내부에 세부적인 자료 구조를 정의하는 클래스들이 정의되어 있다.
- ● Main 클래스는 전체 시스템의 진입점 역할을 하며, 다른 주요 클래스들을 제어하고 호출한다. 이 클래스는 사용자 입력을 처리하여 맵 생성, 렌더링, 들로네 삼각분할, 최소 신장 트리 계산 등을 단계적으로 수행한다. Main 클래스는 MapGenerator를 통해 초기 맵 데이터를 생성하며, MapDisplayer를 활용하여 생성된 맵의 정보를 화면에 출력한다. 던전의 방 연결 및 최적화된 경로 계산을 위해 DelaunayTriangulation과 MinimumSpanningTree를 호출하여 삼각분할 및 최단 경로 알고리즘을 실행한다.
- ● MapGenerator 클래스는 던전의 구조를 정의하고, 세포 자동자(Cellular Automata) 알고리즘을 기반으로 맵을 절차적으로 생성한다. 이 클래스는 맵에 방과 벽을 배치하며, BFS 알고리즘을 활용하여 각 방의 고유 식별 번호와 정보를 할당한다. 생성된 맵은 Map 클래스의 2차원 배열로 저장되며, 각각의 셀은 Cell 또는 RoomCell 객체로 구성된다.
- ● MapDisplayer 클래스는 맵을 화면에 시각적으로 표시하는 역할을 담당한다. 맵 데이터와 방 정보를 받아 각 셀을 렌더링하며, 색상과 텍스트를 통해 방의 중심, 크기, 벽 등을 명확히 구분하여 시각적 이해를 돕는다. 이를 통해 사용자에게 실감나는 던전을 직관적으로 표현한다.
- ● DelaunayTriangulation 클래스는 방의 중점(RoomCenter)을 기준으로 들로네 삼각분할 알고리즘을 수행한다. 방들 사이의 연결을 나타내는 삼각형과 간선이 생성되며, 이를 통해 최소 신장 트리를 계산하기 위한 기초를 마련한다. 주요 자료 구조로 Vertex, Edge, Triangle 객체를 사용한다.
- ● MinimumSpanningTree 클래스는 들로네 삼각분할로 생성된 간선 데이터를 기반으로 최소 신장 트리(MST)를 생성한다. 이 클래스는 Prim의 알고리즘을 사용하여 방들 간의 최적 경로를 계산하고, 결과적으로 고립된 방이 없는 구조의 맵을 생성한다.
- ● Data Structures 패키지에는 시스템의 핵심 자료 구조를 정의하는 다양한 클래스들이 존재한다. Cell 클래스는 맵의 기본 단위를 나타내며, RoomCell은 이를 확장하여 방의 세부 정보 또한 담고 있다. Room 클래스는 방의 속성과 정보를 관리하며, 방의 중심 좌표와 크기를 계산한다. Vertex,Edge, Triangle 클래스는 들로네 삼각분할과 최소 신장 트리 계산에서 사용되는 핵심 자료 구조이다. Circle 클래스는 삼각형의 외접원을 계산하는 데 사용되며, 삼각형 내에 외부의 점이 포함되는지를 판단한다.
결과 및 평가
완료 작품의 소개
프로토타입 사진 혹은 작동 장면
가. 프로토타입 작동장면
관련사업비 내역서
내용
완료작품의 평가
내용
향후계획
내용
특허 출원 내용
내용