멈추지 않고 끈질기게

[포트폴리오] 언리얼 팀 프로젝트 회고(최종) 본문

포트폴리오

[포트폴리오] 언리얼 팀 프로젝트 회고(최종)

sam0308 2024. 7. 6. 16:52

※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.

 

※ 해당 포스팅은 청년취업사관학교 교육과정 중에 진행한 언리얼 팀 프로젝트에 관한 회고록입니다. 

 

※ 해당 포스팅은 Unreal 5.4.1 버전을 기준으로 작성되었습니다.

 

 

 

1. 프로젝트 소개

 최종 프로젝트는 생성형 AI를 활용한 농촌 힐링 게임입니다. 초기 기획에서는 스타듀밸리를 레퍼런스로 NPC에 AI를 접목한 프로젝트를 구상하였으나, 스타듀밸리는 콘텐츠가 워낙 다양한 게임이라 개발 기간 안에 전부 담기에는 어렵다고 판단하여 NPC와의 소통 위주의 게임으로 새로 구성하였습니다. 5인 팀으로 진행하였으며, 저는 웹서버와의 http 통신 및 NPC 행동 패턴, STT(Speech-To-Text)를 담당했습니다.

 

 NPC와의 대화는 STT, TTS를 모두 사용하여 음성을 통해 대화를 주고받을 수 있도록 구현되어 있습니다. 대화의 진행 로직은 다음과 같습니다.

  1. AudioCaptureCompoent를 통해 마이크 입력을 wav 파일로 저장
  2. 웹서버로 전송한 뒤, 서버에서 텍스트로 변환(OpenAI 사의 Whisper 모델 사용)
  3. 언리얼에서 텍스트를 전송받은 뒤 대화 UI에서 출력
  4. 서버에서 2의 텍스트를 Chat GPT에 전달
  5. Chat GPT 답변(텍스트)을 언리얼에 전달하고 대화 UI에서 출력
  6. 5의 텍스트를 Chat GPT의 기본 TTS로 1차 출력한 뒤, OpenVoice 모델을 통해 음성 변환
  7. 완료되는대로 언리얼에 전송하여 NPC 답변(음성) 출력

 ChatGPT의 답변을 요청하는 부분에서는 해당 NPC의 페르소나 및 대화 예시를 프롬프트에 담아 함께 전달하여, 해당 NPC의 성격에 맞는 답변을 하도록 구현했습니다. 또한 게임 종료 전까지 대화 내역을 저장해두고, 대화 시 해당 내용을 반영하여 이전 대화에서 이어지도록 되어있습니다.해당 과정에서 fastapi 웹서버를 사용했으며 여기서 STT 부분을 제외한 웹서버의 생성형 AI 관련 로직은 담당 팀원분이 담당하셨고, 저는 STT 및 언리얼 엔진과 통신하기 위한 라우터 부분을 담당했습니다.

 

 또한 식물도 목소리로 키울 수 있도록 구현했습니다. 식물을 심고 나서 마이크로 직접 말을 걸면, ChatGPT를 통해 긍정 부정 여부를 판단하여 긍정적인 말이라면 성장하고, 부정적인 말이라면 시들도록 했습니다. 식물에 말을 거는 경우, 프롬프트 자체에 자신이 식물임을 인지하게 하고 긍정 부정을 판단하여 정수 형태로 반환하도록 구현했습니다. 그리고 NPC 대화 및 식물 성장 모두 마이크가 없는 환경에서도 플레이할 수 있도록 채팅으로도 가능하게 했습니다.

 

사진 1. (좌) 긍정적인 말을 건 경우 / (우) 부정적인 말을 건 경우

 

 해당 프로젝트의 깃허브 주소 및 플레이 영상 주소입니다.

https://github.com/VicSheep/victroyShip

 

GitHub - VicSheep/victroyShip: 새싹최종

새싹최종. Contribute to VicSheep/victroyShip development by creating an account on GitHub.

github.com

https://www.youtube.com/watch?v=RVIuSBr6IQk

 

 

 

2. 잘된 점

 우선 http 통신을 통해 언리얼과 fastapi 웹서버를 연동하는 부분은 성공적으로 완성되었습니다. 특히 초기에는 구현을 우선시하여 파일 경로를 전달하는 방식으로 만들어서 한 PC에서 서버와 언리얼 엔진을 모두 돌려야 했지만, 이후에 wav 파일 자체를 전달하는 방식으로 변경하여 서버와 언리얼 클라이언트를 분리하는 데 성공했습니다. AI쪽도 메모리를 많이 사용하다보니, 서버와 클라를 분리한 후에 테스트해보니 한 PC에서 둘 다 돌릴 때보다 통신 속도가 비교가 안되게 빨라졌습니다. 막상 메타버스 엑스포 전시때는 네트워크 환경이 다소 불안정하여 테스트할 때보다 속도가 떨어졌지만, 반대로 생각하면 개선하지 않았으면 전시 때는 너무 느렸을거라 다행인 듯 합니다.

 

사진 2. (좌)언리얼에서 wav 파일을 전송하는 코드 / (우)fastapi 서버에서 wav 파일을 받는 코드

 

 또한 게임 내 시간 흐름과 이에 따른 NPC 행동 패턴 구현이 어느정도 만족스럽게 구현되었습니다. 시간 흐름의 경우 게임모드에서 타이머를 통해 구현하고, 시간 혹은 날짜 변경 시 갱신이 필요한 객체들은 인터페이스를 상속받게 하여 게임모드에서 변경되는 타이밍에 일괄적으로 갱신 처리를 진행할 수 있도록 했습니다. 또한 NPC 행동 패턴은 BehaviorTree로 구현하였는데, 2차 프로젝트 때보다 다수의 Key와 커스텀 Task, Decorator를 사용하였습니다. 물론 이에 따라 이슈도 많이 발생했지만, 이를 해결하는 과정에서 Sequence와 Selector의 정확한 정의를 확인하고 활용할 수 있게 되었습니다.

 

 

 

 

3. 아쉬운 점

 AI 활용 파트인 NPC의 대화를 좀 더 고도화시키는 데 집중하여 좀 더 자연스러운 대화가 가능하도록 한 것은 좋았으나, 전반적으로 콘텐츠 자체는 다소 부족한 모양이 되었습니다. 크게 콘텐츠라고 할 수 있는 부분이 식물 성장NPC와의 대화 정도이다 보니, 특히 전시에는 다소 맞지 않는 프로젝트임을 체감했습니다. 메타버스 엑스포에서 전시할 때 NPC와 다양한 대화를 시도해 본 분들은 획일되지 않은 AI의 답변에 신기해하고 가셨지만, 콘텐츠마다 조금씩 맛보고 가시는 분들한테는 다소 흥미를 끌지 못한 느낌이었습니다. 개발 기간이 좀 더 있었더라면 목축같은 콘텐츠도 추가하면서 여기에 AI를 어떻게 접목시킬지 고민해 보았을텐데 아쉽습니다.

 

사진 4. 농사와 NPC 대화 외 콘텐츠가 다소 부족

 

 

4. 소감

 이번 프로젝트는 교육 과정의 최종 프로젝트임을 제외하더라도 의미가 깊은 프로젝트였습니다. 우선 지금까지의 팀 프로젝트가 2인~3인이었던 것에 비해 5인으로 규모가 컸고, 이에 따라 전보다 깃허브 공유 관련하여 이슈가 많이 발생하였습니다. 특히 언리얼 엔진이 아예 켜지지 않는 크리티컬한 이슈 등도 발생했지만, 이 과정에서 이전 커밋에서 브랜치를 따서 복구한다던가, 용량이 큰 파일들은 외장하드로 별도로 공유하는 등 다양한 방법을 시도해보고 해결해나갈 수 있었습니다. 해당 경험은 앞으로도 큰 도움이 될 것으로 생각합니다.

(관련 포스팅: https://sam0308.tistory.com/118)

 

[Unreal] StaticConstructorHelpers 관련 이슈

※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.※ 해당 포스팅은 Unreal 5.4.1 버전을 기준으로 작성되었습니다.   1. static 유무의 차이 기본적으

sam0308.tistory.com

 

 

 또한 지금까지 1~3차 프로젝트는 카피캣 프로젝트이다 보니 기획쪽으로 크게 확인할 일이 별로 없었는데, 이번 프로젝트는 초기에 스타듀밸리를 다소 참고한 점을 제외하고는 거의 창작에 가깝다 보니 세부 기획사항에 대하여 회의할 일이 많았습니다. 기존의 팀 프로젝트들에 비해 회의에 뺏기는 시간이 많아지긴 했지만, 이번 프로젝트야말로 팀원들과 함께 소통하며 개발해나간다는 의미에서는 가장 팀 프로젝트로서의 의미가 컸다고 생각합니다. 앞으로도 이번 경험을 살려 팀원들과 능숙하게 협업해 나가는 개발자가 되고자 합니다.