코딩/유니티

[유니티] 3D 랜덤 맵 생성 3

Hun die 2023. 5. 26. 08:32
3D PerlinNoise

이전에 쓴 PerlinNoise 는 가장 위쪽을 기준으로 아래로 블록을 깔아 지형의 굴곡이 다양하지 않아 2D와 다를게 없었다.

그래서 기존의 PerlinNoise의 공식을 3D로 바꾸기로 했다.

 

private float NoiseGenerater(float X, float Y, float Z)
    {
        X = X / 10 + Seed;
        Y = Y / 10 + Seed;
        Z = Z / 10 + Seed;

        float xy = Mathf.PerlinNoise(X, Y);
        float yz = Mathf.PerlinNoise(Y, Z);
        float xz = Mathf.PerlinNoise(X, Z);
        float yx = Mathf.PerlinNoise(Y, X);
        float zy = Mathf.PerlinNoise(Z, Y);
        float zx = Mathf.PerlinNoise(Z, X);

        float perlinValue = ((xy + yz + xz + yx + zy + zx) / 6f) * NoiseHeight;
        return perlinValue;
    }

PerlinNoise의 공식을 바꾸고 NoiseHeight를 기준으로 변수 값을 정하고 변수 값을 넘기면 블록이 생성되고 변수값을 넘기지 못하면 블록이 생성되지 않게 하여 지형에 다양성을 형성했다.

하지만, 아래의 굴곡은 생겼지만, 위쪽위 굴곡이 사라졌다.

그래서 이전에 x , z 값을 사용한 PerlinNoise공식을 같이 하용하여 y값에 넣어 주었다.

 x , z 값을 사용한 PerlinNoise를 사용하여 y값을 깎아주자 예쁜 지형이 탄생했다.

 

높이 구분

이제 새롭게 맵이 만들어 졌으니 높이를 구분 지어 보기로 했다.

가장 간단한건 아무래도 색을 바꾸는 것이다.

 

구분 지을 높이를 적을 변수값을 만들고 색을 구분지어 주었다.

for (int x = 0; x < ChunkSize; x++)
        {
            for (int z = 0; z < ChunkSize; z++)
            {
                for (int y = -64; y < Mathf.RoundToInt(NoiseHeightGenerater(x, z) * NoiseHeight); y++)
                {
                    if (NoiseGenerater(x, y, z) > NoiseHeight / NoiseWidth)
                    {
                        GameObject block = Block[0];
                        // 검은색 높이
                        if (Mathf.RoundToInt(NoiseHeightGenerater(x, z) * NoiseHeight) - blackSide >= y)
                            block = Block[1];
                        // 회색 높이
                        else if (Mathf.RoundToInt(NoiseHeightGenerater(x, z) * NoiseHeight) - graySide >= y)
                            block = Block[2];

                        Instantiate(block, new Vector3(x * BlockOffset, y * BlockOffset, z * BlockOffset), Quaternion.identity, transform);
                    }
                }
            }
        }

색을 입히니 마인크래프트에서 보던 청크와 비슷하게 완성되었다.

생각보다 그럴듯하게 보여서 재미있다.