壁生成のコンストラクションスクリプトを考えてみる

#はじめに
今回が初投稿になります。自分が苦労したので書こうと思い至ったわけでございます。
至らない点が多々あると思いますがご指導、ご指摘等いただけると有難いですのでどうかよろしくお願いいたします。
また、今回はUE4で極めるゲーム開発(https://www.borndigital.co.jp/book/6359.html#book_support) Appendix Bで学習するコンストラクションを自分で考えるものなので"UE4で極めるゲーム開発"を使用し学習している前提で書いていきます。


#壁生成のコンストラクションを考えてみる
上記の通り、"UE4で極めるゲーム開発"に床生成のコンストラクションのみ書かれており、
壁とスロープのコンストラクションは宿題とされていたので考えてみる。

**目標**
・Zファイトを起こさない(最低条件？)
・出っ張る角(外角)は柱を埋め込んでそれっぽくする

##1. とりあえず受け取った縦横の数で並べてみる
一枚はこんな感じ(100x100x20)
<img width="484" alt="WallPivot1.png" src="https://qiita-image-store.s3.amazonaws.com/0/300492/aa7bee32-8d31-210d-a864-e08a5a3b3ca4.png">
うーん、生成開始位置が (0, 0, 0) だと厚みの半分飛び出してしまうのか。
というわけで修正。
![WallPivot2.png](https://qiita-image-store.s3.amazonaws.com/0/300492/f28c5829-3a2b-35e7-518c-faf8afe34d77.png)
さあ、並べよう！！！！
<img width="486" alt="おっふ.png" src="https://qiita-image-store.s3.amazonaws.com/0/300492/8c06baf9-f497-cde9-4f8e-9212ffb3c1ad.png">
おっふ、、、
そうか、コンストラクションのローカル座標で生成しなければいけないのか。

直して並べた↓
![とりあえず並べられた.png](https://qiita-image-store.s3.amazonaws.com/0/300492/c93c5243-73cc-7254-3a69-5c810a4aa9ff.png)
![調整なし.png](https://qiita-image-store.s3.amazonaws.com/0/300492/d1c9c846-4838-0afe-c69e-6984db36cd1f.png)
ForLoop の LastIndex には左、右それぞれオプションで入力された Height, Width を指定してある。
また、縦横それぞれ (Index-1)*100 の位置に配置。このコンストラクションをレベルエディタ上に配置した場所を起点に生成したいのだが、FastIndex を 1 にしてしまったために Index-1 する必要がある。
Local につながる MakeVector の X に入っている -10 は壁のスタティックメッシュの厚みが 20 だからでまたそうする理由はすでに述べたとおり。

さて、壁をすべて配置するか。
##2.チラついて目が、目がぁ！！！！
はい、Zファイト～
![zfight.png](https://qiita-image-store.s3.amazonaws.com/0/300492/a8859f40-b8f2-4e45-3d01-43a613ff6968.png)
まあ分かってましたよね。
とりあえずZファイトを起こさないようにしよう。
ここでは、縦横それぞれ指定された高さ、両端の壁を縮小することにする。

そしてできたブループリントがこれ↓
![縦倍率.png](https://qiita-image-store.s3.amazonaws.com/0/300492/54be7cd8-1857-93f7-56f8-7307ac64dd93.png)
![内角bp.png](https://qiita-image-store.s3.amazonaws.com/0/300492/876b2ab5-4393-ce4b-95c6-73d25474c07f.png)
StartWallPoint は壁を縮小すると起点に向かって左詰めになるのでそれを防ぐためのもの。
そして、こうなる↓
![内角で隙間.png](https://qiita-image-store.s3.amazonaws.com/0/300492/49051414-46b1-ba19-5eaa-4e5668ccc6cb.png)
これでZファイトを起こさない(最低条件？)という目標を達成した。
しかし、引っ込む角(内角)などのもともとZファイトを起こしていないところは隙間が空いてしまっている。これは余計なお世話だ！と言っているに違いない。
そこで左右端が外角か判定するフラグ (LeftOutCorner, RightOutCorner) をオプションに追加する(デフォルトでオン)。これによって両端の幅をZファイトを起こさないように縮小することができるはず。

外角かの判定入れただけ↓
![角調整bp.png](https://qiita-image-store.s3.amazonaws.com/0/300492/63ccda99-9d30-47ab-362e-b4a7c7efb98b.png)
![内角なおした.png](https://qiita-image-store.s3.amazonaws.com/0/300492/5d30572b-7948-c35a-bc77-3f87d995c5f9.png)
↑レベルエディタの画像ではわかりにくいかもしれないが、右側の外角をなす二つの壁はどちらにも遠慮してもらっているので 20x20 の範囲は何もない(ここに柱を埋め込んでそれっぽくする)。
また、トンネル部分の角はUE4(以下略)を参考に柱は置かないのでトンネルの外側の壁を外角じゃないとしてやればいい。そうすることでトンネル内の壁は Height, Width を指定するだけで済むのでちょっと得した気分だ(？)。

##3.最後に柱を埋め込む
あとは柱を埋め込むだけだ。壁同様、一番上の柱の縦は縮小する。
ここではそれぞれの壁の左端に生成することにしよう。
いつ生成するかなのだが、壁の左端なので柱を壁より先に生成するようにしてみた。

完成したのがこれ↓
![完成bp.png](https://qiita-image-store.s3.amazonaws.com/0/300492/5fe8f93e-da18-0eda-eb94-7c1bfba15b9d.png)
![完成.png](https://qiita-image-store.s3.amazonaws.com/0/300492/b52a8a4c-39e2-e84c-9305-cbb7fd465bb2.png)
**完成！！！！**

#おわり
正直に言うと自分のレベルが低すぎてプログラムの効率などは一切考えていない。すべて気分で組んだ。とりあえず今は困ったらオプションを追加していこうと思う。
ここまで読んでくださった方はお気付きだと思うが、ブループリントのコメントが少なくわかりにくかったりする。なのでコメントは重要だから習慣づけなければ。
ここまで読んでいただきありがとうございます。

↓におまけと余談があるけどここでおしまい

#トンネルコンストラクションも作ってみた
![なんとなく.png](https://qiita-image-store.s3.amazonaws.com/0/300492/c4dcaf23-1671-25e0-acd1-0707f6de3ed1.png)
Z の位置を少し上げているのはよくわからないが床がチラついてしまうのでそれを安定させるためである。
![よくわからんけどzファイト.png](https://qiita-image-store.s3.amazonaws.com/0/300492/861a90e0-dcea-dc5d-1af5-08142c70edc4.png)

#余談
この完成形に至るまで3日も使ったのは痛い。その理由としては生成する枚数以外をオプションとする考えに至らなかったからだ。自分にはセンスがないと思った。ただtwitterで見たものの受け売りなのだが、センスがないというのは単に選択肢が少ないだけということが分かるとセンスがないは伸びしろがあると捉えられ楽になる。
ここまで読んでいただけたとしたら物好きだなと思いますが、本当にありがとうございます。何か文句などありましたら教えてください。