무엇을 찾고 계신가요?
Engine & platform

타일맵과 함께 사용할 수 있는 프로시저럴 패턴, 1부

ETHAN BRUINS / UNITY TECHNOLOGIES Contributor
May 29, 2018|10 분
타일맵과 함께 사용할 수 있는 프로시저럴 패턴, 1부
이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.

많은 크리에이터가 게임에 다양성을 더하기 위해 절차적 생성을 사용했습니다. 마인크래프트나 최근에는 엔터 더 건건, 데스센더스 등이 주목할 만한 게임으로 언급되었습니다. 이 게시물에서는 Unity 2017.2에 2D 기능으로 도입된 타일맵과 RuleTile에서 사용할 수 있는 몇 가지 알고리즘에 대해 설명합니다.

절차적으로 생성된 맵을 사용하면 두 번의 게임 플레이가 동일하지 않도록 할 수 있습니다. 시간이나 플레이어의 현재 레벨 등 다양한 입력을 사용하여 게임이 빌드된 후에도 콘텐츠가 동적으로 변경되도록 할 수 있습니다.

이 블로그 게시물은 어떤 내용인가요?

프로시저럴 월드를 만드는 가장 일반적인 방법 몇 가지와 제가 만든 몇 가지 커스텀 변형을 살펴보겠습니다. 다음은 이 글을 읽은 후 만들 수 있는 예시입니다. 타일맵과 규칙 타일을 사용하여 하나의 맵을 만들기 위해 세 가지 알고리즘이 함께 작동합니다:

프로시저 세계 - 소개
프로시저 세계 - 소개

알고리즘을 사용하여 맵을 생성할 때 모든 새 데이터가 포함된 int 배열을 받게 됩니다. 그런 다음 이 데이터를 가져와서 계속 수정하거나 타일맵으로 렌더링할 수 있습니다.

자세히 알아보기 전에 알아두면 좋은 정보입니다:

타일과 타일이 아닌 것을 구분하는 방법은 바이너리를 사용하는 것입니다. 1은 켜짐, 0은 꺼짐입니다.

모든 맵을 2D 정수 배열에 저장하고, 각 함수가 끝날 때(렌더링할 때 제외) 사용자에게 반환합니다.

각 함수에 들어가는 변수가 줄어들고 코드가 깔끔해지도록 배열 함수 GetUpperBound() 를 사용하여 각 맵의 높이와 너비를 가져올 것입니다.

타일맵 좌표계가 왼쪽 하단에서 시작하고 Mathf. FloorToInt()를 사용하면 숫자를 정수로 반올림할 수 있기 때문에 저는 Mathf.FloorToInt()를 자주 사용합니다.

이 블로그 게시물에 제공된 모든 코드는 C#으로 작성되었습니다.

배열 생성

GenerateArray는 지정된 크기의 새로운 int 배열을 생성합니다. 배열이 가득 차야 하는지 비워야 하는지(1 또는 0)도 말할 수 있습니다. 코드는 다음과 같습니다:

알 수 없는 블록 유형 "codeBlock"인 경우 `serializers.types` 프롭에서 해당 블록에 대한 직렬화기를 지정하세요.

렌더링 맵

이 함수는 지도를 타일맵으로 렌더링하는 데 사용됩니다. 지도의 너비와 높이를 순환하면서 배열에 1이 있는 위치에만 타일을 배치하고, 확인하려는 위치에 1이 있는 경우에만 타일을 배치합니다.

알 수 없는 블록 유형 "codeBlock"인 경우 `serializers.types` 프롭에서 해당 블록에 대한 직렬화기를 지정하세요.

지도 업데이트

이 함수는 다시 렌더링하지 않고 맵을 업데이트하는 데만 사용됩니다. 이렇게 하면 모든 타일과 해당 타일 데이터를 다시 그리지 않으므로 리소스를 덜 사용할 수 있습니다.

알 수 없는 블록 유형 "codeBlock"인 경우 `serializers.types` 프롭에서 해당 블록에 대한 직렬화기를 지정하세요.

펄린 노이즈

펄린 노이즈는 다양한 방식으로 사용할 수 있습니다. 가장 먼저 사용할 수 있는 방법은 맵의 최상위 레이어를 만드는 것입니다. 현재 x 위치와 시드를 사용하여 새 포인트를 얻는 것만큼이나 간단합니다.

Simple

이 세대는 펄린 노이즈를 레벨 생성에 구현하는 가장 간단한 형태를 취합니다. 펄린 노이즈용 Unity 기능을 사용할 수 있으므로 복잡한 프로그래밍을 할 필요가 없습니다. 또한 Mathf.FloorToInt() 함수를 사용하여 타일맵에 정수가 있는지 확인합니다.

알 수 없는 블록 유형 "codeBlock"인 경우 `serializers.types` 프롭에서 해당 블록에 대한 직렬화기를 지정하세요.

타일맵에 렌더링된 모습은 다음과 같습니다:

지도 생성
지도 생성
Smooth

이 기능을 사용하여 부드럽게 처리할 수도 있습니다. 간격을 설정하여 펄린 높이를 기록한 다음 점 사이를 부드럽게 처리합니다. 이 함수는 간격에 대한 정수 목록을 고려해야 하므로 약간 더 고급 기능으로 끝납니다.

알 수 없는 블록 유형 "codeBlock"인 경우 `serializers.types` 프롭에서 해당 블록에 대한 직렬화기를 지정하세요.

이 함수의 첫 번째 부분에서는 먼저 간격이 두 개 이상인지 확인합니다. 그렇다면 노이즈가 발생합니다. 부드럽게 하기 위해 간격을 두고 이 작업을 수행합니다. 다음 단계는 포인트를 매끄럽게 다듬는 작업입니다.

알 수 없는 블록 유형 "codeBlock"인 경우 `serializers.types` 프롭에서 해당 블록에 대한 직렬화기를 지정하세요.

평활화는 다음 단계를 통해 이루어집니다:

- 현재 위치 및 마지막 위치 가져오기

- 두 위치의 차이를 가져옵니다. 우리가 원하는 핵심 정보는 Y축의 차이입니다.

- 다음으로, 히트를 얼마만큼 변경할지 결정하는데, 이는 Y 차이를 간격 변수로 나누어 수행합니다.

이제 위치 설정을 시작할 수 있습니다. 0까지 내려가겠습니다.

Y축에서 0을 누르면 현재 높이에 높이 변경 사항을 더하고 다음 X 위치에 대해 이 과정을 반복합니다.

마지막 위치에서 현재 위치 사이의 모든 위치를 완료하면 다음 지점으로 이동합니다.

간격이 1보다 작으면 이전 함수를 사용하여 작업을 수행하기만 하면 됩니다.

알 수 없는 블록 유형 "codeBlock"인 경우 `serializers.types` 프롭에서 해당 블록에 대한 직렬화기를 지정하세요.

렌더링된 모습을 살펴보겠습니다:

스무딩
스무딩
랜덤 워크
랜덤 워크 탑

이 알고리즘의 작동 방식은 동전을 던지는 방식입니다. 그러면 두 가지 결과 중 하나를 얻게 됩니다. 결과가 앞면이면 한 블록 위로 이동하고, 뒷면이면 대신 한 블록 아래로 이동합니다. 이렇게 하면 항상 위 또는 아래로 이동하여 레벨에 약간의 높이가 생깁니다. 이 알고리즘의 유일한 단점은 매우 복잡해 보인다는 것입니다. 어떻게 작동하는지 살펴보겠습니다.

알 수 없는 블록 유형 "codeBlock"인 경우 `serializers.types` 프롭에서 해당 블록에 대한 직렬화기를 지정하세요.

이 세대는 펄린 노이즈 생성에 비해 더 부드러운 높이를 제공합니다.

랜덤 워크 탑 스무딩

이 세대는 펄린 노이즈 생성에 비해 더 부드러운 높이를 제공합니다.

이 랜덤 워크 변형은 이전 버전보다 훨씬 더 매끄러운 마무리를 가능하게 합니다. 함수에 두 개의 새 변수를 추가하면 이 작업을 수행할 수 있습니다:

  • 첫 번째 변수는 현재 키를 얼마나 오래 유지했는지 확인하는 데 사용됩니다. 이 값은 정수이며 높이를 변경하면 재설정됩니다.
  • 두 번째 변수는 함수에 대한 입력이며 높이의 최소 단면 너비로 사용됩니다. 이 기능을 사용하면 더 이해가 쉬울 것입니다.

이제 무엇을 추가해야 하는지 알았습니다. 기능을 살펴보겠습니다:

알 수 없는 블록 유형 "codeBlock"인 경우 `serializers.types` 프롭에서 해당 블록에 대한 직렬화기를 지정하세요.

아래 GIF에서 볼 수 있듯이 랜덤 워크 알고리즘의 평활화를 통해 레벨 내에서 멋진 평평한 조각을 만들 수 있습니다.

동전 던지기
맺는말

이 글을 통해 프로젝트에서 어떤 형태로든 절차적 생성을 사용하는 데 영감을 얻으셨기를 바랍니다. 프로시저럴 생성 맵에 대해 자세히 알아보려면 프로시저럴 생성 위키 또는 로그베이신닷컴에서 훌륭한 리소스를 확인하세요.

다음 시리즈 포스팅에서 절차적 생성을 사용하여 동굴 시스템을 만드는 방법을 살펴보시기 바랍니다.

절차적 생성을 사용하여 멋진 것을 만들면 트위터에 메시지를 보내거나 아래에 댓글을 남겨주세요!

유나이트 베를린의 2D 프로시저럴 생성

더 자세히 알아보고 라이브 데모를 체험하고 싶으신가요? 또한 6월 20일에 열리는 유나이트 베를린의 엑스포 홀 미니 극장에서 타일맵과 함께 사용할 수 있는 프로시저럴 패턴에 대해 발표할 예정입니다. 강연이 끝난 후 직접 만나서 이야기를 나누고 싶으시다면 제가 근처에 있을게요!