이번 글에서는 유니티 터레인을 사용해서 3D 랜덤 맵을 만들어 보겠습니다
우선 터레인을 만드는 작업부터 시작하겠습니다
우선 터레인을 하나 생성해 주세요
그다음 터레인설정을 조절해야 합니다
자신이 원하는 크기로 하시면 됩니다 저는 큰 걸 원해서 4096x4096으로 설정하였습니다
너무 크게 설정한다면 컴퓨터에 따라 맵 생성 중 메모리초과가 발생할 수 있으므로 본인의 컴퓨터 사양과 게임의 타겟 플랫폼에 따라 알맞게 설정해 주셔야 합니다
이제 지형을 생성할 차례입니다 저는 지형을 표현하기 위하여 Perline Noise를 사용하려 합니다
Perline Noise란? : 파동 형태로 구성된 무작위패턴을 생성하는 노이즈
https://docs.unity3d.com/ScriptReference/Mathf.PerlinNoise.html
Unity - Scripting API: Mathf.PerlinNoise
Perlin noise is a pseudo-random pattern of float values generated across a 2D plane (although the technique does generalise to three or more dimensions, this is not implemented in Unity). The noise does not contain a completely random value at each point b
docs.unity3d.com
이제 코드를 작성하겠습니다
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
public class EX : MonoBehaviour
{
[Header("타일맵 관련")]
[SerializeField] private Terrain terrain;
[Space]
[Header("값 관련")]
//노이즈의 스케일 값이 클수록 새밀한 노이즈가 표현된다
[SerializeField] private float mapScale = 0.003f;
//맵의 사이즈
[SerializeField] private int mapSize = 4096;
//맵의 최대높이
[SerializeField] private int depth = 600;
//랜덤 생성을위한 시드
private float seed;
private async void Start()
{
seed = Random.Range(0, 10000f);
var noiseArr = await Task.Run(GenerateNoise);
SetTerrain(noiseArr);
}
//실질적으로 지형을 설정하는 함수
private void SetTerrain(float[,] noiseArr)
{
//크기를 설정
terrain.terrainData.size = new Vector3(mapSize, depth, mapSize);
//지형 그리기
terrain.terrainData.SetHeights(0, 0, noiseArr);
}
//노이즈 생성 함수
private float[,] GenerateNoise()
{
float[,] noiseArr = new float[mapSize, mapSize];
for (int x = 0; x < mapSize; x++)
{
for (int y = 0; y < mapSize; y++)
{
//랜덤한 노이즈를 생성
noiseArr[x, y] = Mathf.PerlinNoise(
x * mapScale + seed,
y * mapScale + seed);
}
}
return noiseArr;
}
}
이제 실행해 보시면 랜덤 하게 지형이 생성되는 것을 확인하실 수 있습니다
하지만 이것이 지형이라기에는 좀 부자연스러운데요
다음 글에서는 지형을 더 자연스럽게 생성되도록 코드를 수정해 보겠습니다
'유니티 > 3D 랜덤 맵' 카테고리의 다른 글
[Unity] 3D 랜덤 맵 - 3. 지형 색칠 (0) | 2024.02.21 |
---|---|
[Unity] 3D 랜덤 맵 - 2. 자연스러운 지형 생성 (0) | 2024.02.21 |