unity

unityでのダンジョンの簡単な作り方(コードコピペで作れます)

投稿日:2020年4月3日 更新日:

Pocket

うも、チャーさんです。

 

あなたは、unityでダンジョンを作りたいと

思っていませんか?

 

この記事ではunityでのダンジョンの作り方を

説明してまして、本記事を読めば

あなたはダンジョンを作れます。

 

 

本記事の内容をやると下記のような

ダンジョンができます。(地形も自由にいじれます)

unity ダンジョン

 

 

またスクリプトも極力シンプルで短め

わかりやすいコードなので、

 

頭を悩ませずにunityでダンジョンを作りたい

と思ってたらこのまま読んでみてください。

 

*動画もとったので、動画派の人はどうぞ。

スポンサードサーチ

unityでのダンジョンの作り方

 

ということで、本題に入ります。

unityでダンジョンを

作るには以下があればできます。

 

壁にするCubeのプレハブ

スクリプト

 二次元配列(これが実際のダンジョンの地形になります)

 forループとif文を組みわせたInstantiate(これでマップを生成します)

 

大きく分けてこれらでダンジョン作れます。

 

 

でダンジョンを作成するために

使うコードは以下です。

 

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

public class wallMaker : MonoBehaviour {

    public GameObject wall; //壁にするプレハブ取得用の変数

    // Use this for initialization
    void Start () {
        int[,] map = {
            {1,1,1,1,1,1,1,1,1},
            {1,0,0,0,0,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,1,1,0,1,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,0,1,1,1,0,0,0,1},
            {1,0,1,1,1,0,0,0,1},
            {1,1,1,1,1,1,1,1,1}
        }; //これがダンジョンの地形になる二次元配列 1が壁 0が道です。
    

        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if(map[i,j]== 1){
                    Instantiate (wall, new Vector3 (j, 0, i), Quaternion.identity);
                }
            }
        } //このループで二次元配列に基づいて壁を作成

            
    }
    
}

 

 

これでダンジョンができます。

 

 

ダンジョン作成スクリプトの説明

 

ではここからはコードの説明です。

 

まずは

public GameObject wall; //壁にするプレハブ取得用の変数

ですが、

 

for文でinstantiateする際に、

プレハブ化したcubeを使います(これが壁になる)

なので変数宣言して、プレハブ(cube)を取得。

 

 

次に二次元配列の

void Start () {
        int[,] map = {
            {1,1,1,1,1,1,1,1,1},
            {1,0,0,0,0,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,1,1,0,1,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,0,1,1,1,0,0,0,1},
            {1,0,1,1,1,0,0,0,1},
            {1,1,1,1,1,1,1,1,1}
        }; //これがダンジョンの地形になる二次元配列 1が壁 0が道です。

 

ですが、これがダンジョンの地形になります。

 

 

後でも説明しますが、

 

for文ループでInstantiateする際に、

1なら壁(cube)を生成し、0ならcubeを生成しない

というのをやります。

 

こうすることで、上記の配列の地形のダンジョンを

作成することができます。

 

 

で次に、

     for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if(map[i,j]== 1){
                    Instantiate (wall, new Vector3 (j, 0, i), Quaternion.identity);
                }
            }
        } //このループで二次元配列に基づいて壁を作成

 

ですが、for文でループしながら

cubeを作成させダンジョンを作ります。

 

これはfor文の入れ子ですが、

入れ子にしてやることで、

x軸とz軸と座標を変えながらcube壁をinstantiateできます。

 

 

例えば、

外側のループfor (int i = 0; i < 9; i++)1週目、

かつ中のループfor (int j = 0; j < 9; j++)1週目の時、

 

Instantiate (wall, new Vector3 (j, 0, i), Quaternion.identity);

とコードを書いておくと、

 

x軸が0(変数j)

z軸が0(変数i)で座標でいうと(0,0,0)の位置にcube壁が

作成されるというわけです。

 

 

で中のループ2周目では変数 j がj++で1になり、

変数 i が0(外側のループは中のループが

最後にいくまで1週目なので)のままで、

 

座標(1,0,0)の位置にcubeが作成されるわけです。

 

 

そして中のループが最後までいったら、

次は外のループの2週目になりまして、

 

変数 i が1になり、z軸が1の列で

(0,0,1) (1,0,1) (2,0,1)…..のように座標を変えて

cubeを順々に生成してくれることになります。

 

 

なので上記のコード書いとけば、

ループで順々にcube壁を生成してくれるので、

ダンジョンを作ってってくれるわけですね。

 

で、ここでもう一つミソなのが、

if(map[i,j]== 1)でして、

これによって二次元配列の配列の中の数字が、

 

1ならcube壁を生成、0なら壁を作らない

になります。

 

 

例えば

今回の例でいうと二次元配列で

int[,] map = {
            {1,1,1,1,1,1,1,1,1},
            {1,0,0,0,0,0,1,0,1},

・・・・・・・

がありますが、

 

ループで外側のループが1週目なら変数 i が

0、内側のループが1週目の時、変数 j が0になり、

配列アクセスの際のインデックス番号が0,0になります。

 

(map[0,0]にアクセスしている)

 

 

でこれは上記の二次元配列でいうと、

一番左上の部分になりまして数字が1ですよね。

 

ということでcube壁がinstantiateされます。

 

 

で次に内側のループが2週目になりインデックス番号が

[0,1]になり左上から2番目の数字にアクセスする

 

そしてそれがどんどん添え字の数字がループで

更新され、配列内の1か0を参照しながら、

 

cube壁を生成し意図した地形のダンジョンを

生成してくれるというわけです。

 

 

この二次元配列のアクセスの仕方やインデックス番号

に関して知らない場合は上記説明でピンと

来ないと思うので、

 

c#の二次元配列の取得あたりでググって、

知識を得ると理解しやすいです。

 

 

という感じでコードの説明は以上ですが、

上記の仕組みでダンジョンを生成できます。

 

 

ダンジョン作成までの手順

 

でここからは手順の説明です。

 

プレハブを作ろう

 

まずは壁になるプレハブが必要なので、

cubeを作成しプレハブ化しましょう。

 

その際cubeに色をつけとくと、見やすいです。

 

 

プレハブ化するには、projectのcreateから

prefabをクリックしたらprefabができます。

 

あとはそこにhierarcyにあるcubeを

ドラッグアンドドロップすればプレハブ化されます。

 

プレハブ化したらHierarchyにある

cubeは消してもokです。

 

 

スクリプトをつけましょう

 

で次に、どんなゲームオブジェクトにでもいいのですが、

スクリプトをadd componentしましょう。

 

思いつかなければhierarchyからcreate >

create empty でokです。

でそのオブジェクトにスクリプトつけましょう。

 

名前は上記のコードを丸コピする場合は、

wallMakerとすれば良いです。

 

 

でスクリプトつけてスクリプト内に、

以下のコードを貼りましょう。

 

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

public class wallMaker : MonoBehaviour {

    public GameObject wall;

    // Use this for initialization
    void Start () {
        int[,] map = {
            {1,1,1,1,1,1,1,1,1},
            {1,0,0,0,0,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,1,1,0,1,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,0,1,1,1,0,0,0,1},
            {1,0,1,1,1,0,0,0,1},
            {1,1,1,1,1,1,1,1,1}
        };

        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if(map[i,j]== 1){
                    Instantiate (wall, new Vector3 (j, 0, i), Quaternion.identity);
                }
            }
        }

            
    }
    
 
}

 

ダンジョンの地形を変えたい場合

 

で、ここで補足ですが、あなたがダンジョンの

地形を好きに変えたい場合があるでしょう。

 

なので補足しときまして、

ダンジョンの地形をいじりたい場合は、

以下の二次元配列の0と1の数字を好きに変えてください。

 

       int[,] map = {
            {1,1,1,1,1,1,1,1,1},
            {1,0,0,0,0,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,1,1,0,1,0,1,0,1},
            {1,0,0,0,1,0,1,0,1},
            {1,0,1,1,1,0,0,0,1},
            {1,0,1,1,1,0,0,0,1},
            {1,1,1,1,1,1,1,1,1}
        };

 

というのも1の部分は壁になり、0の部分は道になります。

 

また外周は全部壁にする必要があるので外側の

1は変えずに、中の部分だけ

0と1をあなたの好きなように変えれば地形を変えれます。

 

プレハブをドラッグアンドドロップ

 

で、あとは、コードを保存・実行して、

インスペクター画面に戻ってください。

 

 

するとさっき作ったプレハブを格納する

部分が表示されるので、

 

assetにあるcubeの壁プレハブを、

スクリプトを貼ったオブジェクトの

インスペクター欄の、

 

スクリプトコンポーネントの部分に表示された、

変数名wallのとこにドラッグアンドドロップしましょう。

 

 

ここまでやれば準備okです。

 

あとは上の再生ボタンをクリックして、

実行しましょう。

 

そしてダンジョンが生成されれば成功です。

 

 

スポンサードサーチ

まとめ

 

ということでまとめに入りますが、

unityでダンジョンを作成するには、

 

壁にするCubeのプレハブ

スクリプト内には

 二次元配列(これが実際のダンジョンの地形になります)

 forループとif文組み合わせたInstantiate(これでマップを生成します)

 

で作成可能です。

 

 

今回のダンジョン作成法では、

だいぶコードをシンプル少なめにしながら、

わかりやすくダンジョンを作成する方法を考えたので、

 

ダンジョン作ってみたいって場合は、

本記事を参考にしてやってみてください。

 

 

あなたのダンジョン作成がスムーズに

いけば幸いです。

 

ということで読んでもらってありがとうございました。

でわ。

 

チャーさん

-unity

==========

Unity用の3Dモデルを探してる方、欲しい方ご注目!

自作のUnity用3Dモデルをリーズナブルな価格で販売してますので、以下のリンクより一度ご覧ください。

Unity用3Dモデルを見てみる

==========


スポンサードサーチ

関連記事

no image

unityでターン制のゲームを作るにはコレを使いましょう

どうも、チャーさんです。 あなたはunityでターン制ゲームを作りたい そう思っていませんか?   この記事ではunityでターン制のゲームを 作る方法を書いています。   なので …

no image

unityで攻撃に当たり判定をつける方法

どうも、チャーさんです。 あなたはunityで攻撃に当たり判定をつけたいですか?   この記事では、当たり判定をつける 方法を書いてるので、読めば当たり判定をつけれます。   とい …

no image

unityでオブジェクトを移動させたい人は読んでください。

どうも、チャーさんです。   あなたはunityでオブジェクトや、 プレイヤーなど自由自在に移動させたい、 そう思っていませんか?     キーボードの上下左右の矢印ボタ …

no image

unityでカメラを追従させる簡単なコードと方法の説明をする記事

  どうも、チャーさんです。   あなたはunityでカメラの追従をさせたい、 こう思ってませんか?   この記事ではオブジェクトをカメラで追従させる、 (カメラが追いか …

no image

unityで敵に近づくと追いかけてくるコードとコードの解説記事

どうも、チャーさんです。   あなたはunityで敵に近づくと、 プレイヤーを追いかけてくるという機能を つけたいと思っていませんか?   この記事ではそれを実現するコードと方法や …

no image

unityで敵を移動させる方法(詳細にわかりやすく説明します)

どうも、チャーさんです。   あなたはunityで敵を移動させたい、 そう思っていませんか?   コライダーなどでもできるが、他の方法が ないかと探してませんか?   & …

no image

unityでボタンクリックで他のオブジェクトの色を変更するスクリプト

どうも大石です。   あなたはunityでボタンをクリックしたら、 他のオブジェクトの色を変更するという スクリプトを書きたいですか?     この記事を読めば、あなたは …

no image

unityで弾の発射位置をコントロールする方法

どうも、大石です。 あなたはunityで弾の発射位置を自由に コントロールしたいですか?   この記事を読めばあなたの好きな位置から 弾を発射できるようになりますよ。   スポンサ …

no image

unity上でblender作成モデルが透ける時の解決法

どうも、チャーさんです。   あなたはunityにblenderで作ったモデルを 持ってきたものの、面が透ける現象が起こって 困っていませんか?     この記事は、透け …

no image

Unityでオブジェクトに重力を1分以内につける方法

  どうも、チャーさん(@chaa___san)です。   あなたはUnityでオブジェクトに重力をつけたいですか?   この記事ではUnityでオブジェクトに、 重力を …

no image

unityで敵を索敵する方法

どうも、大石です。   あなたはunityでプレイヤーが敵を索敵する 機能をつけたいですか?   この記事を読めば、敵を索敵する 機能を簡単に作れますよ。   ということ …

no image

unityでコンポーネントを取得する方法を詳しく解説

どうも、チャーさんです。 あなたはunityでコンポーネントを取得する方法を 探していますか?   この記事ではコンポーネントを取得する方法、 その際の変数宣言の書き方や、 コンポーネント名 …

no image

unityアセットの使い方を初心者でもわかるように説明。

  どうも、チャーさんです。   あなたはunityのアセットの使い方が、 わからず困ってませんか?   この記事ではunityのアセットの使い方を、 1から説明してます …

no image

unityで矢印キーでオブジェクトを移動させるには(3d)

どうも、チャーさんです。 あなたはunityで矢印キーで3dオブジェクトを 移動させたいですか?   この記事では矢印キーによる3dオブジェクトの 移動を実現する方法を書いてるので、 読めば …

no image

unityで動く床にのるとオブジェクトが滑る場合の解決法

どうも、大石です。   unityで動く床を作ったのに オブジェクトが上に乗ると滑って 一緒に付いて行かずに落ちる、、   みたいなことで悩んでますか?     …

最新記事

チャーさん

プログラミング・筋トレ・unity系の記事などを書いてます。

大学卒業後→開業→個人事業主7年目ぐらいです。webサイト制作したり、unityでゲーム開発しております。

youtubeもやってまして、主にプログラミング動画とかunity系の動画をあげてるので見てください。