센로그

[UE5, Python] 절차적 레벨 생성을 활용한 3D 앵그리버드 본문

프로젝트

[UE5, Python] 절차적 레벨 생성을 활용한 3D 앵그리버드

seeyoun 2024. 1. 21. 23:32

◆ 프로젝트 개발 동기

'앵그리버드가 3D라면 어떨까?'

앵그리버드를 3D로 각색하여, 앵그리버드 시점으로 게임을 진행하면 재밌을 것 같다는 생각이 들었습니다.

플레이어가 앵그리버드가 되어 건물을 부수고 목표를 향해 나아가는 것입니다.

 

다만, 다양한 맵을 절차적으로 생성할 것이고, 보다 현실적인 파괴를 위해 물리 기반 fracture을 적용할 것입니다.

 


 프로젝트의 목적

  • 물리적으로 타당하게 구성된 3D 맵을 자동으로 생성하도록 한다.
  • 맵의 구조물은 충돌 점을 중심으로 파괴하도록 한다.

 


 프로젝트 개요

 

 


진행 방법

다음 과정으로 프로젝트를 진행하였습니다.

  1. 절차적 생성 과정을 기반으로 3D 맵(구조물)이 생성된다. 생성된 맵 곳곳에 목표물이 배치된다.
  2. 플레이어는 목표물에 도달하기 위해 자신이 나아갈 방향을 조절한다.
  3. 플레이어는 구조물을 부수며 나아간다.
    이때 물리 기반 fracture을 적용해 구조물이 보다 현실적으로 파괴되도록 한다.
  4. 정해진 시도 횟수 안에 모든 목표물을 모두 제거하면 승리한다.

 

 

이를 위해 다음 두 가지 논문을 참고하였습니다.

1.Agent-Based Adaptive Level Generation for Dynamic Difficulty Adjustment in Angry Birds 』 (2019)

 

위 논문에서는 앵그리버드의 2D 레벨을 절차적으로 생성합니다.

앵그리버드 게임의 레벨은 중력 요소가 고려되어야 합니다.

따라서 단순한 타일 기반 생성이 아닌, 블록을 떨어트리는 방식으로 좌표를 생성합니다.

 

프로젝트에서는, 레벨 생성 시 디자이너의 controllability를 높이고자 LVE를 사용하였습니다.

LVE(Latent Variable Evolution)은 간단히 말해 잠재 공간의 분포를 바꾸는 작업입니다.

논문에서 사용한 Sequential VAE는 입력값을 인코딩하여 잠재 공간에 매핑합니다.

저희는 논문에서 기본적으로 사용하는 잠재 공간의 분포(표준 정규 분포)를 변형하여, 사용자가 원하는 결과물이 더 잘 나올 수 있도록 개선하고자 했습니다.

추가로, GAN의 구조를 활용하고자 Discriminator을 추가하여 Generator의 성능을 높였습니다. 

 

 

 
최종적인 Input, Output은 다음과 같습니다.
  • Input: 생성될 레벨 개수, 금지된 블록 및 블록 머터리얼, 돼지 개수(최대,최소), 생성 시간 제한(분 단위) + 주요 머터리얼
  • Output: 절차적으로 생성된 2D Level
 

 

결과적으로, 다음과 같은 3D 레벨을 생성할 수 있습니다.

 

2. 『Breaking Good: Fracture Modes for Realtime Destruction』 (2023, SIGGRAPH)

생성된 각각의 블록에 Fracture을 적용하여 물리적 타당성을 부여하고자, 해당 논문을 선정했습니다.

 

기존 언리얼 엔진의 프랙처 모드는 미리 쪼개놓은 메쉬를 사용하며, 충돌 지점이 바뀌어도 쪼개지는 모양은 변하지 않습니다.

 

반면 타깃 논문에서는 충돌 지점에 따른 에너지 계산을 통해 실시간으로 물체를 조각냅니다.

 

방법은 다음과 같습니다.

  1. 우선 물체에 탄력이 있다고 가정하고, 충돌 정보를 vertex에 반영합니다.
  2. 이후 runtime에 vertex 정보를 업데이트하여, 임계값을 넘은 vertex들이 부서지는 방식입니다.

따라서 보다 다양하고 물리적으로 타당한 형태로 블록을 쪼갤 수 있습니다.

 

프로젝트에서는, Python과 Unreal Engine간 TCP 통신을 사용해 충돌 지점 및 물체 정보를 교환하였습니다.

 

 

이때, 실시간 처리 속도를 높이기 위해 타입 별로 미리 계산된 데이터를 저장해두고 해당 데이터를 기반으로 얻은 결과물을 충돌 위치에 생성하였습니다.

 

 

결과적으로, 다음과 같이 오브젝트가 파괴됩니다.

 


◆ 개발 기간 및 참여 인원

  • 개발 기간 : 2023.09. - 2023.12. (4개월)
  • 참여 인원 : 4명

 


◆ 프로젝트에서 나의 역할

  • VAE에 Controallibility 적용하여 개선
  • LVE 기반 2D → 3D Mapping
  • Unreal 얼음 셰이더 제작
  • 돼지 충돌 시 Physics Asset으로 적용

 


◆ 기술 스택 및 사용한 도구

  • Unity (C#)
  • GitHub

 

Comments