Unity

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 : ステージの勾配

テストプレイをすると

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

-Unity

執筆者:


comment

メールアドレスが公開されることはありません。

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

関連記事

no image

【Unity】少し遅れて移動、回転するオブジェクト【電車の動き】

実装したいこと 動画のように前の車両に遅れてついていく電車を作成します シューティングのサブ機とかにも使えそうですね ※今回の記事は自分へのメモ用ですので説明は割愛しています ご了承下さい https …

Unityの便利機能を使いこなそう #3 AnimatorControllerでキャラをヌルヌル動かそう

AnimatorControllerの説明 名前の通りキャラクターのアニメーションを切り替えます 例えば何もしてない時は、待機アニメーションにしたり、移動キーがおされたら、走るアニメーションに切り替え …

Unityでシーンを切り替える

現在のシーンの登録 現在のシーンをセーブして、File → Build Settingsをおします Add Open Scenesをおして、×で閉じます 切り替えるシーンの作成 File → New …

UnityでLerpを使って収縮運動や往復運動をさせる

Lerpとは? transform.localPosition = Vector3.Lerp(スタート地点の座標, 目的地の座標, 移動量); と入力すると、スタート地点から目的地まで移動量ずつ移動し …

オブジェクトを波状に動かす

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Wave : M …

ゲタバコ倶楽部へようこそ

  • 318836総閲覧数:
  • 105今日の閲覧数:
  • 246593総訪問者数:
  • 90今日の訪問者数:

住所
Akita,Japan

営業時間
月~日: 10:00 AM – 10:00 PM

このページはゲタバコ先生の日々思うことや活動、プログラミングの習得方法を発信するページです。
仕事のご依頼、メッセージ等、サービス概要をご覧の上で、お気軽にご連絡ください。

getabakosensei@gmail.com