Unreal Engine 4で極めるゲーム開発本を、新しいバージョンでトライするためのTips集

<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/4862462553/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4862462553&linkCode=as2&tag=shibukawayosh-22">Unreal Engine 4で極めるゲーム開発</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=shibukawayosh-22&l=as2&o=9&a=4862462553" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />はとても良い本です。Unreal Engine 4の使い方だけではなく、幸せなゲーム開発のワークフローなどが学べます。本書で扱っているエンジンのバージョンは4.7ですが、4.9で試したところ、本の通りにはいかなかったこととかもあったので、4.9でUE4極本を読み進めるための差分について紹介していきます。25章ぐらいからは4.10で実行しています。

**12/26追記**

[しばらく他の活動で1ヶ月ぐらい間が空いてしまいましたが](http://qiita.com/shibukawa/items/cd8d122dfeb41e1608d1)書籍の最後まで行きました。29章は4.7と4.10で差分はありませんでした。引き続きPDFの方も進めていきます。

<iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&nou=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=shibukawayosh-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4862462553" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

8.3.1 ブラシをブロッキングボリュームに変換する
==================================================

ブロッキングボリュームに変換すると、見えなくなると説明にありますが、4.8と4.9、4.10では表示されちゃいます。[これはバグです(報告済み)](https://answers.unrealengine.com/questions/320174/converting-bsps-to-blocking-volumes-needs-geometry.html)。

BuildメニューのBuild Geometryを手動で実行するか(湊さん情報)、他のBSPの要素を置くかすると消えます。

16.2.2 タイムラインの値を活用する
=======================================

MakeRotノードがMakeRotatorノードに入れ替わっています。入力ピンの名前が、以前は``Pitch``, ``Yaw``, ``Roll``の順序だったのが、``X (Roll)``, ``Y (Pitch)``, ``Z (Yaw)``と変わっています。それによって、本で使っているYawが真ん中から下に移動になっています。

19.4.3 スプリントのリスクを完成させる
=======================================

``Set Timer``と、``Set Timer Delegate``が、それぞれ、``Set Timer By Name``と、``Set Timer By Event``に変わっています。おそらく、ノードの挙動としては変わっておらず名前だけです。書籍で使われているノードに対応するのは``By Name``の方です。

``By Event``の方は、名前をタイプしなくて済むため、なるべくならこちらを使ったほうがミスが減る気がします。実際に呼ばれるカスタムイベントとの関係が明確ですし。Blueprintはおおむねごきげんな気分でコードを書いていけるんですが、ちょっと困る点というか、ツールの改善を期待したいところが１つあります。関数名やパラメータ名をテキストで入力させる箇所で、タイプミスなどがあっても、それが検知できません。たしかこのBy Nameもそうですし、僕が他にハマったのが、Blackboardのパラメータ名と、マテリアルインスタンスのパラメータ名です。改善を期待したいとはいいつつ、待つだけでは解決に近づかないので、「なるべく安全な方を使う(文字を入力させる方もあれば、そちらは避ける)」のがよいと思います。

21.3.6 トレースヒット情報を活用する
======================================

スクリーンショットのBPは23.4.3でサービスに変えたあとのものですが、実行終了後にどうもエラーが出てしまいます。実行時には問題はなく。実際にユーザのポーンを追いかける動作も特に問題なく動いているように見えるのですが・・・ちょっと直し方分からなかったのでどなたかわかる方がいれば教えて下さい。Break Hit ResultからReturn Nodeに伸びる水色の線(水平の方)がNone(何もない)状態だ、という感じでしょうか？

<img width="824" alt="スクリーンショット (15).png" src="https://qiita-image-store.s3.amazonaws.com/0/6105/18c080f3-94bb-7974-e5b5-5b543b58215e.png">

25.4.2 ポストプロセスマテリアルを自作する
=============================================

P471のBlendablesの場所ですが、Miscではなくて、Post Process Volumeのセクションに移動したようです。

<img width="255" alt="スクリーンショット (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/6105/c6ee5f7f-9b13-38ca-67a9-cbebd6073764.png">

25.4.3 ミニチュア風ポストプロセスマテリアルを仕上げる
=========================================================

4.9以降から、 [SceneTexture: SceneColorがポストプロセスマテリアルから使用できなくなりました](https://answers.unrealengine.com/questions/308696/scenetexture-scenecolor-not-working-anymore.html)。ざっとななめ読みしたところ、エフェクトをかける前のテクスチャをまるまる抱えておかないといけないのはパフォーマンス上よろしくないので、パフォーマンス改善を優先したと。将来、このような使い方が再びできるようにするから、と締めくくられています。

現時点で何が問題かというとPostProcessVolumeのポストプロセス前後の絵を2つを同時に利用した絵作りができないという点です。ミニチュア風シェーダーはガウシアンフィルタ前の画像と後の画像を中心部だけピントが合うように混ぜて使っていたので4.9では使えません。対策としてはPostProcessVolumeでやっていた処理も、自前でポストプロセスマテリアルの中でしてあげる必要があります。組み込みのポストプロセスは使えないので、GlobalPostProcessVolumeのPost Process > Depth of Fieldの被写界深度フィルタをオフします。

いろいろアルゴリズムを調べていたのですが、こちらの[selflashさんのツイートで自前で実装された](https://twitter.com/selflash/status/593663977332219904)とのことでしたので、そこで言及されていた[openFrameworksのシェーダーの情報](http://www.openframeworks.cc/tutorials/graphics/shaders.html)を元に自前実装に挑戦してみました。

できあがったのがこれ。BlurXというのは、パレットのCustomノードを持ってきたものです。出力にCMOT float3を選び、以下のように入力を3つ設定します。

* BlurAmount(ブラー量 0-10の数値で、今回は1次元固定値の3に接続)
* UV(2次元ベクトルで、TextureCoordinationノードを接続)
* Tex(SceneTexture: PostProcessInput0を接続)

<img width="597" alt="スクリーンショット (2).png" src="https://qiita-image-store.s3.amazonaws.com/0/6105/9f531930-49b7-b199-0768-813dc4ed44a6.png">

Texはプログラムからは使わないのですが、これを繋いでおくと、SceneTextureLookupなどの関数が使えるようになるよと[ここ](https://forums.unrealengine.com/showthread.php?57646-Radial-Blur-PostProcess-Material)に書かれていたのでつないでいます。Customノードのシェーダーコードは以下のとおりです。

```glsl
float3 res = 0;
int TexIndex = 14;
float ScreenMult = GetPostProcessInputSize(0).zw.x;

res += 1.0 * SceneTextureLookup(UV + float2(ScreenMult * BlurAmount * -4.0, 0.0), TexIndex, true);
res += 2.0 * SceneTextureLookup(UV + float2(ScreenMult * BlurAmount * -3.0, 0.0), TexIndex, true);
res += 3.0 * SceneTextureLookup(UV + float2(ScreenMult * BlurAmount * -3.0, 0.0), TexIndex, true);
res += 4.0 * SceneTextureLookup(UV + float2(ScreenMult * BlurAmount * -1.0, 0.0), TexIndex, true);

res += 5.0 * SceneTextureLookup(UV + float2(ScreenMult * BlurAmount, 0.0), TexIndex, true);

res += 4.0 * SceneTextureLookup(UV + float2(ScreenMult * BlurAmount * 1.0, 0.0), TexIndex, true);
res += 3.0 * SceneTextureLookup(UV + float2(ScreenMult * BlurAmount * 3.0, 0.0), TexIndex, true);
res += 2.0 * SceneTextureLookup(UV + float2(ScreenMult * BlurAmount * 3.0, 0.0), TexIndex, true);
res += 1.0 * SceneTextureLookup(UV + float2(ScreenMult * BlurAmount * 4.0, 0.0), TexIndex, true);

res /= 25.0;

return float4(res, 1);
```

結果は以下のとおり。openFrameworksの説明だと、X方向とY方向で2ステップでブラーをかけている(1パスでやろうとすると、9x9で81点サンプリングが必要だけど、2パスにわければ18点のサンプリングで済む)のですが、2ステップに分ける方法が分からなかったので、X方向しかやってません。うーむ。UE4のブラーは綺麗すぎるけど一体何点サンプリングしているんだ・・・ソース覗いてみたけどパラメトリックなシェーダーでDoF系処理をまとめてやってそうな雰囲気で読み解くのは大変そうでしたので、そっちからのコピペは諦めました。

![スクリーンショット (4).png](https://qiita-image-store.s3.amazonaws.com/0/6105/63d26fa6-5c21-0952-aedd-ab3aab4065a8.png)

あとは、書籍のSceneColorをPostProcessInput0に、PostProcessInput0をガウシアンブラーの出力に読み替えてあげれば、書籍で説明されているような、周辺がボケてなおかつ暗い雰囲気が出せます。

<img width="1095" alt="スクリーンショット (7).png" src="https://qiita-image-store.s3.amazonaws.com/0/6105/5988ddd8-3517-256b-7ccc-a66ff68b1bb9.png">

結果はこんな感じになりました。

![スクリーンショット (8).png](https://qiita-image-store.s3.amazonaws.com/0/6105/0020cf46-5ae7-8a6d-c7aa-9c6e3f1b3558.png)

ちなみに、単純にポストプロセス複数回実行であれば、blendablesをどんどん並べていけば可能だそうです(selflashさん情報)。縦方向のポストプロセス処理があればそれと並べれば解決ですが、今回は、すべてのエフェクトがかかる前の画像との合成が必要だったので、一工夫必要な気がします。周りを暗くする処理は１パス目ではやらないで、２パス目で縦のサンプリングと周りを暗くする処理・・・とかですかね？

27.5.1 マップに配置する
=========================================================

操作は変わってないのですが、入力していると、本とは違って、ActivatedEmitterとDeactivateの間に、変換のノードが自動で作成されます。

<img width="789" alt="スクリーンショット (13).png" src="https://qiita-image-store.s3.amazonaws.com/0/6105/cf7de90e-05f1-04fc-283a-9cdb236d0df1.png">

まとめと次回予告
================

これだけの規模のツールで、バージョン3個上がった割には変更もあまり多くなく、変わった点もまあ合理的で理解できるものが多いので、今のところ本の価値は変わらずな気がします。前職で某CADがバージョンアップでAPIがなくなっててんやわんやしたのと比べると至って平和です。[UNREAL FEST 2015の鉄拳7のお話](http://www.4gamer.net/games/210/G021013/20151026058/)だと、4.1から4.4へのアップデートは大変だったとのことですが、リリースノートを見ると最近はどちらかというとバグフィックスの方が多いのかな、という印象です。とは言え、↑の変更についてリリースノートを追いかけたけど載ってなかったりしたので、コミュニティベースで知見を共有したりするのは大事かな、と思いました。

明日は、pafuhana1213さんの「購入したアセットのレビュー書きます！」と、katze_7514さんの「入力デバイスを使えるようにするプラグインの仕組みとか、そんな話題」です。