チャムコード

チャーさんのUnityゲームラボです。Unityでゲーム制作する時に使うコードやノウハウをメインに発信しています。Unityでゲーム制作したいと思っているなら読んでください。

グラフィック関連

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

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

うも、チャーさんです。

あなたは、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でパーティクルを光らせたい、 そう思っていませんか?   この記事では、Unityでパーティクルを光らせる 方法についてお話ししています。なので、 …

[Unityエフェクト]炎の作り方をステップバイステップで説明

どうも、チャーさんです。 あなたは、Unityで炎のエフェクトを作りたい。。! そう思っていませんか?   炎ってかっこいいし、登場させたいですよね。 でもどうやってUnityで作ったらいい …

Unityでの魔法陣の作り方(簡単な方法を紹介)

どうも、チャーさんです。 あなたはUnityで魔法陣を作りたい、呪文詠唱とか、 なんか魔法とか、そういう感じで「魔法陣を使いたい、登場させたい」   そう思っていますか?でしたらあなたの望み …

no image

unityで地形を作る方法「初心者でもできるように丁寧に説明してます」

どうも、チャーさんです。   あなたはunityでいい感じの地形を作りたい。 でも、やり方がわからない。と悩んでいませんか?   この記事では、unityで地形を作る方法を、 ステ …

Unityでアニメーションを作成する方法(初心者でも簡単にできる)

どうも、チャーさんです。 あなたはUnityでアニメーションを作成したいですか? であればこの記事を読んでください。   そうすると、あなたはUnityでアニメーションを作成できる ようにな …

no image

blenderで作ったモデルをunityにインポートする方法「簡単です」

どうも、チャーさんです。   あなたはblenderで作ったものを、 unityで表示(インポート)したいと、 思っていませんか?   この記事では、あなたが作ったblenderの …

最新記事

チャーさん

Unityに関する記事を書いてます。

 

[簡単な経歴]

 

2018年-プログラムを始めUnityの存在を知りハマる。

2019年-エンジニアとして仕事開始(web系)

2021年-UnityでVR開発等にも手を出し始める。

現在-エンジニアとして活動しながらUnityも続行中。

 

youtubeでは、Unityに関する動画をあげてるので、

あなたのUnityスキルアップにどうぞ。