유니티/3D 랜덤 맵

[Unity] 3D 랜덤 맵 - 1. 지형 생성

이름?없음 2024. 2. 21. 16:13
반응형

이번 글에서는 유니티 터레인을 사용해서 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;

    }


}

 

이제 실행해 보시면 랜덤 하게 지형이 생성되는 것을 확인하실 수 있습니다

 

하지만 이것이 지형이라기에는 좀 부자연스러운데요

다음 글에서는 지형을 더 자연스럽게 생성되도록 코드를 수정해 보겠습니다

반응형