Unityでマインクラフト風のマップをランダム生成する

今回やること

画像のようにマイクラ風のマップを自動で生成するツールを作成します
こちらを参考にしましたが、マイクラのようにブロックの高さがきっちり分けられるようにしたかったので直してみました

目次

マップを生成するスクリプトの作成

Create → C#Scriptを選択します

スクリプトの名前をMapMakerにして、ダブルクリックして編集画面を開き、以下のスクリプトを入力します

入力するスクリプト

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class MapMaker : MonoBehaviour
{
    private float SeedX, SeedZ; // マップ生成をランダムにするための変数

    [SerializeField]
    private float Width = 50; // マップの横幅
    [SerializeField]
    private float Depth = 50; // マップの奥行き

    [SerializeField]
    private bool NeedToCollider = false; // 当たり判定をつけるかどうかの変数

    [SerializeField]
    private float MaxHeight = 10; // 最大の高さ

    [SerializeField]
    private float Relief = 15f; // 起伏の激しさ

    private int PositionY; // 高さを整数に変換するための変数

    private void Awake()
    {
        SeedX = Random.value * 100f; // 同じ値にならないようにx座標をランダムにする
        SeedZ = Random.value * 100f; // 同じ値にならないようにz座標をランダムにする

        //キューブ生成
        for (int x = 0; x < Width; x++) // 指定した横幅になるまで繰り返す
        {
            for (int z = 0; z < Depth; z++) // 指定した奥行きになるまで繰り返す
            {
                GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); // 新しいキューブ作成
                cube.transform.localPosition = new Vector3(x, 0, z); // 地面に置く
                cube.transform.SetParent(transform); // キューブを子オブジェクトにする

                if (!NeedToCollider) // もし、コライダーをつけないなら、
                {
                    Destroy(cube.GetComponent<BoxCollider>()); // コライダーを消す
                }

                SetY(cube); // 高さの設定をする
            }
        }
    }

    private void SetY(GameObject cube) // キューブのY座標を設定する関数
    {
        float y = 0; // yを0にする
        float xSample = (cube.transform.localPosition.x + SeedX) / Relief; // パーリンノイズで使う値を求める 
        float zSample = (cube.transform.localPosition.z + SeedZ) / Relief; // パーリンノイズで使う値を求める
        float noise = Mathf.PerlinNoise(xSample, zSample); // ノイズをパーリンノイズで出した値にする
        y = MaxHeight * noise; // yを最大の高さ*noiseの値にする
        PositionY = Mathf.RoundToInt(y); // PositionYをyを四捨五入した値にする
        cube.transform.localPosition = new Vector3(cube.transform.localPosition.x, PositionY, cube.transform.localPosition.z); // キューブを設置する

        Color color = Color.black;//岩盤っぽい色

        if (y > MaxHeight * 0.3f)
        {
            ColorUtility.TryParseHtmlString("#006400", out color);//草っぽい色
        }

        else if (y > MaxHeight * 0.2f)
        {
            ColorUtility.TryParseHtmlString("#4169e1", out color);//水っぽい色
        }

        else if (y > MaxHeight * 0.1f)
        {
            ColorUtility.TryParseHtmlString("#d2691e", out color);//マグマっぽい色
        }

        cube.GetComponent<MeshRenderer>().material.color = color;
    }

}

スクリプトをつけるオブジェクトの作成

Create → CreateEmptyをおします

オブジェクトの名前をMapMakerにします

作成したオブジェクトにスクリプトをドラッグ&ドロップします
スクリプトの各設定は

  • Width : ステージの横幅
  • Depth : ステージの奥行き
  • Need To Collider : 作成した Cubeに当たり判定をつけるかどうか
  • MaxHeight : ステージの一番高い部分の高さ
  • Relief : ステージの勾配

テストプレイをすると

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次