読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

二次元配列の作り方

ブループリント アルゴリズム

妹「配列って、タンスみたいに入れるとこが並んでるイメージでしょ? あれってたしか縦と横それぞれに並んでるようなのもあった気がするんだけど、作り方がわからないんだけど」

「二次元配列ね。そういう物もあって、C++なら作れると思うけど、ブループリントだと作れない」

妹「配列は作れるのにそれは出来ないんだ……」

「配列が作れるから出来るってものじゃないよ。ほとんどのプログラム言語で配列は作れるけど、二次元配列が作れるやつとなるとちょっと減るし、三次元以上も出来るやつとなるとだいぶ少なくなる」

妹「三次元だと縦横のタンスが奥にも並んでるのかな? でも三次元以上ってどういうこと? 四次元空間?」

「そこはまあ、縦横に並んだタンスのある部屋がいくつもあると考えればいいし、五次元だったらそういう家が何軒があると考えればいい。だいたいの用事は三次元もあれば足りるものなんだけど。普通の配列は一次元配列とも言う」

妹「そんなにたくさんの次元はいらないけど、二次元のぐらいは作りたいなあ」

「二次元配列用のブループリントは無いけど、それと同じことなら出来るよ」

妹「出来るんじゃないか!」

「いやまあ二次元配列が作れない場合の対処法というか、兄弟それぞれにタンスを買えない時は、何段目から何段目が兄の分とか決めとけばいいんだよ。例えば縦に10個の引き出しがあるタンスを、5つ買って横に並べるんじゃなく、50個の引き出しがある大きなタンスを買ってくる。そしてそれを上から10個ずつ、区切って使えば入る量は同じ」

妹「それだと上の方の段を使うことになった人が怒ると思うけど……だけど区切るためのノードみたいなのが要るんじゃないの?」

「そういうのは要らない。配列から読み込んだり書き込んだりする時には、必ず何番目かを数字で指定するところがあるから、その時に計算する。何個目のタンスかをYで、何段目の引き出しかをXで表すと」

Y * タンス1つ当たりの引き出しの数 + X

「という式で、狙った引き出しを指定することが出来る。YとXは逆にしてもいいけど、その場合掛けるのが引き出しの数じゃなくタンスの数になる」

妹「なんだか数学めいててむずかしいぞ」

「そんなにむずかしい話ではないんだけどね。引き出し10個ごと分けたとしたら、最初の人は0段目から、次の人は10段目、その次の人は20段目からってやるだけだから。0段目の引き出しというのもおかしな話だけど」

妹「これってXの数が多過ぎたら、次の人の場所にはみ出したりしない?」

「する。マイナスになっても駄目。Yも予定してる範囲から外れるとおかしなことになる。エラーメッセージとしては配列の範囲外ということだけでXとYとどっちが変なのかわからないし、隣の分にはみ出したぐらいだとエラーメッセージも出ない。だからそのへんは気をつけて計算したり、チェックしたりはしないと駄目」

妹「もしブループリントが対応してたらそういうのしなくていいの?」

「それは対応の仕方にもよるけど、自前でやるよりは楽だろうね。そもそも楽にならないんだったら対応する意味もないし。二次元配列がたくさん必要なら管理用のクラスを作ると多少わかりやすくはなる」

妹「もっとラクチンな方法はないの?」

「ラクチンかはわからないけど、配列を含んだ構造体を作って、その構造体の配列を作るという方法もある。この方法の利点はタンス毎の大きさを自由に変えられること。あとはみ出すということもない」

妹「それ良さそうじゃん」

「欠点は配列から構造体を取り出して、その中の配列を取り出すという手順だから、ノードが複雑になりがち。ただ計算で引き出しの位置を調べるのも複雑ではあるから、どっちも大して変わらないような気はするけど」

妹「結局どっちの方法がいいの?」

「とりあえずやり方がわかる方で。あとは好みで好きな方法選んでいいし、途中で変えてもいい。ただセーブデータに使う時はどっちで行くかはっきり決めないと駄目。セーブした後で方法を変えるのはかなり面倒から。その都度データ消せば問題はないけど」

妹「まだセーブするとこまで到達していないから大丈夫。そもそも二次元配列とか使うかどうかもわからないし。興味本位で聞いただけだから」