반응형
    
    
    
  
유니티 2D 랜덤 맵을 생성하는 법에 대하여 알아봅시다
맵 생성을 만들기 전 먼저 알아둬야 할 것이 있습니다
바로 Perline Noise입니다
Perline Noise란? : 파동 형태로 구성된 무작위패턴을 생성하는 노이즈
참고 : https://docs.unity3d.com/ScriptReference/Mathf.PerlinNoise.html
대충 이렇게 생긴 노이즈를 생성합니다

이 Perline Noise를 이용하여 지형의 높낮이를 표현하고
그 높낮이의 맞는 타일을 타일맵에 배치하는 식으로 구현하려 합니다
반응형
    
    
    
  Perline Noise를 생성하는 과정에서 시간이 오래 걸릴 수도 있기 때문에 비동기 함수로 작성하려 합니다
Start 함수
    private async void Start()
    {
        seed = Random.Range(0, 10000f); //랜덤 생성을 위한 값
        var noiseArr = await Task.Run(GenerateNoise); //노이즈 생성 대기
        SettingTileMap(noiseArr); //타일 배치
    }
Start 함수는 seed를 생성하고 Perline Noise가 생성될 때까지 대기합니다
GenerateNoise함수
    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;
    }
GenerateNoise 함수는 mapSize에 맞추어 Perline Noise를 생성합니다
SettingTileMap 함수 & GetTileByHight 함수
    private void SettingTileMap(float[,] noiseArr)
    {
        Vector3Int point = Vector3Int.zero;
        for (int x = 0; x < mapSize; x++)
        {
            for (int y = 0; y < mapSize; y++)
            {
                point.Set(x, y, 0);
                tileMap.SetTile(point, GetTileByHight(noiseArr[x, y])); //타일 배치
            }
        }
    }
    private TileBase GetTileByHight(float hight)
    {
        switch (hight)
        {
            case <= 0.35f: return water;
            case <= 0.45f: return sand;
            case <= 0.6f: return gress;
            default: return forest;
        }
    }
SettingTileMap 함수에서 타일을 배치해 주고
GetTileByHight 함수에서 높낮이에 맞는 타일을 반환하여 줍니다

시작하면 이런 지형이 생성됩니다
하지만 지형이 자연스럽지 않은데요
다음에는 지형이 더 자연스럽게 생성되도록 바꾸어 보도록 합시다
전체코드
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Tilemaps;
public class RandomMapGenerater : MonoBehaviour
{
    [Header("타일맵 관련")]
    [SerializeField] private Tilemap tileMap;
    [SerializeField] private TileBase water, sand, gress, forest;
    [Space]
    [Header("값 관련")]
    [SerializeField] private float mapScale = 0.01f;
    [SerializeField] private int mapSize;
    private float seed;
    private async void Start()
    {
        seed = Random.Range(0, 10000f);
        var noiseArr = await Task.Run(GenerateNoise);
        SettingTileMap(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;
    }
    private void SettingTileMap(float[,] noiseArr)
    {
        Vector3Int point = Vector3Int.zero;
        for (int x = 0; x < mapSize; x++)
        {
            for (int y = 0; y < mapSize; y++)
            {
                point.Set(x, y, 0);
                tileMap.SetTile(point, GetTileByHight(noiseArr[x, y]));
            }
        }
    }
    private TileBase GetTileByHight(float hight)
    {
        switch (hight)
        {
            case <= 0.35f: return water;
            case <= 0.45f: return sand;
            case <= 0.6f: return gress;
            default: return forest;
        }
    }
}반응형
    
    
    
  '유니티 > 2D 랜덤 맵' 카테고리의 다른 글
| [Unity] 2D 랜덤 맵 - 3. 바이옴 (0) | 2023.10.29 | 
|---|---|
| [Unity] 2D 랜덤 맵 - 2. 더 자연스러운 지형 생성 (0) | 2023.10.27 |