妹でもわかるUnrealEngine4

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

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

Blenderでドーナツ作り(1) 肩慣らしと、チートシートの印刷

「ちょっと前に見つけたチュートリアルなんだけどね」

Blender Guru

www.blenderguru.com

Blenderで作ったこのドーナツがすごくいいなあと思ってたんだけど、冷静に考えるとこれチュートリアル動画なんだから、そのとおりにやれば自分でも作れるんじゃないの? って思ったんで、ちょっと作り始めてみた」

妹「なんか英語っぽいけど」

「part3までは日本語の字幕がついてる。たぶん誰か付けてくれたんだと思うけど。part4以降は自動字幕しかない。でもまあ動画だから、同じようにすれば大丈夫かなあと」

妹「たしかにBlenderやった方がいいかなと思うことは多々あるけど、英語はなあ」

「日本語にもよさそうな動画はあったし、そういうのいくつかピックアップはしてるんだけど、とりあえずこのドーナツが作りたいからこれをやる」

妹「そんなにドーナツ好きなんだ」

「別にそんなに好きではないんだけど、絵的になんか惹かれる物があるんだよ。あとは動画の難易度設定が初心者向けだったのもある。インストールした直後の人向け」

youtu.be

youtu.be

youtu.be

f:id:una_unagi:20180531234454p:plain

「とりあえず字幕のある3つ目の動画までをポンポンポンと。予想通りショートカットキーとか完全に忘れてるけど、前に日本語のチュートリアルを2本やってることもあって、だんだん思い出してきた」

rt3dcg.blogspot.com

「操作方法については、今回のチュートリアルのサイトからもダウンロードできるんだけど、これは日本語版がいいかと思っていい感じのやつを探して印刷。ただ左クリックで選択する設定に変えてるから、そこだけは表記が違うんだけど」

f:id:una_unagi:20180531234853p:plain

f:id:una_unagi:20180531234916p:plain

「あとはちょっと困ったのが日本語化の問題。とうぜんチュートリアル動画では英語設定になってる。ボタンの位置が一緒ならわかるだろうと思ってたけど、機能検索みたいな画面で、日本語にしてる時は日本語でしか検索できなくて、ちょっと困ったのでインターフェースも英語に設定した」

f:id:una_unagi:20180531234935p:plain

「マウスカーソルを合わせた時に出るTooltipsは、特に支障がなさそうだからこれだけ日本語にして、あとは英語という設定」

PPCelShaderを使って、とんびやあぶらあげに輪郭線をつける

f:id:una_unagi:20180528223520p:plain

「アセットを入れるだけで使えて、自由に改造してもいいという、セルシェーディング用のポストプロセスマテリアルが公開されたんで、それをとんびのやつに入れてみていた」

github.com

「ダウンロードはGitHubから。日本人のalweiさんが作ってるやつで、説明も日本語になってる」

妹「それはありがたい。でも兄も前にそんなの作ってなかったっけ?」

「それは線だけのやつだったからね。色合いにはあまり興味がなかったからそのままに……このマテリアルは線も塗りも対応してて、かつパラメータで操作できるようになってるから便利」

f:id:una_unagi:20180528223937p:plain
f:id:una_unagi:20180528223952p:plain

「使うには、まずGitHubからダウンロードする。これがサンプルプロジェクトになってるから、開くとアニメ絵にされたグレーマンの群れが確認できる」

f:id:una_unagi:20180528224101p:plain

「このプロジェクトに自分のキャラのFBXとかを入れてみてもいいんだけど、自分のプロジェクトで使う時は、Contentsの中にあるPPCelShaderフォルダだけコピーすればOK」

妹「移行コマンドを使うの?」

「それでもいいけど、他のフォルダのとは関連性がないから、エクスプローラでコピーしても別に問題ない。ただUE4のバージョンが古いプロジェクトにコピーする場合はどうなるかわからないけど。今回はたまたま動作確認用に4.19で開いたとんびのプロジェクトがあったんで、それの中にコピーしてみた」

妹「そういえばダウンロードする時にバージョン設定はしなくてよかったの? SpriteStudioプラグインだとなんかタグをどうこうという」

「それは今のところmasterしかないから。将来的にはわからないけど、これはプラグインじゃなくてアセットだから、そんなにバージョンを気にする必要はないはず」

f:id:una_unagi:20180528230315p:plain

「で、自分のプロジェクトの中にあるポストプロセスボリュームに、ポストプロセスマテリアルを追加する。ボリュームがなかったら追加する。Infinite Extent設定にしておくと、カメラがどこにいっても対応できる」

f:id:una_unagi:20180528230924p:plain

f:id:una_unagi:20180528223118p:plain
適用後

f:id:una_unagi:20180528223131p:plain
適用前

「ポストプロセスマテリアルを入れるだけでこうなる」

f:id:una_unagi:20180528232617p:plain

「とんびと油揚げにも輪郭線がついてる。ブラーがかかっててよく見えないけど……」

妹「色も違うね、影がなくなるのかな?」

「そういうわけじゃなくて、指定した影の色が乗算されてる。ただ初期状態だとグレーで、そうするとどんなに光のないところでも真っ黒にはならない。若干暗くなるだけ。その方が輪郭線が見やすい。このへんの設定も変えられるので、例えば線を緑に、影を赤に設定すると……」

f:id:una_unagi:20180528231316p:plain

妹「気持ち悪!」

「まあこんな具合で色んなとこに影はある。影の色を濃い目にするとか、あと影の出方を調整するとかね」

f:id:una_unagi:20180528231516p:plain

PPI_CelShaderはマテリアルインスタンスになってて、パラメータをすぐに変えられるようになってる。影の出方ならデフォルトは影のあるとことないとこが極端だけど、もう1つもっと緩やかに変化する画像もあるし、自作してもいい」

ForEachLoopによるコピーと参照の問題

「先日ツイッターで見かけた問題なんだけど、ForEachLoopで色々やろうとする時、配列の中身が構造体だと、配列の中身に直接アクセスするんじゃなく、コピーされた物を操作することになる。まだUE4でこうなったことはないけど、他のプログラミング言語で同じようなことがあった」

妹「それの何が問題なの?」

「ForEachLoopで、中身を書き換えたいという時にちょっと困る。コピーされた物を変更しても、配列の中身には反映されない。勝手に書き換えないから安全という言い方もできるんだけど」

妹「でもアクターとかでそういうことやったことあるかも」

「アクターはActorクラスだから。別の変数にSETした場合の動作が、構造とか数字とかとちょっと違う。だから普通に使ってる分にはコピーされた物だと意識しなくてもいい。数字の時もたぶんそんなに気にならない。でも構造体は見た目クラスに似てるから、なんか出来そうで出来ないっていう、もどかしい感じになる」

Can foreach be pass-by-reference? - UE4 AnswerHub

「で、調べてたら英語の方でもこの問題について質問してる人がいた。この人はコピーされた物を編集した後で、Set Array Elmで配列に上書きしてて、これで動くけど、なんかもっといい方法ないの?っていう」

妹「あるの?」

「ForEachLoopはマクロだから、配列から普通にGETするんじゃなく、参照をGETするようなマクロを作ればいいんじゃないかと」

妹「参照……聞いたことがあるような」

imoue.hatenablog.com
imoue.hatenablog.com

「いちおう前にもやったんだけどね。ちゃんと説明しようと思うとむずかしいから、だいたいみんな勘で使ってるんだけど。要するにコピーじゃなくて、そこにあるデータそのものを(別のとこから)変更したい時に使う。何度も使うようならマクロを作る価値はありそう」

※追記
UnrealEngine4 Project "YoRoZu" 第十九回 YoRoZu_Flow "ForEachLoop (Ref)"の実装
このサイトに参照版のForEachLoopの実装例があります。
制作過程も載っていてわかりやすいです。