みつまめ杏仁

アンリアルエンジン(UE4)でGUIを作るためにゴニョゴニョしてます。UIデザイナーの皆様の助けになれば幸いです。

オブジェクトをグリッド状に並べる

 毎日の暑さ辛いですね。近所で稲の葉先が黄色くなってる畑をいくつか見かけました。この熱エネルギーをやる気に変換するマシンか何かあれば、と思ったけど、やる気に溢れすぎて炎天下に飛び出したり、汗だくで何やら叫びつつ暴れたりする人のイメージが沸いてしまい、危険なマシンになりそうだったのでそのような妄想は忘れることにします。だれか早くクーラードリンク開発してください。

 さてさて、ぷちコンのお題が発表されましたね。今回は10回目ということで「ぷち」だそうです。私も何か作ってみようかと思い立ったので、いろいろ試していくことにしました。形になるかわかりませんが。

 

 

何となくタイルを並べてみることにしました。

プロジェクトのテンプレはThirdPersonです。

f:id:hiyokosabrey:20180812110240j:plain

いきなり動き回れて、カメラぐりぐり回せるので楽しいセットですよね。

このフロアをスッキリ片づけます。階段だけ残しました。

f:id:hiyokosabrey:20180812112657j:plain

最初から置かれているメッシュたちは、Mobility設定が、Static になっているので、ワールドから削除しても、床に影が焼き付いています。

f:id:hiyokosabrey:20180812111137p:plain

Buildツールの Build Lighting Only を実行すると、影が再計算されます。

f:id:hiyokosabrey:20180812112938j:plain

で、床のサイズと階段の場所とスタート位置を調整。

f:id:hiyokosabrey:20180812110708j:plain

レイマンの載ってる床はCubeを平たくして階段の下に置いています。そのままだと馴染まないので、階段と同じマテリアルをアサイン。

 

 

この床にブロックを並べてみようかと。

並べるブロックは生のStaticMesh だけだと面白くない(いろいろ遊びを仕込みたい)ので、Blueprint Actorにします。新しく Actorクラスのブループリントを作成。

f:id:hiyokosabrey:20180812114352j:plain

空っぽなので、AddComponent で StaticMesh を追加。

DetailタブにあるStaticMeshから、適当なキューブメッシュをセット。

f:id:hiyokosabrey:20180812114817j:plain

Viewportで確認しながら、サイズを調整したらひとまず完成。

f:id:hiyokosabrey:20180812114918j:plain

 

これを並べるためのブループリントを用意していきます。

新しく、Actorクラスのブループリントを作成。

並べるための関数を作ります。↓前半部分。

f:id:hiyokosabrey:20180812120535p:plain

引数(Inputピン)は Int型と、Float型の2つ。とりあえず 正方形に並べるので1辺ぶんの数と、配置間隔。

開始位置でいろいろ計算してるのは、センタリングするためです。

ForLoopで機械的に並べていくので、最初の起点となる座標さえ判ればあとは繰り返し処理だけでOKです。

例えば、ヨコに5個並ぶ場合、

f:id:hiyokosabrey:20180812135932p:plain

並べたい数 5 から 1つ減らした数が、オブジェクト間のスキマの数。これにスキマの距離を掛けると、端から端までの全体の距離になります。これの半分の距離を、中心から引いた場所が 起点 になるのです。

これでどんな数でもセンタリングできます。

 

 グリッド状に並べるのですが、引数は1辺の最大数を受け取って処理します。例えば5という数字を受け取ったら、 5x5 = 25 です。 UE4の ForLoopは LastIndexで指定した数字までカウントして処理します。0ゼロスタートだと、0~24 が正解。

f:id:hiyokosabrey:20180812141846p:plain

f:id:hiyokosabrey:20180812142022p:plain

コードで書くと

for ( int i = 0; i <= 24; i++ ) {   }

です。

 

for ( int i = 0; i < 25; i++ ) {   }

 だったらいいのに・・・

 

どうせ First Index のピンが空いてるんだから、 そこを 1 始まりにすればいいじゃん。

と思われるかもしれません。確かに回数的には問題ありません。(恐らくゼロ始まりに馴染みに無いノンプログラマ向けの仕様だと思います。Epicの優しさ?)

でも、このゼロ始まりの方が、この後のループ処理に便利なのです。

 

後半部分はこんな感じ。

f:id:hiyokosabrey:20180812143237p:plain

まずポジションの計算をするので、1 始まりだと、ズレたところから始まってしまうのです。

 

右端の Spawn Actor From Classノードのは、先に用意してあった、キューブの入ったブループリントをセットしています。

 

 

関数に並べる仕事をさせてみる。

関数にパラメータを渡して呼び出すと並べてくれます。

f:id:hiyokosabrey:20180812143649p:plain

Event Begin Play につないだら、コンパイルして保存。

ワールドにこのブループリントをドラッグ&ドロップします。

f:id:hiyokosabrey:20180812144305j:plain

再生してみます。

f:id:hiyokosabrey:20180812143954j:plain

成功です。

ファンクションキーの F8 を押して、それぞれのオブジェクトのポジションを確認してみると計算が間違ってないかどうか確認できます。

 

 

配置が完成したみたいだけど。

問題なく並ぶことが分かったので、もう少し数を増やして、あと上面にもう一枚板ポリを載せたりしてできたのがこれ。

f:id:hiyokosabrey:20180812144848j:plain

9x9=81個 並んでます。

上手に「ぷ」→「ち」の順に繰り返し踏んでいくアクションゲームに、なったらいいな。

f:id:hiyokosabrey:20180812145710j:plain

 

というわけで、今回はこれまで。

ではでは

ステキなセンタリングライフを!