본문으로 건너뛰기

© 2026 Molayo

YouTube요약2026. 06. 15. 10:23

Unity Splines를 사용하여 건물 전체를 절차적으로 생성하기

요약

Unity Splines와 모듈형 메시를 활용하여 건물을 절차적으로 생성하는 도구 제작 방법을 소개합니다. 스플라인을 따라 벽, 창문, 문 등의 메시를 배치하고 건물의 높이와 모양을 자유롭게 조절하는 워크플로우를 다룹니다.

핵심 포인트

  • Unity Splines를 이용한 절차적 건물 외형 생성 방법
  • 모듈형 메시 조각을 스플라인 경로에 따라 자동 정렬 및 배치
  • 씬 뷰에서 드래그만으로 건물의 높이와 크기를 커스터마이징
  • 생성된 건물을 프로젝트 내에서 재사용 가능하도록 베이크(Bake)하는 과정

비디오: Unity Splines를 사용하여 건물 전체를 절차적으로 생성하기
채널: Game Dev Guide
길이: 21분 49초
출처: 자막 (자동 생성, 영어)

트랜스크립트:
당신의 게임이 도시 환경이든, 중세 환경이든, 디스토피아적이든, 혹은 좀 더 낙관적인 미래 지향적이든 간에, 이러한 설정들의 대다수는 피할 수 없는 한 가지 공통점을 가지고 있습니다. 바로 건물입니다. 게임에는 어디에나 건물이 있지만, 개발 관점에서 보면 건물은 일종의 골칫거리이기도 합니다. 건물을 만드는 방법에는 약 천 가지의 서로 다른 방식이 있습니다. 레고를 가지고 노는 것처럼 모듈형(Modular) 조각들을 하나씩 수동으로 배치할 수도 있습니다. 완전히 절차적(Procedural)인 방식을 택해 알고리즘이 도시를 생성하게 할 수도 있는데, 이는 그 한 가지 일을 전문적으로 수행하는 것이 한 사람의 온전한 업무라는 사실을 깨닫기 전까지는 멋지게 들립니다. 아니면 왜 굳이 그렇게 하나요? 그냥 배경에 로우 폴리(Low poly) 큐브 몇 개를 던져 놓고 도시 미니멀리즘이라고 부를 수도 있습니다. 핵심은, 이를 수행하는 단 하나의 정답은 없다는 것입니다. 각 게임과 각 프로젝트는 고유한 요구 사항을 가지고 있으며, 각 팀은 레벨이나 환경을 구축할 때 선호하는 서로 다른 방식이 있을 것입니다. 하지만 확실히 가정할 수 있는 주요 사항은, 이러한 팀들이 잠재적으로 믿을 수 없을 정도로 고통스럽고 시간이 많이 소요될 수 있는 이 과정을 훨씬 덜 소모적이고 덜 고통스럽게 만드는 데 도움을 줄 도구들을 가지고 있다는 점입니다. 그래서 이 영상에서는 제가 스플라인(Splines)과 모듈형 메시(Modular mesh) 조각들을 사용하여 제 게임을 위한 건물을 생성하기 위해 만든 도구를 안내해 드리려고 합니다. 이는 모든 벽돌을 일일이 미세하게 관리(Micromanaging)해야 하는 고통 없이 제가 필요로 하는 유연성을 제공해 주었습니다. 안녕하세요, 저는 Matt이며 GameDev Guide에 오신 것을 환영합니다. 이번 에피소드에서는 Unity 스플라인 도구(Spline tools)를 사용하여 벽과 창문 메시(Mesh)를 배치하고, 우리 게임에서 사용할 수 있도록 건물의 외형(Shell)을 절차적으로 생성하는 방법을 살펴보겠습니다. 스플라인을 따라 포인트를 배치하고 그 주변에 메시 조각들을 절차적으로 정렬하는 방법뿐만 아니라, 창문이나 문과 같은 다양한 참조 조각들을 선택하여 이를 메시에 병합하는 방법도 살펴볼 것입니다.

그 작업이 완료되면, 건물의 모양과 크기를 커스터마이징할 수 있는 도구를 구축하는 방법도 살펴볼 것입니다. 이를 통해 씬 뷰 (Scene View)에서 도구를 드래그하는 것만으로 높이를 변경할 수 있으며, 우리의 스플라인 (Spline) 편집 워크플로우와 더욱 자연스럽게 통합할 수 있습니다. 그런 다음, 커스터마이징과 조절이 가능한 지붕을 절차적으로 생성하여 건물 메시 (Mesh)를 완성할 것입니다. 마지막으로, 최종 메시를 프로젝트에 베이크 (Bake)하여 프로젝트 내의 다른 곳이나 완전히 다른 프로젝트에서도 인스턴스 (Instance)를 만들 수 있는 방법을 알아보겠습니다.

본격적으로 시작하기 전에, 이 영상의 스폰서인 Exola에 감사의 말씀을 전하고 싶습니다. 현재 이 영상을 시청 중인 개발자로서 모바일 게임을 개발하고 있다면, Exola의 웹숍 (Web shop)에 관심이 생길 수도 있습니다.

역사적으로 모바일 개발자들은 게임 내 통화나 아이템을 판매하고 싶을 때 선택지가 많지 않았습니다. 플랫폼 스토어프런트 (Storefronts)를 거쳐야 했고, 플랫폼 수수료로 약 30%를 잃어야 했습니다. 우리 모두 그것이 얼마나 고통스러운 일인지 알고 있습니다. 특히 게임을 사람들에게 알리기 위해 다른 모든 이들과 경쟁하고 있다고 느껴질 때는 더욱 그렇습니다. 보상이 많지 않을 때 그 30%는 큰 차이를 만듭니다.

하지만 다행인 점은, 다소 악명 높은 법적 분쟁들 덕분에 시대가 변하고 있다는 것입니다. 이제 미국의 개발자들은 규칙을 어기지 않고도 iOS 앱에서 플레이어를 브라우저 기반의 결제 페이지로 직접 연결할 수 있습니다. Exo Webshop은 코딩 없이도 구축할 수 있는 맞춤형 브랜드 스토어프런트를 제공하며, 플레이어가 여러분으로부터 직접 구매할 수 있게 해줍니다. Exo Webshop은 게임 내 통화, 번들 (Bundles), 패스 (Passes) 또는 여러분이 판매하고자 하는 그 어떤 것이든 처리할 수 있습니다. 또한 그들의 결제 시스템은 1,000가지 이상의 다양한 결제 수단을 지원합니다. 플랫폼 소유자가 가져가는 30%의 수수료 대신, 거래 수수료는 약 5% 수준이므로 게임 수익의 훨씬 더 많은 부분을 유지할 수 있습니다. 또한 별도의 시스템을 직접 작성하지 않고도 프로모션을 실행하고, 특별 번들을 제공하며, 라이브 옵스 (Live ops)를 관리할 수 있는 내장 도구들도 갖추고 있습니다.

따라서 초기 비용을 절약할 수 있을 뿐만 아니라, 수익화 (monetize) 방식과 플레이어 참여 (engage)를 유도하는 방식을 더 효과적으로 제어할 수 있습니다. Exo는 이를 오랫동안 수행해 왔습니다. 이들은 게임과 함께 규모를 확장 (scale)하는 방법을 이해하는 이 분야의 몇 안 되는 기업 중 하나입니다. 이미 모바일 분야의 가장 큰 이름들을 가진 기업들이 사용하고 있지만, 이를 활용하기 위해 반드시 대형 스튜디오일 필요는 없습니다. 설정은 빠르고, 통합 (integration)은 가볍게 이루어지며, 그냥 제대로 작동합니다. 만약 Exol Webshop이 도움이 될 것 같다면, 설명란의 링크를 따르거나 지금 화면의 QR 코드를 스캔하여 확인해 보세요. 이 영상의 이 부분을 후원해 준 Exo에 다시 한번 감사드립니다. 이제, 우리의 절차적 건물 생성 (procedural building generation) 도구를 설계해 봅시다.

이미 알고 계시겠지만, 개발자가 레벨을 위해 건물을 생성하는 방법에는 매우 다양한 방식이 있습니다. 어떤 이들은 상세하고 다양한 구조물을 만들어내기 위해 복잡한 건축 논리를 시뮬레이션하는 절차적 시스템 (procedural systems)에 전적으로 매달립니다. 다른 이들은 모듈형 메쉬 (modular meshes)를 직접 배치하고 레고처럼 서로 맞물리게 하는 완전 수동 방식을 택하기도 합니다. 그리고 그 중간 어디쯤에 위치한 옵션들도 있습니다.

궁극적으로 가장 좋은 접근 방식은 여러분의 게임에 가장 쉽고 합리적인 방식입니다. 저에게 있어 그것은 오늘 여러분과 공유할 이 스플라인 (spline) 기반 접근 방식입니다. 저는 이것이 유연성 (flexibility)과 제어 (control) 사이에서 정말 멋진 균형을 이룬다고 생각합니다. 제 게임은 도시를 질주하며 승객을 태우는 것이 핵심입니다. 도시는 분명 경험의 일부이지만, 대부분의 플레이어가 그냥 빠르게 지나쳐 버릴 복잡한 디테일을 만드는 데 터무니없는 시간을 소비할 필요는 없습니다. 저는 그저 환경이 반복을 피할 수 있을 만큼 충분한 변주를 갖추고, 명백히 잘못되었거나 어색해 보이지 않는 도시처럼 느껴지기만 하면 됩니다. 저는 차라리 그 시간을 게임플레이 (gameplay)를 다듬는 데 쓰고 싶습니다. 그래서 저는 스플라인을 그려서 건물을 배치할 수 있는 도구를 만들었습니다.

이 도구는 제가 선택한 미리 제작된 메시 (mesh) 조각들을 곡선을 따라 배치합니다. 덕분에 빠르게 형태를 잡을 수 있고, 점을 이동하거나 메시를 교체함으로써 변경 사항을 적용할 수 있으며, 맵 전체의 일관성을 유지할 수 있습니다. 모든 조각을 일일이 수작업으로 배치하는 것은 작은 장면에서는 괜찮지만, 도시 전체를 대상으로 한다면 금방 지루한 작업이 되었을 것입니다. 완전한 절차적 생성 (procedural generation)이 더 많은 다양성을 제공할 수는 있겠지만, 특정 결과물을 향해 유도하거나 일단 만들어진 것을 정교하게 다듬기는 더 어렵습니다. 주요 트레이드오프 (trade-off)는 이 시스템이 스플라인 (spline)을 따라 잘 작동하는 메시들에 의존한다는 점입니다. 따라서 복잡한 디자인이나 복잡한 지붕 모양에는 적합하지 않지만, 제 프로젝트의 규모와 목적에는 저를 느려지게 하지 않으면서 필요한 것을 제공해 줍니다. 그리고 나중에 더 세밀하게 만들고 싶다면, 스플라인으로 생성된 메시 위에 언제든지 수작업으로 추가적인 디테일을 더할 수 있습니다. 이러한 모든 점을 염두에 두고, 이제 이와 같은 도구를 어떻게 함께 만들어 나갈 수 있는지 살펴보겠습니다.

여기에 거의 비어 있는 환경 씬 (environment scene)이 있으니, 이를 우리가 절차적으로 생성할 건물들로 채워보고 싶습니다. 보시는 바와 같이, 여기 세 개의 메시가 있습니다. 벽 메시, 창문 메시, 그리고 문 메시입니다. 우리가 할 일은 메시 조각의 너비에 따라 스플라인 주변에 점들을 생성하고, 그런 다음 우리의 파라미터 (parameters)에 따라 각 메시 조각을 무작위로 배치하는 도구를 작성하는 것입니다. 시작하기 위해, 패키지 매니저 (package manager)로 가서 Splines가 다운로드되어 있는지 확인하겠습니다.

그런 다음, 여기서 빠르게 스플라인을 그려보겠습니다. 그리고 'building maker'라고 부를 새로운 스크립트를 생성하겠습니다. 이것은 결국 우리를 위해 각 건물을 생성해 줄 하나의 거대한 스크립트가 될 것입니다. 하지만 지금은 우선 점들을 생성하도록 만들어 보겠습니다. 여기에서 [RequireComponent] 속성을 추가하여 오브젝트가 스플라인 컨테이너 (spline container)를 가지고 있는지 확인하겠습니다. 또한 우리가 편집하는 동안 스크립트가 실행될 수 있도록 [ExecuteInEditMode] 속성도 추가하겠습니다. Awake 메서드에서 스플라인 컨테이너를 로컬 참조 (local reference)에 할당하겠습니다.

우리는 우리가 제공하는 메쉬 (mesh)를 기반으로 거리를 동적으로 계산할 것입니다. 그러니 우리가 가진 세 가지 메쉬 모두에 대한 참조 (reference)를 추가하겠습니다. 그리고 거리를 위한 변수도 추가하겠습니다. 에디터에서 이 작업을 수행하는 동안, 인스펙터 (Inspector)에서 무언가를 변경할 때마다 통계 수치들을 업데이트할 수 있도록 OnValidate를 사용하겠습니다. 벽 메쉬의 경계 (bounds)를 사용하여 거리 속성을 설정해 보겠습니다. 제 메쉬들은 x축을 따라 정렬되어 있습니다. 따라서 이를 사용하여 너비를 계산하겠습니다. 다음으로, 스플라인 (spline)의 길이를 계산하고, 메쉬 조각들을 인스턴스화 (instance)할 지점들을 스플라인을 따라 지정해야 합니다. CalculatePoints라는 새로운 메서드를 만들고 이를 OnValidate 메서드에서 호출하겠습니다. 여기에서 우리는 포인트 벡터 (point vectors)의 새로운 리스트와 탄젠트 벡터 (tangent vectors)의 새로운 리스트를 생성할 것입니다. 그런 다음 컨테이너에 있는 메인 스플라인에 대한 참조를 가져와 스플라인의 0번 지점에서의 위치와 탄젠트를 평가 (evaluate)하겠습니다. 그다음, 스플라인의 유용한 GetPointAtLinearDistance 함수를 사용하여 벽의 크기만큼 스플라인을 따라 이동한 후의 t 값을 계산하겠습니다. 그런 다음 while 루프를 사용하여 스플라인을 반복하며 끝까지 이동할 때까지 각 포인트와 탄젠트를 할당하겠습니다. 인스펙터를 확인해 보면, 이제 스플라인을 따라 포인트 리스트가 생성된 것을 볼 수 있습니다. 제가 이와 같이 작업을 수행하며 복잡한 스크립트를 조각별로 구축할 때, 저는 항상 제가 무엇을 하고 있는지 조금 더 쉽게 시각화하는 것을 좋아합니다. 인스펙터에서 벡터 리스트만 보고 있으면 실수를 발견하기 어려울 때가 있기 때문입니다. 그래서 저는 씬 기즈모 (scene gizmos)를 활용하는 것을 좋아합니다. 이 루프를 OnDrawGizmosSelected 메서드에 배치하면 스크립트 작업 중에 모든 포인트를 시각화할 수 있습니다. 보시는 것처럼, 이제 스플라인을 따라 포인트들이 균등하게 배치되었습니다. 하지만 변경 사항을 만들면 시각화가 업데이트되지 않는다는 점을 주목해 주세요. 스플라인의 변경 사항을 감지하고 업데이트를 트리거할 수 있는 방법을 추가해 보겠습니다. 정적 (static) Spline.Callback을 사용하여 이를 수행할 수 있습니다.

자, 이제 우리의 OnEnable 메서드에 리스너 (listener)를 추가해 보겠습니다. 그리고 또한...

AI 자동 생성 콘텐츠

본 콘텐츠는 YouTube Game Dev Guide의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0