どうも、チャーさんです。
あなたは、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(これでマップを生成します)
で作成可能です。
今回のダンジョン作成法では、
だいぶコードをシンプル少なめにしながら、
わかりやすくダンジョンを作成する方法を考えたので、
ダンジョン作ってみたいって場合は、
本記事を参考にしてやってみてください。
あなたのダンジョン作成がスムーズに
いけば幸いです。
ということで読んでもらってありがとうございました。
でわ。
チャーさん