"2분반-시그모이드"의 두 판 사이의 차이

cdc wiki
이동: 둘러보기, 검색
(개념설계안)
(향후계획)
 
(같은 사용자의 중간 판 17개는 보이지 않습니다)
282번째 줄: 282번째 줄:
 
===개념설계안===
 
===개념설계안===
 
◇ 사용자의 음성을 입력값으로 하여 사전에 훈련한 모델을 통해 텍스트 및 감정을 추론한다.
 
◇ 사용자의 음성을 입력값으로 하여 사전에 훈련한 모델을 통해 텍스트 및 감정을 추론한다.
 +
 
[[파일:sigmoid5.png]]
 
[[파일:sigmoid5.png]]
 +
 
◇ Singleton 패턴을 활용하여 게임을 관장하는 시스템을 설계한다. GameManger라는 전체 시스템을 관장하는 스크립트를 만든 뒤 하위에 각 기능 별 Manager 스크립트(e.g. UIManager, SkillManager)를 활용하여 시스템을 구성한다.
 
◇ Singleton 패턴을 활용하여 게임을 관장하는 시스템을 설계한다. GameManger라는 전체 시스템을 관장하는 스크립트를 만든 뒤 하위에 각 기능 별 Manager 스크립트(e.g. UIManager, SkillManager)를 활용하여 시스템을 구성한다.
  
293번째 줄: 295번째 줄:
  
 
===이론적 계산 및 시뮬레이션===
 
===이론적 계산 및 시뮬레이션===
내용
+
◇ 퍼즐 시스템 유즈케이스 다이어그램
 +
 
 +
[[파일:sigmoid7.png]]
 +
::● Player는 퍼즐 방에 있는 두 가지 퍼즐을 해결해야 다음 방으로 이동할 수 있다.
 +
::● 퍼즐은 MazePuzzle과 AI Cooperate Puzzle로 나뉘며 각각 미로를 해결하거나 AI 조력자가 전해준힌트를 보고 정해진 순서대로 발판을 눌러서 퍼즐을 해결해야 다음 방으로 진행할 수 있다.
 +
 
 +
◇ 시스템의 전체 아키텍쳐 다이어그램
 +
 
 +
[[파일:s8.png]]
 +
 
 +
◇ AI system의 전반적인 아키텍처 다이어그램
 +
 
 +
[[파일:s9.png]]
 +
::● AI_training_system에서는 모델을 훈련시키고 가장 좋은 성능의 모델의 파라미터를 저장한다
 +
::● server_system에서는 모델을 돌리기 위한 서버 환경에 모델을 올리고 gpu를 활용해서 실험을 진행한다.
 +
::● ONNX_convert 에서는 훈련이 완료된 모델을 unity에서 사용하기 위해 변환을 진행한다.
 +
::● Inference는 onnx파일 기반으로 unity 내부에서 추론을 진행하고 사용자가 원하는 output을 출력한다.
  
 
===상세설계 내용===
 
===상세설계 내용===
내용
+
'''가. 컴포넌트 다이어그램'''
 +
 
 +
◇ 맵 절차적 생성의 컴포넌트 다이어그램
 +
 
 +
[[파일:s10.png]]
 +
 
 +
::● 이 컴포넌트도는 본 프로젝트에서 구현된 던전 생성 시스템의 주요 구성 요소와 이들 간의 상호작용을 시각적으로 나타낸다. 본 시스템은 Main, MapGenerator, DelaunayTriangulation, MinimumSpanningTree, MapDisplayer로 구성되며, 각 컴포넌트는 서로 명확히 구분된 역할을 수행한다.
 +
::● Main 컴포넌트는 전체 시스템의 시작점으로, 던전 생성을 초기화하고 다른 주요 컴포넌트들을 호출하여 작업을 수행한다. 우선 MapGenerator를 호출하여 던전의 기본 맵 데이터를 생성한다. 그 다음 MapGenerator는 던전의 구조를 정의하고, 각각의 방과 벽을 구성하는 알고리즘을 실행하여 던전의 기초를 형성한다. 이 과정에서 생성된 맵 데이터는 이후 작업을 위해 DelaunayTriangulation 컴포넌트로 전달되며, 이 단계에서 방의 중점 데이터를 활용하여 들로네 삼각분할을 수행한다. 들로네 삼각분할은 던전의 각 방을 연결하는 삼각형으로 이루어진 네트워크를 생성하며, 이를 통해 방 간의 연결 통로가 생성된다.
 +
::● 이후, MinimumSpanningTree 컴포넌트가 호출되어 들로네 삼각분할에서 생성된 삼각형 네트워크의 간선 데이터가 입력된다. MinimumSpanningTree는 최소 신장 트리(MST) 알고리즘을 활용하여 불필요한 간선을 제거하고 방 사이의 최단 경로를 효율적으로 계산한다. 이를 통해 던전 내에 고립된 방이 없는 구조가 완성된다.
 +
::● 최종적으로, MapDisplayer 컴포넌트는 생성된 맵과 MST 데이터를 화면에 시각적으로 렌더링한다.MapDisplayer는 방과 벽, 그리고 연결된 경로를 시각적으로 보여줌으로써 사용자에게 던전과 방을 직관적으로 표시한다. 이를 통해 사용자는 던전의 생성과정 및 결과를 확인할 수 있다.
 +
 
 +
 
 +
'''나. 시퀀스 다이어그램'''
 +
 
 +
◇ 주문 발동 시스템의 시퀀스 다이어그램
 +
 
 +
[[파일:s11.png]]
 +
 
 +
::● 플레이어에 부착된 AudioListener 컴포넌트를 통해 유저의 말을 인식한다.
 +
::● CheckSpell 함수를 통해 유저의 말을 인식하고, 미리 정의된 주문과 일치하는지를 확인한다.
 +
::● PrepareSkill 함수를 통해 정의된 주문에 맞는 스킬을 생성하고, 인식된 감정을 통해 상태효과 역시 적용한다.
 +
::● 마우스 좌클릭 시 UseSkill 함수가 발동되며 이를 통해 유저의 말을 통해 생성된 스킬을 사용한다.
 +
::● 스킬이 몬스터에게 적중하면 몬스터 내 GetHit 함수가 동작하여 몬스터에게 피해가 들어간다.
 +
::● 상태이상이 적용되는 감정이 스킬에 포함되어 있는 경우 감정에 따른 상태이상을 몬스터에게 적용한다.
 +
 
 +
 
 +
'''스테이트 다이어그램'''
 +
 
 +
◇ 몬스터 행동 스테이트 다이어그램
 +
 
 +
 
 +
[[파일:s12.png]]
 +
::● 몬스터는 최초 스폰 시 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의 클래스 다이어그램
 +
 
 +
[[파일:s13.png]]
 +
 
 +
::● 먼저 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의 모델 파라미터를 저장하는 역할을 한다.
 +
 
 +
◇ 미로 생성 시스템의 클래스 다이어그램
 +
 
 +
[[파일:s14.png]]
 +
 
 +
::● 기본적으로 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() 함수는 벽이 존재하는 방향 중 무작위로 한 방향을 선택해서 반환하는 함수다.
 +
 
 +
◇ 절차적 맵 생성의 클래스 다이어그램
 +
 
 +
[[파일:s15.png]]
 +
 
 +
::● 본 시스템은 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 클래스는 삼각형의 외접원을 계산하는 데 사용되며, 삼각형 내에 외부의 점이 포함되는지를 판단한다.
  
 
==결과 및 평가==
 
==결과 및 평가==
 
===완료 작품의 소개===
 
===완료 작품의 소개===
 
====프로토타입 사진 혹은 작동 장면====
 
====프로토타입 사진 혹은 작동 장면====
내용
+
'''가. 프로토타입 작동장면'''
====포스터====
+
 
내용
+
[[파일:s16.png]]
 +
 
 +
'''나. 설치'''
 +
 
 +
[[파일:s17.png]]
 +
 
 +
◇ 압축파일을 풀면 위와 같은 구성을 확인할 수 있다.
 +
 
 +
◇ Capstone.exe를 실행시키면 게임이 실행된다.
 +
 
 +
◇ Output : 빌드 시 자동으로 생성되는 파일들이며 각 파일들은 아래와 같다.
 +
:- Capstone_BurstDebugInformation_DoNotShip : 개발 및 디버깅 단계에서 필요한 폴더이며, 실행 시에는 필요하지 않음.
 +
:- Capstone_Data : 게임 및 애플리케이션의 주요 데이터 파일들이 저장된 폴더이며 씬 데이터, 텍스처, 모델, 스크립트 번들, 설정 파일, 리소스 등 Unity 프로젝트의 실행에 필요한 모든 리소스를 담고 있음.
 +
:- MonoBleedingEdge : Unity의 Mono 런타임 환경을 제공함. Mono는 C# 코드 실행을 위해 필요한 런타임이며, 최신 버전의 Mono 라이브러리와 함께 제공됨.
 +
:- Capstone.exe : 실행파일
 +
:- UnityCrashHandler64.exe 게임이 실행 중 충돌하거나 오류가 발생했을 때 이를 감지하고 로그를 생성하는 Unity의 크래시 핸들러.
 +
:- UnityPlayer.dll : Unity의 런타임 라이브러리로, 게임의 실행을 위한 렌더링, 입력 처리, 물리 엔진 등의 내용이 담겨있음
 +
 
 +
'''다. 실행'''
 +
 
 +
[[파일:s18.png]]
 +
 
 +
 
 +
1. 최초 입장 시 스폰 방(0번 방)에서 플레이어가 스폰된다. WASD로 이동을, 스페이스바로 점프를 할 수 있다. 최적화를 위해 현재 방과, 연결된 다음 방만 렌더링을 하고 이동을 하면서 점진적으로 렌더링을 하는 방식을 채택했다.
 +
 
 +
 
 +
[[파일:s19.png]]
 +
 
 +
 
 +
2. 방 내의 통로에서 다른 방으로 이동할 수 있다. 통로는 벽에 횃불이 설치되어 있어 횃불이 설치된 벽을 따라가면 다음 방으로 들어갈 수 있다.
 +
 
 +
 
 +
[[파일:s20.png]]
 +
 
 +
 
 +
3. 통로를 따라 이동하면 미로 방(퍼즐 방) 혹은 전투 방 중 하나의 기믹을 해결해야한다. 위 사진은 미로 방으로서 미로를 탈출하여 다음 방으로 이동할 수 있다.
 +
 
 +
 
 +
[[파일:s21.png]]
 +
 
 +
 
 +
4. 위 사진은 전투 방으로서, 입장 시 제한 시간이 활성화 되고 통로가 막히게 된다. 제한 시간 내에 일정한 수의 몬스터를 퇴치해야한다. 미션을 성공하면 막힌 통로가 다시 열리게 되어 다음 방으로 이동할 수 있다.
 +
 
 +
 
 +
[[파일:s22.png]]
 +
 
 +
 
 +
5. 마우스 좌클릭으로 기본공격을 할 수 있다. 또한 좌측 Ctrl키를 누른 채로 말을 하면 주문을 인식할 수 있으며 만약 올바른 주문이 인식될 경우 스킬이 활성화되어 스킬을 사용할 수 있다. 또한, 말에서 인식한 감정에 따라 몬스터에게, 혹은 플레이어에게 상태효과가 추가로 적용된다.
 +
 
 +
 
 +
[[파일:s23.png]]
 +
 
 +
 
 +
6. 제한 시간 내에 모든 몬스터를 퇴치하면 위에서 언급했듯이 통로가 열리게 되어 다음 방으로 이동할 수 있다. 하지만 제한 시간 내에 미션을 성공하지 못하면 플레이어에게 불꽃이 활성화되어 몇 초 뒤에 죽게 된다. 재시작 버튼을 누르면 처음부터 다시 시작할 수 있다.
  
 
===관련사업비 내역서===
 
===관련사업비 내역서===
내용
+
 
 +
[[파일:s25.png]]
  
 
===완료작품의 평가===
 
===완료작품의 평가===
내용
+
 
 +
[[파일:s24.png]]
  
 
===향후계획===
 
===향후계획===
내용
 
  
===특허 출원 내용===
+
'''가. 어려웠던 내용들'''
내용
+
 
 +
◇ 음성인식 구현에서 가장 어려웠던 점은 ONNX파일로 변환하고 이를 Unity에 적용하는 점이었다. 우선 유니티 AI 모델 추론 기능이 나온지 약 1년 정도 밖에 지나지 않았으며, 당연히 관련 문서는 거의 존재하지 않았다. ONNX 추출 과정에서 함수가 손상되고, Unity에서 인식을 못하는 등 문제점이 많았다. 이를 해결하기 위해 모델 레이어 단위로 output tensor 차원을 출력하여 저장하고, 하나하나 계산하면서 깨진 차원을 찾아낸 후, 그 부분을 제거하거나 고쳤다. 그 결과 unity에서 성공적으로 적용할 수 있었다.
 +
 
 +
:[[파일:s26.png]]
 +
::● 또한 두 번째 문제는 너무 큰 모델 입력으로 인한 Unity 내부 할당 쓰레드 초과 문제였다. 우선적으로 모델의 추론은 약간의 시간이 소요되기 때문에 게임의 흐름을 끊지 않기 위해 비동기적으로 진행하게 하였다. 비동기 방식이 실시간 게임에선 필수적이지만 이런 병렬 프로세스 작업은 쓰레드를 많이 차지하게 되고 결국 할당 쓰레드 초과 문제에 직면하게 하였다. 먼저 쓰레드 할당 현황을 로그로 뽑아 확인 후, 모델의 오디오 입력이 5초를 초과하게 되면 이런 문제가 발생한다는 것을 파악했다.
 +
::● 문제 파악 후 이를 해결하기 위해선 1가지 필수 조건이 있다는 것을 파악하였다.
 +
:::○ 음성 인식 모델
 +
::::■ 입력을 5초로 제한하게 되면 그 이후에 녹음되는 음성은 인식하지 못하는 문제가 발생한다. 때문에 오디오 길이는 그대로 유지하면서 문제를 해결하는 것이 필수적이다. 이를 해결하기 위해 모델 컷팅을 진행했다. 음성 인식 모델의 경우 쓸모 없는 모델 파라미터를 제거하였고 레이어를 제거하여여 모델의 크기를 줄였다.
 +
:::○ 감정 인식 모델
 +
::::■ 감정 인식 모델의 경우 발화자의 감정만 파악하면 되기 때문에 30초의 오디오가 모두 필요하지 않다. 따라서 모델의 크기를 그대로 유지한 채, 오디오의 입력을 30초에서 랜덤으로 5초를 추출하도록 설정하여 쓰레드 부족 문제를 해결하였다.
 +
 
 +
◇ 절차적으로 생성된 맵에 맞춰 무작위로 생성되는 퍼즐을 기획해야 했다. 두 가지 퍼즐을 기획했는데, 하나는 미로 퍼즐이고 다른 하나는 AI 조력자 협동 퍼즐이다. 미로의 경우 무작위 생성 알고리즘이 존재했기에 이를 이용했는데, 미로가 생성될 맵의 모양이 직사각형이 아닌 다각형의 모양이여서 자칫하면 미로가 생성되지 않는 상황이 발생할 수 있었다. 그래서 미로의 벽과 통로의 생성 방법에 대해 많은 고민을 해야 했다. AI 조력자 협동 퍼즐의 경우 무작위 위치에 특정 색을 지닌 발판 버튼들이 배치되어 있으며 AI 조력자가 알려준 힌트를 보고 버튼들을 색깔 순서에 맞게 눌러야 다음 방으로 가는 문이 열리는 방식이었다. 절차적 생성 알고리즘이 완성되기 전에 베이스 코드를 만들었지만, 코드를 합치고 순서에 맞게 눌러야 하는 기능을 추가하기 시
 +
작하면서 각종 버그가 발생해서 시간이 지연되었다. 따라서 미로 생성 알고리즘의 완성을 우선시하였고 최종적으로 AI 조력자 협동 퍼즐을 완성하지 못했다.
 +
 
 +
◇ 음성, 감정 인식과 플레이어의 기능을 연결하는 것이 어려웠었다. 텍스트로 만든 더미 데이터로 테스트를 진행했을 때는 동작이 잘 되었지만, 음성, 감정의 리턴값을 활용하여 코드를 수정하니 많은 버그가 발생하였다. 이 버그들을 해결하는 데에 많은 시간이 소요됐었지만 최종적으로는 오류가 없는 원하는 결과를 이끌어 낼 수 있었다. 또한, 맵이 동적으로 생성되기 때문에 그에 따라 방에 맞게 navigation을 구축하는 것이 어려웠었다. 이 부분은 하나의 방 내의 navigation 시스템 전체를 관장하는 빈 오브젝트를 만들어 그 오브젝트 하위에 방 내에 있는 모든 navigation 관련 컴포넌트를 추가하여 한 번에 관리하는 방식으로 해결하였다. 이 과정에서 방에 진입했을 때 해당 방의 정보를 수집하고 이를 활용해 전투 시스템 등을 개선할 수 있는 기능들을 구현할 방안을 도출할 수 있었다.
 +
 
 +
◇ 절차적 맵 생성 시 렌더링 과부하 문제
 +
절차적 맵 생성을 구현하는 과정에서 가장 큰 어려움 중 하나는 셀의 수가 과도하게 많아져 렌더링 성능에 과부하가 걸린 점이었다. 초기에는 모든 셀을 한 번에 렌더링하도록 설계하였으나, 방의 수가 증가할수록 유니티 엔진에서 처리해야 하는 오브젝트의 수가 급격히 늘어나 게임의 프레임 속도가 저하되는 현상이 발생하였다. 이는 플레이어의 몰입감을 저해하고, 실시간 게임 플레이에 불리한 영향을 미쳤다. 이를 해결하기 위해 인접 리스트(adjacency list) 를 도입하여 렌더링 최적화를 시도하였다. 구체적으로, 현재 플레이어가 위치한 방과 그 주변에 인접한 방들만을 동적으로 렌더링하고, 그 외의 방들은 비활성화하는 방식으로 접근하였다. 이러한 방법을 통해 렌더링해야 하는 셀의 수를 현저히 줄일 수 있었으며, 게임의 전반적인 성능을 향상시킬 수 있었다. 또한, 인접 리스트를 활용함으로써 방 간의 연결성을 효율적으로 관리할 수 있었고, 플레이어의 이동에 따라 필요한 방만을 선택적으로 로드하여 메모리 사용량을 최적화할 수 있었다.
 +
 
 +
 
 +
'''나. 차후 구현할 내용'''
 +
 
 +
◇ 다양한 분야의 도전: 이번 프로젝트에서는 ‘음성’이란 데이터만 다루는 모델을 설계하고 배포하였다. 하지만 AI는 음성 뿐만 아니라 Computer Vision, LLM 등 다양한 분야가 있다. 이런 타 분야의 논문을 읽고 직접 설계해보는 시간을 가진다면 배움의 시야가 한 층 넓어질 것이며, 향후 ‘음성 AI’ 연구를 진행할 때 타 분야의 기술들을 이용하여 설계할 수 있는 기회도 접해 볼 수 있을 것 같다.
 +
::● 추가 모델 적용
 +
::::○ 한 학기라는 시간 제한으로 인해 모델 2개 훈련 후 배포로 목표를 잡았지만 향후 구현하게 된다면 더 다양한 모델을 적용할 수 있을 것이라 생각한다. 가장 먼저 구현하고 싶은 부분은 NPC 및 몬스터들의 인게임 보이스를 Deepfake audio or TTS를 통해 직접 생성하는 것이다. 특히 성우를 고용하기 힘든 소규모 프로젝트의 경우 이런 인공지능 모델을 통해 목소리를 생성한다면 보다 완성도 있고 실감나는 게임을 완성할 수 있을 것이며, 게임 유저에게 긍정적인 경험을 줄 것이라 예상하고 있다.
 +
::● On-device 상황에서의 원활한 구동
 +
::::○ 이번 프로젝트에서 가장 예상 못한 복병은 모델과 오디오 크기로 인한 쓰레드 초과 문제였다. 연구자의 입장에선 단순히 성능 좋은 모델이 가장 좋은 결과물 일 것이다. 하지만 이런 모델을 실생활 On-device에 적용하고 사용하는 다수의 기업과 사람들은 조금의 성능은 포기하더라도 모델의 경량화 및 추론 속도에 더욱 집중할 것이다. 우리의 프로젝트도 이런 특성을 떠올려 단순 성능 위주의 모델을 채택한 것이 아니라, 약간의 성능을 포기하고 모델 경량화에 집중한 부분도 있다. 향후 Pruning(가지치기), Quantization(양자화), Knowledgedistillation(지식 증류)등의 모델 경량화 기법들을 추가로 적용하여 실시간 게임에서 더욱 빠르고 가볍게 반응하도록 모델을 재설계 예정이다.
 +
 
 +
◇ 미처 구현하지 못한 AI 조력자 협동 퍼즐을 완성할 것이고, 미로 퍼즐에 버튼을 추가하여 모든 버튼을 눌러야 다음 문이 열리도록 만들 것이다. 또한 세부 설계 단계에서 게임에 넣지 않기로 결정했던 LLM을 이용한 AI 조력자 시스템을 추가할 것이다.
 +
 
 +
◇ 최초 계획에서는 외부 시트를 활용하여 인게임 데이터를 관리하려고 했으나 데모 레벨에서는 많은 데이터가 필요하지 않아 이를 기각하였다. 하지만 아이템의 추가나 몬스터의 확장 등을 고려했을 때 데이터 관리 소스는 반드시 필요하다. 또한 게임 시스템에서 미흡한 점이 많았는데 전체적인 게임성의 향상과 사운드, 시각효과 등의 리소스들의 확장을 우선적으로 구현할 예정이다.
 +
 
 +
◇ 본 프로젝트의 차후 개발 단계에서는 2D 던전 생성에서 벗어나 3D 던전 제작을 구현할 계획이다. 3D 던전은 플레이어에게 더욱 몰입감 있는 탐험 경험을 제공하며, 게임의 복잡성과 다양성을 크게 향상시킬 수 있다. 이를 달성하기 위해 다음과 같은 기술적 접근과 연구가 필요하다.
 +
::● 사면체를 이용한 들로네 사각화 (Delaunay Tetrahedralization)
 +
::::○ 3D 공간에서의 절차적 맵 생성을 위해서는 2D에서 사용했던 들로네 삼각분할(DelaunayTriangulation)을 3D로 확장한 들로네 사면체화(Delaunay Tetrahedralization) 기법이 필수적이다. 이 기법은 3차원 공간 내에서 점들의 집합을 사면체로 분할하여, 각 사면체가 최대한 균일하고 균형 잡힌 구조를 가지도록 한다. 이를 통해 다음과 같은 장점을 얻을 수 있다.
 +
:::::■ 공간의 균등한 분할: 3D 공간을 균등하게 분할하여 던전의 각 구역이 자연스럽고 논리적인 배치를 가지도록 한다.
 +
:::::■ 연결성 보장: 사면체화 과정을 통해 던전 내 모든 방들이 최소 하나의 경로로 연결되도록 보장할 수 있다.
 +
:::::■ 확장성: 새로운 방이나 구역이 추가될 때 기존의 구조를 크게 변경하지 않고도 손쉽게 확장할 수 있다.
 +
::● Z축을 포함한 A* 알고리즘 탐구
 +
::::○ 3D 던전에서의 경로 탐색은 2D 던전과는 달리 Z축을 포함한 *3차원 A 알고리즘**의 적용이 필요하다. 이를 위해 다음과 같은 연구와 구현이 요구된다.
 +
:::::■ 3D 공간에서의 휴리스틱 설계: A* 알고리즘의 효율성을 높이기 위해 3D 공간에 적합한 휴리스틱 함수를 설계해야 한다. 이는 플레이어의 현재 위치와 목표 지점 간의 직선 거리를 기반으로 할 수 있으며, 장애물이나 지형의 복잡성을 고려하여 조정될 수 있다.
 +
:::::■ 다층 구조의 경로 탐색: 3D 던전은 다층 구조를 가질 수 있으므로, 각 층 간의 이동 (예: 계단, 엘리베이터 등)을 고려한 경로 탐색 로직이 필요하다. 이는 경로의 최적화와 탐험의 다양성을 높이는 데 기여할 것이다.
 +
:::::■ 실시간 동적 경로 업데이트: 플레이어의 이동이나 환경 변화에 따라 실시간으로 경로를 재계산하여, 몬스터 AI나 NPC의 행동을 더욱 자연스럽고 유연하게 만들 수 있다.

2024년 12월 19일 (목) 20:52 기준 최신판

프로젝트 개요

기술개발 과제

국문 : 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)
● 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)
● Unity XR : 유니티 내에서 AR 및 VR 콘텐츠 제작을 위한 다양한 도구와 라이브러리를 제공하며 Oculus, SteamVR, ARKit, ARCore 등 다양한 AR/VR 플랫폼 지원, 공간 맵핑, 오브젝트 추적, 가상 현실 인터랙션 기능 보유
◇ 유니티를 이용한 메타버스 AR과 VR기술 현황
● U+ 가상 오피스
○ 2021년 11월 출시된 유니티 엔진을 활용한 3D 공간 제작 기술과 LG유플러스 개발진의 커뮤니케이션 솔루 션 역량을 합쳐 선보인 플랫폼.
○ U+가상오피스에는 실제 사무실과 같은 공간이 구축되며, 스몰톡, 개인 면담, 화상 회의, AI 회의록 등의 협 업 툴을 통해 실제 사무실에서의 업무 과정과 동일한 사용자 경험 제공과 생산성을 보장한다.
● 메타갤러리(대우건설), 디센트럴랜드와 마이하우스(삼성전자)
● 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 진행, 게임을 시작할 때마다 절차적 생성을 통해 맵을 랜덤하게 생성, 후 게임을 플레이를 할 수 있으며, 퍼즐과 미로, 전투를 진행할 수 있음.

시장상황에 대한 분석

  • 경쟁제품 조사 비교

스크린샷 2024-12-19 015211.png

  • 마케팅 전략 제시

Sigmoid2.png

개발과제의 기대효과

기술적 기대효과

◇ 게임과 AI 기술의 결합이라는 접근에서 발전 가능성이 무궁무진함.

◇ 비단 음성인식 뿐만 아니라 음성 관련 AI 기술을 사용하여 TTS나 음성 합성 기술을 사용하면, 좀 더 완성도 있 는 게임을 만들 수 있으며, 성우를 직접 고용하는 비용도 절감할 수 있음

◇ 절차적 생성 기술을 통한 예측할 수 없는 맵을 생성하여 플레이어에게 탐험의 재미를 느낄 수 있게 함

◇ 음성 인식 기술을 통해 유저에게 게임과 좀 더 가깝게 상호작용하는 느낌을 주어, 게임에 더욱 몰입할 수 있음

◇ 절차적 던전 생성 알고리즘을 사용하면 수작업으로 일일이 맵을 제작할 필요 없이 자동으로 생 성되므로, 개발 소요 시간이 크게 단축될 것으로 예상함.

경제적, 사회적 기대 및 파급효과

◇ 다양한 선택지를 사람이 직접 넣는 것이 아닌, 음성 인식 모델 하나로 압축할 수 있어 개발 리소스가 줄어 들음

◇ 절차적 생성은 반복적인 레벨 디자인이나 콘텐츠 제작에 들어가는 수작업을 크게 줄이므로 인건비와 개발 비용을 절감할 수 있음.

◇ 절차적 생성을 통한 실시간 콘텐츠 생성으로 서버 저장 공간을 아끼면 에너지 사용량을 줄일 수 있음.

◇ 온라인 게임의 경우 실시간 콘텐츠 생성을 통해 서버에 저장되는 콘텐츠의 양 을 줄이면 서버 운영 비용이 절감될 수 있음.

기술개발 일정 및 추진체계

개발 일정

Sigmoid3.png

구성원 및 추진체계

◇ 손지수 : 음성 및 감정 인식 모델의 훈련과 배포
◇ 오성환 : 인게임 환경의 절차적 생성 시스템 구현
◇ 이치훈 : 기획 보조 및 인게임의 전체적인 기능 구현
◇ 임재석 : 주 기획 및 인게임의 전체적인 기능 구현

설계

설계사양

제품의 요구사항

◇ 게임은 기본적으로 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가 공동 최적화 된다는 의미이다.
Sigmoid4.png
위의 그림은 설계한 모델의 흐름을 보여준다.
■ 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* 알고리즘: 최단 경로 탐색을 통해 맵 내 이동의 효율성을 극대화하며, 플레이어의 이동패턴에 따라 맵의 동적 변화를 지원한다.

개념설계안

◇ 사용자의 음성을 입력값으로 하여 사전에 훈련한 모델을 통해 텍스트 및 감정을 추론한다.

Sigmoid5.png

◇ 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를 찾고 나머지 엣지는 삭제한 상태

Sigmoid6.png

이론적 계산 및 시뮬레이션

◇ 퍼즐 시스템 유즈케이스 다이어그램

Sigmoid7.png

● Player는 퍼즐 방에 있는 두 가지 퍼즐을 해결해야 다음 방으로 이동할 수 있다.
● 퍼즐은 MazePuzzle과 AI Cooperate Puzzle로 나뉘며 각각 미로를 해결하거나 AI 조력자가 전해준힌트를 보고 정해진 순서대로 발판을 눌러서 퍼즐을 해결해야 다음 방으로 진행할 수 있다.

◇ 시스템의 전체 아키텍쳐 다이어그램

S8.png

◇ AI system의 전반적인 아키텍처 다이어그램

S9.png

● AI_training_system에서는 모델을 훈련시키고 가장 좋은 성능의 모델의 파라미터를 저장한다
● server_system에서는 모델을 돌리기 위한 서버 환경에 모델을 올리고 gpu를 활용해서 실험을 진행한다.
● ONNX_convert 에서는 훈련이 완료된 모델을 unity에서 사용하기 위해 변환을 진행한다.
● Inference는 onnx파일 기반으로 unity 내부에서 추론을 진행하고 사용자가 원하는 output을 출력한다.

상세설계 내용

가. 컴포넌트 다이어그램

◇ 맵 절차적 생성의 컴포넌트 다이어그램

S10.png

● 이 컴포넌트도는 본 프로젝트에서 구현된 던전 생성 시스템의 주요 구성 요소와 이들 간의 상호작용을 시각적으로 나타낸다. 본 시스템은 Main, MapGenerator, DelaunayTriangulation, MinimumSpanningTree, MapDisplayer로 구성되며, 각 컴포넌트는 서로 명확히 구분된 역할을 수행한다.
● Main 컴포넌트는 전체 시스템의 시작점으로, 던전 생성을 초기화하고 다른 주요 컴포넌트들을 호출하여 작업을 수행한다. 우선 MapGenerator를 호출하여 던전의 기본 맵 데이터를 생성한다. 그 다음 MapGenerator는 던전의 구조를 정의하고, 각각의 방과 벽을 구성하는 알고리즘을 실행하여 던전의 기초를 형성한다. 이 과정에서 생성된 맵 데이터는 이후 작업을 위해 DelaunayTriangulation 컴포넌트로 전달되며, 이 단계에서 방의 중점 데이터를 활용하여 들로네 삼각분할을 수행한다. 들로네 삼각분할은 던전의 각 방을 연결하는 삼각형으로 이루어진 네트워크를 생성하며, 이를 통해 방 간의 연결 통로가 생성된다.
● 이후, MinimumSpanningTree 컴포넌트가 호출되어 들로네 삼각분할에서 생성된 삼각형 네트워크의 간선 데이터가 입력된다. MinimumSpanningTree는 최소 신장 트리(MST) 알고리즘을 활용하여 불필요한 간선을 제거하고 방 사이의 최단 경로를 효율적으로 계산한다. 이를 통해 던전 내에 고립된 방이 없는 구조가 완성된다.
● 최종적으로, MapDisplayer 컴포넌트는 생성된 맵과 MST 데이터를 화면에 시각적으로 렌더링한다.MapDisplayer는 방과 벽, 그리고 연결된 경로를 시각적으로 보여줌으로써 사용자에게 던전과 방을 직관적으로 표시한다. 이를 통해 사용자는 던전의 생성과정 및 결과를 확인할 수 있다.


나. 시퀀스 다이어그램

◇ 주문 발동 시스템의 시퀀스 다이어그램

S11.png

● 플레이어에 부착된 AudioListener 컴포넌트를 통해 유저의 말을 인식한다.
● CheckSpell 함수를 통해 유저의 말을 인식하고, 미리 정의된 주문과 일치하는지를 확인한다.
● PrepareSkill 함수를 통해 정의된 주문에 맞는 스킬을 생성하고, 인식된 감정을 통해 상태효과 역시 적용한다.
● 마우스 좌클릭 시 UseSkill 함수가 발동되며 이를 통해 유저의 말을 통해 생성된 스킬을 사용한다.
● 스킬이 몬스터에게 적중하면 몬스터 내 GetHit 함수가 동작하여 몬스터에게 피해가 들어간다.
● 상태이상이 적용되는 감정이 스킬에 포함되어 있는 경우 감정에 따른 상태이상을 몬스터에게 적용한다.


스테이트 다이어그램

◇ 몬스터 행동 스테이트 다이어그램


S12.png

● 몬스터는 최초 스폰 시 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의 클래스 다이어그램

S13.png

● 먼저 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의 모델 파라미터를 저장하는 역할을 한다.

◇ 미로 생성 시스템의 클래스 다이어그램

S14.png

● 기본적으로 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() 함수는 벽이 존재하는 방향 중 무작위로 한 방향을 선택해서 반환하는 함수다.

◇ 절차적 맵 생성의 클래스 다이어그램

S15.png

● 본 시스템은 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 클래스는 삼각형의 외접원을 계산하는 데 사용되며, 삼각형 내에 외부의 점이 포함되는지를 판단한다.

결과 및 평가

완료 작품의 소개

프로토타입 사진 혹은 작동 장면

가. 프로토타입 작동장면

S16.png

나. 설치

S17.png

◇ 압축파일을 풀면 위와 같은 구성을 확인할 수 있다.

◇ Capstone.exe를 실행시키면 게임이 실행된다.

◇ Output : 빌드 시 자동으로 생성되는 파일들이며 각 파일들은 아래와 같다.

- Capstone_BurstDebugInformation_DoNotShip : 개발 및 디버깅 단계에서 필요한 폴더이며, 실행 시에는 필요하지 않음.
- Capstone_Data : 게임 및 애플리케이션의 주요 데이터 파일들이 저장된 폴더이며 씬 데이터, 텍스처, 모델, 스크립트 번들, 설정 파일, 리소스 등 Unity 프로젝트의 실행에 필요한 모든 리소스를 담고 있음.
- MonoBleedingEdge : Unity의 Mono 런타임 환경을 제공함. Mono는 C# 코드 실행을 위해 필요한 런타임이며, 최신 버전의 Mono 라이브러리와 함께 제공됨.
- Capstone.exe : 실행파일
- UnityCrashHandler64.exe 게임이 실행 중 충돌하거나 오류가 발생했을 때 이를 감지하고 로그를 생성하는 Unity의 크래시 핸들러.
- UnityPlayer.dll : Unity의 런타임 라이브러리로, 게임의 실행을 위한 렌더링, 입력 처리, 물리 엔진 등의 내용이 담겨있음

다. 실행

S18.png


1. 최초 입장 시 스폰 방(0번 방)에서 플레이어가 스폰된다. WASD로 이동을, 스페이스바로 점프를 할 수 있다. 최적화를 위해 현재 방과, 연결된 다음 방만 렌더링을 하고 이동을 하면서 점진적으로 렌더링을 하는 방식을 채택했다.


S19.png


2. 방 내의 통로에서 다른 방으로 이동할 수 있다. 통로는 벽에 횃불이 설치되어 있어 횃불이 설치된 벽을 따라가면 다음 방으로 들어갈 수 있다.


S20.png


3. 통로를 따라 이동하면 미로 방(퍼즐 방) 혹은 전투 방 중 하나의 기믹을 해결해야한다. 위 사진은 미로 방으로서 미로를 탈출하여 다음 방으로 이동할 수 있다.


S21.png


4. 위 사진은 전투 방으로서, 입장 시 제한 시간이 활성화 되고 통로가 막히게 된다. 제한 시간 내에 일정한 수의 몬스터를 퇴치해야한다. 미션을 성공하면 막힌 통로가 다시 열리게 되어 다음 방으로 이동할 수 있다.


S22.png


5. 마우스 좌클릭으로 기본공격을 할 수 있다. 또한 좌측 Ctrl키를 누른 채로 말을 하면 주문을 인식할 수 있으며 만약 올바른 주문이 인식될 경우 스킬이 활성화되어 스킬을 사용할 수 있다. 또한, 말에서 인식한 감정에 따라 몬스터에게, 혹은 플레이어에게 상태효과가 추가로 적용된다.


S23.png


6. 제한 시간 내에 모든 몬스터를 퇴치하면 위에서 언급했듯이 통로가 열리게 되어 다음 방으로 이동할 수 있다. 하지만 제한 시간 내에 미션을 성공하지 못하면 플레이어에게 불꽃이 활성화되어 몇 초 뒤에 죽게 된다. 재시작 버튼을 누르면 처음부터 다시 시작할 수 있다.

관련사업비 내역서

S25.png

완료작품의 평가

S24.png

향후계획

가. 어려웠던 내용들

◇ 음성인식 구현에서 가장 어려웠던 점은 ONNX파일로 변환하고 이를 Unity에 적용하는 점이었다. 우선 유니티 AI 모델 추론 기능이 나온지 약 1년 정도 밖에 지나지 않았으며, 당연히 관련 문서는 거의 존재하지 않았다. ONNX 추출 과정에서 함수가 손상되고, Unity에서 인식을 못하는 등 문제점이 많았다. 이를 해결하기 위해 모델 레이어 단위로 output tensor 차원을 출력하여 저장하고, 하나하나 계산하면서 깨진 차원을 찾아낸 후, 그 부분을 제거하거나 고쳤다. 그 결과 unity에서 성공적으로 적용할 수 있었다.

S26.png
● 또한 두 번째 문제는 너무 큰 모델 입력으로 인한 Unity 내부 할당 쓰레드 초과 문제였다. 우선적으로 모델의 추론은 약간의 시간이 소요되기 때문에 게임의 흐름을 끊지 않기 위해 비동기적으로 진행하게 하였다. 비동기 방식이 실시간 게임에선 필수적이지만 이런 병렬 프로세스 작업은 쓰레드를 많이 차지하게 되고 결국 할당 쓰레드 초과 문제에 직면하게 하였다. 먼저 쓰레드 할당 현황을 로그로 뽑아 확인 후, 모델의 오디오 입력이 5초를 초과하게 되면 이런 문제가 발생한다는 것을 파악했다.
● 문제 파악 후 이를 해결하기 위해선 1가지 필수 조건이 있다는 것을 파악하였다.
○ 음성 인식 모델
■ 입력을 5초로 제한하게 되면 그 이후에 녹음되는 음성은 인식하지 못하는 문제가 발생한다. 때문에 오디오 길이는 그대로 유지하면서 문제를 해결하는 것이 필수적이다. 이를 해결하기 위해 모델 컷팅을 진행했다. 음성 인식 모델의 경우 쓸모 없는 모델 파라미터를 제거하였고 레이어를 제거하여여 모델의 크기를 줄였다.
○ 감정 인식 모델
■ 감정 인식 모델의 경우 발화자의 감정만 파악하면 되기 때문에 30초의 오디오가 모두 필요하지 않다. 따라서 모델의 크기를 그대로 유지한 채, 오디오의 입력을 30초에서 랜덤으로 5초를 추출하도록 설정하여 쓰레드 부족 문제를 해결하였다.

◇ 절차적으로 생성된 맵에 맞춰 무작위로 생성되는 퍼즐을 기획해야 했다. 두 가지 퍼즐을 기획했는데, 하나는 미로 퍼즐이고 다른 하나는 AI 조력자 협동 퍼즐이다. 미로의 경우 무작위 생성 알고리즘이 존재했기에 이를 이용했는데, 미로가 생성될 맵의 모양이 직사각형이 아닌 다각형의 모양이여서 자칫하면 미로가 생성되지 않는 상황이 발생할 수 있었다. 그래서 미로의 벽과 통로의 생성 방법에 대해 많은 고민을 해야 했다. AI 조력자 협동 퍼즐의 경우 무작위 위치에 특정 색을 지닌 발판 버튼들이 배치되어 있으며 AI 조력자가 알려준 힌트를 보고 버튼들을 색깔 순서에 맞게 눌러야 다음 방으로 가는 문이 열리는 방식이었다. 절차적 생성 알고리즘이 완성되기 전에 베이스 코드를 만들었지만, 코드를 합치고 순서에 맞게 눌러야 하는 기능을 추가하기 시 작하면서 각종 버그가 발생해서 시간이 지연되었다. 따라서 미로 생성 알고리즘의 완성을 우선시하였고 최종적으로 AI 조력자 협동 퍼즐을 완성하지 못했다.

◇ 음성, 감정 인식과 플레이어의 기능을 연결하는 것이 어려웠었다. 텍스트로 만든 더미 데이터로 테스트를 진행했을 때는 동작이 잘 되었지만, 음성, 감정의 리턴값을 활용하여 코드를 수정하니 많은 버그가 발생하였다. 이 버그들을 해결하는 데에 많은 시간이 소요됐었지만 최종적으로는 오류가 없는 원하는 결과를 이끌어 낼 수 있었다. 또한, 맵이 동적으로 생성되기 때문에 그에 따라 방에 맞게 navigation을 구축하는 것이 어려웠었다. 이 부분은 하나의 방 내의 navigation 시스템 전체를 관장하는 빈 오브젝트를 만들어 그 오브젝트 하위에 방 내에 있는 모든 navigation 관련 컴포넌트를 추가하여 한 번에 관리하는 방식으로 해결하였다. 이 과정에서 방에 진입했을 때 해당 방의 정보를 수집하고 이를 활용해 전투 시스템 등을 개선할 수 있는 기능들을 구현할 방안을 도출할 수 있었다.

◇ 절차적 맵 생성 시 렌더링 과부하 문제 절차적 맵 생성을 구현하는 과정에서 가장 큰 어려움 중 하나는 셀의 수가 과도하게 많아져 렌더링 성능에 과부하가 걸린 점이었다. 초기에는 모든 셀을 한 번에 렌더링하도록 설계하였으나, 방의 수가 증가할수록 유니티 엔진에서 처리해야 하는 오브젝트의 수가 급격히 늘어나 게임의 프레임 속도가 저하되는 현상이 발생하였다. 이는 플레이어의 몰입감을 저해하고, 실시간 게임 플레이에 불리한 영향을 미쳤다. 이를 해결하기 위해 인접 리스트(adjacency list) 를 도입하여 렌더링 최적화를 시도하였다. 구체적으로, 현재 플레이어가 위치한 방과 그 주변에 인접한 방들만을 동적으로 렌더링하고, 그 외의 방들은 비활성화하는 방식으로 접근하였다. 이러한 방법을 통해 렌더링해야 하는 셀의 수를 현저히 줄일 수 있었으며, 게임의 전반적인 성능을 향상시킬 수 있었다. 또한, 인접 리스트를 활용함으로써 방 간의 연결성을 효율적으로 관리할 수 있었고, 플레이어의 이동에 따라 필요한 방만을 선택적으로 로드하여 메모리 사용량을 최적화할 수 있었다.


나. 차후 구현할 내용

◇ 다양한 분야의 도전: 이번 프로젝트에서는 ‘음성’이란 데이터만 다루는 모델을 설계하고 배포하였다. 하지만 AI는 음성 뿐만 아니라 Computer Vision, LLM 등 다양한 분야가 있다. 이런 타 분야의 논문을 읽고 직접 설계해보는 시간을 가진다면 배움의 시야가 한 층 넓어질 것이며, 향후 ‘음성 AI’ 연구를 진행할 때 타 분야의 기술들을 이용하여 설계할 수 있는 기회도 접해 볼 수 있을 것 같다.

● 추가 모델 적용
○ 한 학기라는 시간 제한으로 인해 모델 2개 훈련 후 배포로 목표를 잡았지만 향후 구현하게 된다면 더 다양한 모델을 적용할 수 있을 것이라 생각한다. 가장 먼저 구현하고 싶은 부분은 NPC 및 몬스터들의 인게임 보이스를 Deepfake audio or TTS를 통해 직접 생성하는 것이다. 특히 성우를 고용하기 힘든 소규모 프로젝트의 경우 이런 인공지능 모델을 통해 목소리를 생성한다면 보다 완성도 있고 실감나는 게임을 완성할 수 있을 것이며, 게임 유저에게 긍정적인 경험을 줄 것이라 예상하고 있다.
● On-device 상황에서의 원활한 구동
○ 이번 프로젝트에서 가장 예상 못한 복병은 모델과 오디오 크기로 인한 쓰레드 초과 문제였다. 연구자의 입장에선 단순히 성능 좋은 모델이 가장 좋은 결과물 일 것이다. 하지만 이런 모델을 실생활 On-device에 적용하고 사용하는 다수의 기업과 사람들은 조금의 성능은 포기하더라도 모델의 경량화 및 추론 속도에 더욱 집중할 것이다. 우리의 프로젝트도 이런 특성을 떠올려 단순 성능 위주의 모델을 채택한 것이 아니라, 약간의 성능을 포기하고 모델 경량화에 집중한 부분도 있다. 향후 Pruning(가지치기), Quantization(양자화), Knowledgedistillation(지식 증류)등의 모델 경량화 기법들을 추가로 적용하여 실시간 게임에서 더욱 빠르고 가볍게 반응하도록 모델을 재설계 예정이다.

◇ 미처 구현하지 못한 AI 조력자 협동 퍼즐을 완성할 것이고, 미로 퍼즐에 버튼을 추가하여 모든 버튼을 눌러야 다음 문이 열리도록 만들 것이다. 또한 세부 설계 단계에서 게임에 넣지 않기로 결정했던 LLM을 이용한 AI 조력자 시스템을 추가할 것이다.

◇ 최초 계획에서는 외부 시트를 활용하여 인게임 데이터를 관리하려고 했으나 데모 레벨에서는 많은 데이터가 필요하지 않아 이를 기각하였다. 하지만 아이템의 추가나 몬스터의 확장 등을 고려했을 때 데이터 관리 소스는 반드시 필요하다. 또한 게임 시스템에서 미흡한 점이 많았는데 전체적인 게임성의 향상과 사운드, 시각효과 등의 리소스들의 확장을 우선적으로 구현할 예정이다.

◇ 본 프로젝트의 차후 개발 단계에서는 2D 던전 생성에서 벗어나 3D 던전 제작을 구현할 계획이다. 3D 던전은 플레이어에게 더욱 몰입감 있는 탐험 경험을 제공하며, 게임의 복잡성과 다양성을 크게 향상시킬 수 있다. 이를 달성하기 위해 다음과 같은 기술적 접근과 연구가 필요하다.

● 사면체를 이용한 들로네 사각화 (Delaunay Tetrahedralization)
○ 3D 공간에서의 절차적 맵 생성을 위해서는 2D에서 사용했던 들로네 삼각분할(DelaunayTriangulation)을 3D로 확장한 들로네 사면체화(Delaunay Tetrahedralization) 기법이 필수적이다. 이 기법은 3차원 공간 내에서 점들의 집합을 사면체로 분할하여, 각 사면체가 최대한 균일하고 균형 잡힌 구조를 가지도록 한다. 이를 통해 다음과 같은 장점을 얻을 수 있다.
■ 공간의 균등한 분할: 3D 공간을 균등하게 분할하여 던전의 각 구역이 자연스럽고 논리적인 배치를 가지도록 한다.
■ 연결성 보장: 사면체화 과정을 통해 던전 내 모든 방들이 최소 하나의 경로로 연결되도록 보장할 수 있다.
■ 확장성: 새로운 방이나 구역이 추가될 때 기존의 구조를 크게 변경하지 않고도 손쉽게 확장할 수 있다.
● Z축을 포함한 A* 알고리즘 탐구
○ 3D 던전에서의 경로 탐색은 2D 던전과는 달리 Z축을 포함한 *3차원 A 알고리즘**의 적용이 필요하다. 이를 위해 다음과 같은 연구와 구현이 요구된다.
■ 3D 공간에서의 휴리스틱 설계: A* 알고리즘의 효율성을 높이기 위해 3D 공간에 적합한 휴리스틱 함수를 설계해야 한다. 이는 플레이어의 현재 위치와 목표 지점 간의 직선 거리를 기반으로 할 수 있으며, 장애물이나 지형의 복잡성을 고려하여 조정될 수 있다.
■ 다층 구조의 경로 탐색: 3D 던전은 다층 구조를 가질 수 있으므로, 각 층 간의 이동 (예: 계단, 엘리베이터 등)을 고려한 경로 탐색 로직이 필요하다. 이는 경로의 최적화와 탐험의 다양성을 높이는 데 기여할 것이다.
■ 실시간 동적 경로 업데이트: 플레이어의 이동이나 환경 변화에 따라 실시간으로 경로를 재계산하여, 몬스터 AI나 NPC의 행동을 더욱 자연스럽고 유연하게 만들 수 있다.