2018年10月21日

私は君の座標を変更した覚えはないぞ

今回はUE4の話題を。
前回シーケンサーについて触れたのですが、今回もそのことについて書こうかと思います。なにしろこの機能、普通に高機能なアニメーションツールと同等の能力を持っているため非常に奥が深く、ある意味で分かりにくいのです。
なのであくまで私が触ってて理解した事のみになりますが、幾つか汎用性の高い情報もあると思うので、今回改めてまとめようと思った次第です。
ちなみに使用しているバージョンは4.20です。


アニメーションのブレンド
スケルタルメッシュのアクタをシーケンサに配置して、該当するアニメーションを追加すると、紫のバーが追加されます。これがアニメーションファイルです。
複数のアニメーションをシームレスに繋げたい時は、別になにかする必要も無く、同じトラックに配置して単純にバーを重ねるだけ。お手軽。
ks_sequencer2_1.jpg


アニメーションの再生速度・分割
各アニメーションの再生速度を変えたいときは任意のアニメーションバーを選択して右クリックしてプロパティを出すと、Play Rateという項目があるので、そこを変更すれば再生速度を変えられます。
ちなみにシーケンサー全体のアニメーション速度を変えたいなら、シーケンサーファイル自体の詳細プロパティにもPlay Rateの項目があるのでそこをいじればOK。

さらにアニメーションを分割させたければ、分けたい箇所に再生カーソルを持ってきて、右クリックで編集を選ぶと「分割」という項目が出てくるので、これでアニメーションを分けることが出来ます。
再生開始位置を微調整したいなら、プロパティにStart Offsetという項目があるので、ここで時間を指定すれば、その箇所からアニメーションが再生されます。(分割したなら、Start Offsetの値が0以外の数値になってるハズ。ここをいじれば微調整が可能って事です。)
ks_sequencer2_2.jpg


パーティクルの再生・親子付け
パーティクルの再生管理もシーケンサーで可能です。パーティクルをシーケンサーの中の再生リストに含めるには、コンテンツフォルダから直接シーケンサーにドラッグ&ドロップします。
物自体は0座標にあるので、任意の箇所まで持ってくるか、他のアクタに親子付けします。
親子付けは簡単で、パーティクルのリストにある「+トラック」をクリックすると(左上にある緑のTrackというやつではない)親子付けというのが出るので、任意のアクタを選択するだけ。そうすると、黄色のバーが追加され、その範囲内の時のみ親子関係になる仕組みです。
親子付けすると、その瞬間にアクタの位置がずれたりするので、その前後でトランスフォームを微調整する必要が多々出てくるかも。
ks_sequencer2_3.jpg

ただこのままでは再生しないので、再生位置を指定します。やはりトラック内にある「+トラック」をクリックすると、パーティクルトグルトラックというのが出るのでクリックします。
パーティクルシステムというトラックが出来るので、任意の箇所にキーを打ち込むと、白いバーが出来ます。そこで再生されることになります。
ちなみにデフォでActivateになってますが、白いバーの途中の位置でDeactivateにすると、その位置から以降が消えます。
まあこんなことしなくてもバーを伸縮させれば同じことなんですが。
ks_sequencer2_4.jpg


アクタの表示・非表示
アニメーション再生中のどこかでアクタを非表示にさせたい、あるいは途中から出したい、という場合は、トラック内にある該当するアクタの「+トラック」でActor Hidden In Gameを選択すると、可視性というトラックが追加されます。
ここで任意の箇所にキーを打ち、そこで右クリックしてプロパティを出すと、Valueというチェックがあるので、ここのチェックを外すとそれ以降が非表示になります。逆にチェックを入れれば表示されるわけです。なので再生中に何度も表示非表示を切り替えたりも出来ます。
ks_sequencer2_5.jpg

ただしこれは瞬時に切り替えるものなので、徐々に非表示にするとかいう機能は無い模様。
そういうことをしたければマテリアルの方をいじる必要がありそうですね。
マテリアルの変更もシーケンサーで管理できるはずですが、こちらは左上の緑の+Trackアイコンで出てくる「マテリアルパラメータコレクショントラック」というものを使えばできたはず。
その前に、該当するマテリアルのパラメータ値が設定された「マテリアルパラメータコレクション」というファイルを作っておく必要があるのですが、まだ私はあまり詳しくないです。

また、パーティクルの時でもやった、アウトライナ上のアクタを持ってくるのではなく、コンテンツフォルダから直接アクタを持ってくると、Spawnedというトラックが出来るのですが、これを同じようにいじることによって表示非表示と同じ効果が得られるはず。
Spawnedトラックがあるアクタは、シーケンサーによるアニメーション再生が終わると自動的にレベル上から消えてしまうので、再生後はいなくなって欲しいという場合はこれで解決します。
後からでもSpawnedトラックは追加可能で、シーケンサー内の該当のアクタリスト上で右クリックすると、Spawnableに変換というのが出てくるのでそれをクリック。
ks_sequencer2_6.jpg


レベルを別名で保存すると、シーケンサーのアクタがリンク切れになる
これ、別名で保存すると、アクタの名前は同じでも、結局別レベルになることで中のIDは別になるので、違うアクタと判別されてしまうからなんですよね。つまり一つのシーケンサーで複数のレベルをまたいで管理することは出来ない訳で。
リンク切れを起こしてしまったら、一個一個「アクタの割り当て」で手動で当てなおすことも出来ますが、シーケンサーの上の方にある目のアイコン(一般設定)を右クリックすると、「アクタリファレンスを修正」というのがあるので、これを実行すると、この件で起きたリンク切れを一瞬で治すことが可能です。
万が一それでも治らなかったら、一個一個当てなおすしかないんですけどね・・・・。
ks_sequencer2_7.jpg


アクタを回転すると変な挙動になる
シーケンサーで回転アニメーションを付けようとすると、謎の意図しない変な回転挙動になることがあります。
これ、なんでこんなことになるかと言うと、例えばY軸回転させただけなのに、トランスフォーム値を見てみると、動かしてないはずのXZ軸まで値が変更されてたりすることがあるんです。これ、UE4上の仕様なんですよね。
なのでどうにもならないため、もし回転して動かしているときに、トランスフォーム値(黄色で囲んだ箇所)が動かしてない軸まで変更された場合、アクタを動かして回転させるのをやめて、トランスフォーム値に直接数字を入力してしてやるしかないです。(黄色で囲んだ値に直接書き込める)

また、360度以上回転させたりすると、これもまた変な挙動になることがあるので、90、180度毎に刻むみたいな処置が必要になるかもです。
刻むとキー毎に自動で動きの強弱がついてしまうので、シームレスにつなぐために間のキーを「リニア」で繋ぐと良いでしょう。
ks_sequencer2_8.jpg


というあたりで今回はこの辺で。
非常にマニアックな話題ですが、これでも全然シーケンサーの一部の機能を紹介しただけなんですよね。私も分からないことだらけなので、他になにか理解できたことが貯まってきたら、またここで紹介しようと思います。




web拍手 by FC2
posted by KS(Koumei Satou) at 21:53 | Comment(0) | UE4 | このブログの読者になる | 更新情報をチェックする

2018年09月23日

だってここで演じろっていう話だったじゃないですか

今回は久しぶりにUE4の話題を取り上げようと思います。
UE4の中にシーケンサーという機能があるのですが、この機能一見便利なんですけど、絶妙にかゆい所に手が届かない感があって「なんだこれ使えねーわー」といってほとんど使っていませんでした。

ですが、ここ最近のUE4のバージョンアップに伴い、シーケンサーも地味にアップデートされて、多少は進化したようなのでちょっとその辺について書いてみようと思います。(現時点でのUE4のバージョンは4.20です)


シーケンサーはいわばシネマシーン、要するにゲームのカットシーン見たいなものを簡単に作成できるようにした機能です。アニメーションさせたいアクタを簡単に動かして管理させることが出来るものです。
上のメニューにあるシネマティックのタブからAdd Level Sequenceを選択すると、シーケンサーファイルを作成できます。
シーケンサーファイルはレベルに紐づくファイルなので、使用したいマップに置いて開きます。
ks_sequencer1.jpg

後は動かしたいアクタをドラッグして登録するだけ。これで、始点終点を決めて動かすアニメーションツールではお馴染みのやり方でアニメーションを作れます。
時間の単位がデフォでフレームレート(fps)になってるので、馴染みがないなら秒単位(s)に変えると分かりやすいです。
エンターキーでキーフレームを打ちますが、バツ印のアイコンを鍵マークにしておくと、動かすだけでキーを打つのでこっちの方が便利でした。
ks_sequencer2.jpg

レベル上にあるアクタをそのまま動かすだけでそれがアニメーションになるので非常にお手軽です。シーケンサーはアクタだけではなくカメラやサウンドも管理可能で、動きに合わせてカメラのカットを変えたり音を鳴らすことも可能です。そもそもカットシーン用のツールなのでその辺は抜け目ないですね。

後は、ブループリントで呼び出すだけ。Game/シネマティックの中にあるPlayで再生ができます。これをシーケンサーファイルに関連付けすればよし。
ks_sequencer3.jpg

ここまでだと、非常に便利そうなのですが・・・・。私的に非常にネックな部分があって長らく「使い物にならん」判定が下されてきたこのシーケンサー。
一体何がダメだったのか?


それは、一度アニメーションを作ると、そのアニメーションはそこから1ミリも動かすことが出来ない、という仕様です。
この「動かすことが出来ない」というのは、作成したアニメーションを編集できない、という事ではありません。別の意味です。

どういうことかと言うと、例えばこんな例を考えてみてください。椅子の上に置いてあった本が下に落ちる、という何気ないアニメーションを一生懸命作ったとします。よし完成だと思ったものの、ある都合でマップのデザインを手入れしなければならなくなりました。そのせいで椅子の位置が初期の時よりだいぶズレてしまったのです。そのため、本の落ちるアニメーションも椅子に合わせて位置をずらす必要が出てきました。
普通なら、本のアクタをずらせばアニメーションも追随して再生されるでしょ?と思うでしょう。ところが、例えアクタの位置をずらして配置し直したとしても、シーケンサーを起動すれば最初に決めたアニメーションの位置で再生されるだけです。
何故ならシーケンサーはあくまでアニメーションを座標決め打ちで登録して指定してるだけだからです。なので指定された座標位置にアクタは移動していくだけなのです。

アニメーションを全体移動して座標をズラすみたいな機能もないので、もし最初の位置からアニメーションをずらす必要が出てしまった場合、恐ろしい事にイチからアニメーションを作り直すしかなかったのです。
ks_sequencer4.jpg

レベルデザインにおいて、中のフィールドが逐一変わっていく事は日常茶飯事です。なのに、その変化に臨機応変に対応できないシーケンサーは、個人的に全く使い物になりませんでした。これだったらブループリントでアニメーション組んだ方が、後で位置をずらすのも簡単だし、便利でしたからね。BP組むの面倒くさいけど。

シーケンサーは元々シネマ作成用と言いましたが、これすなわち、スケルタルメッシュみたいなアニメーションを持つキャラモデルや、あらかじめアニメーションを持っているアクタなど、それらを配置して管理するのが目的、という意味合いが強く、このシーケンサー自体でアニメーションを作成するっていうのはそもそもあまり想定されてなかったのでは、と推測します。
それでもカメラ管理とかは絶対これ致命的にネックになるよなあ、と思ってたので、「これ誰も不満に思ってないの?誰も使ってないの?」とずっと疑問でした。

そしたら、その意見をやっと呑み込んでくれたのか、ようやく改善機能が追加されたのです。
そのものズバリ、アニメーション全体をずらすことが出来る機能です。

シーケンサーの詳細設定の中に、Instance Dataという項目があり、この中のOverride Instance Dataのチェックを入れます。
ks_sequencer5.jpg

すると、選択欄が出てくるので、ここで何かアクタを指定すると、シーケンサー全体のアニメーションをここのアクタの座標位置までずらすことができるのです。
指定アクタをターゲットポイントのようなエディタ用アクタにしておくと分かりやすいでしょう。
ks_sequencer6.jpg

ただこれ、普通に作ったシーケンサーアニメーションを、どこかの任意のアクタの位置に指定しても、大概あさってのよからぬ方向に行ってしまいがちです。
何でこんな事になるかと言うと、シーケンサーのアニメーション位置の基点が0.0.0の座標に指定されているからです。
そのため、任意のアクタの位置を指定すると、現在のアニメーションの位置を0座標を基点として、指定アクタの位置までずらす、という方法を取るので、アニメーションの位置が0座標から離れている分だけ、余計にずれてしまう、という事になるのです。

これを避けたい場合、まずアニメーション自体を0座標位置で作ってしまうのが簡単でしょう。アニメーションさせるアクタのピボット位置を0座標と合わせておくと、後で位置指定した時、アニメーションアクタがそのまま指定位置にピッタリ来てくれるので分かりやすいです。

もう既にアニメーション作っちゃったよ、としても、ターゲットポイントアクタを作って0座標位置に置いて、アニメーションしているアクタ全部と一緒にターゲットポイントを任意の位置までずらし、その状態でターゲットポイントを指定すれば、ちゃんと意図した位置でアニメーションが再生されるはずです。こっちの方が実は手っ取り早いかな。
ks_sequencer7.jpg

この機能の追加のおかげで、俄然利用価値が深まったシーケンサー。ブループリントよりは動作が軽いので、「アニメーション作るときはなるべくシーケンサー使って」っとエンジニアに釘を刺されたため、今後は使用頻度が上がりそうです。


あ、そういえば、シーケンサーアニメーションは昔、再生し終わるとそのまま最後の状態を保ったまま再生を終えてたのですが、現在では、再生し終わるとアニメーションの最初の位置に戻るという仕様になってて、例えば何か物が落ちたアニメーションが再生されても、アニメーションが終わると、最初の落ちる前の位置にアクタが戻ってしまうんですよね。
これ、私は悩んだ末に再生終了間際にイベントを発生させて、ブループリントでPauseノードを使ってシーケンサーを一時停止してその場をしのいでました。
後で調べて分かったのですが、シーケンサー内のトラックのプロパティでWhen Finishedと言うのがあるのですが、これをKeep Stateに指定すれば解決することを知りました。
どうもこれが昔デフォになってたんでしょうね。なんでこれを外してしまったのか・・・・。
トラック数が多いと全部のトラックにこれを一つ一つ指定しなおさなきゃならないんですよ。何故か一括選択できないのですげー面倒。
ks_sequencer8.jpg

あと、角度を変えて回転アニメーションを入れると、変な座標を打ち込んで意図しない動きになったりするバグはまだ残ってますが、これって回転させたとき、X軸だけ回転させたはずなのに、何故か中身を見るとYZ軸まで数値が変更されてるんですよね。これのせいで意図しない動きになることがある。
これはUE4が持つ仕様に関連してくるので改善は難しそうですねえ。

それとブループリント内にシーケンサーを埋め込む機能もだいぶ前に実装されたんですけど、挙動がバグってて正しくUIに表示されてなかったんですよね。あれってもう治ったのかしら・・・・。


なんか、何だかんだ言ってまだまだ口を開けば文句ばっかりだな(爆
まーでもだいぶ使いやすくなってありがたかったです。

・・・ん?いや、むしろ何故そんな簡単な事がすぐに出来なかったのか・・・・。

あーいかんいかん止まんないぞ。





web拍手 by FC2
posted by KS(Koumei Satou) at 23:34 | Comment(0) | UE4 | このブログの読者になる | 更新情報をチェックする

2017年11月19日

おい166番、ここまで作っても礼はナシか

何週にもわたってUE4の話題を取り上げてしまって、興味の無い方には申し訳ないのですが、ここしばらくUE4しか触ってなかったので書くことがこれしかないのです。すいません。
何でこんなことになったかというと、既にTwitterの方で上げたのですが、こんな動画を作っていたからです。



なんの気なしに作り始めた動画でしたが、まあとにかく完成まで苦労しました。一週間近く、というかそれ以上かかってたでしょうか、色々と問題があって、それを解消するのに時間がかかってしまってました。というわけで、今回はこの動画が完成するまでのちょっとしたメイキングを書こうと思います。


そもそもこの動画を作ろうと思ったのは、映画オブリビオンに登場するドローン166がフリーのCGモデルとして配布されていたのが始まりです。といってもこれを入手したのはだいぶ前の話であり、当時はPOSERなんかに移植して、ああ、すげー良くできてるなあ、という所で止まっている程度でした。
最近になってふとこのモデルの事を思い出し、そういえばこれをUE4に移植出来たら、さぞかし見栄えが良く映るんじゃないか?と思い、インポートしてみようと思い立ったわけです。
なお、映画オブリビオンを見たことない、知らない、という方は、我がブログで一度レビューしてるので参考までに。
ks_dron166_10.jpg

しかし早速ここで問題発生。このモデルは基本LightWave専用のファイルで配布されており、このままではインポートできません。Blenderやメタセコイアなどで取り込めるので一旦そこで読ませ、fbx形式に変換しようと試みるものの、あまりにパーツが細かいせいもあるのか、エラーで落ちてしまったり、形が正しく読み込めないなど、全く成功しません。うむむ、困った。もう詰みか?
仕方ないので予備で添付されていたObjファイルの方を読みこんでみます。しかし、これもUE4がフリーズしてしまい、失敗。しかし、どういうわけかBlenderでは読み込みが成功したので、一旦ここを経由させてfbx形式に変換してUE4にインポートするとうまくいきました。細かく見ると一部ポリゴンが崩れたりもしてるんですが、全体的にはほぼ忠実に移植出来たので良しとします。

とはいえ、Objファイルはパーツが一個にまとまった単一オブジェクトなため、Lightwaveファイルと違ってパーツ毎に分割とかしていません。とりあえず置物として配置するならこれでもいいんですが、せっかく入れたのなら、動かしてみたいじゃないですか。そうなると、一部のパーツは分離してないと都合が悪いのです。

Blender上でパーツ分解するのが一番良い方法ではあるのですが、残念ながら私はBlenderの扱いには全然慣れていないため、それを学びながらその作業をやろうとすると、どんだけ時間がかかるか分かったもんじゃありません。
そこで、以前ここでも紹介したUE4用のコードプラグインであるMeshToolを使って、UE4上でパーツを分離を試みてみました。こっちならまだ扱いが分かっているので何とかなるんじゃないかという期待があったためです。
ks_dron166_01.jpg

とはいえ、パーツ分離はどっちみち時間のかかる面倒な作業に変わりはありません。幸いMeshToolはLinkなどの便利な選択方式があるため、割とスムーズに行えたかと思います。
とはいえ、もともと超細かいディテールで作られたモデル故に、Meshtoolを起動するとメチャメチャ重くなりました。これ、それなりにマシンスペックが高くないと作業もままならなくなるくらい重くなりそう・・・。
そのうえ、要らない部分を消したりすると強制終了したりと動作が不安定になりがちだったため、少しずつパーツを消していったりとかだましだまし作業を行い、何とか動かしたい部分のパーツ分離に成功。


しかし、これだけでは足りませんでした。Droneは銃器が付いている手に当たる部分が、ボディからせり出すようになっています。しかし、このモデルにはそこの部分は省略されているため、手とボディをつなぐ骨格部分がありません。うーん動かすとなるとここが無いと厳しい。
ks_dron166_09.jpg

そこでネットで探してみると、なんとそこの部分がフリーで配布されているではありませんか。もともと3Dプリンタ用に配布されているデータですが、望みのパーツがあったので、こことかここから骨格パーツを入手。

これは簡単に移植出来たので、大きさを整えて完成。しかし、ボディの方にこれらを組み込むために、ボディ側に穴を開ける必要がありましたが・・・。これも何とかMeshtoolで作業を行いました。

ちなみに、Meshtoolで加工したメッシュは、通常のフィールドでレンダリングすると真っ黒になってしまいますね。しかし、ポストプロセスの範囲内に入ると問題なく表示されたので、UE4では基本ポストプロセスを使う事が大前提みたいです。まあそうでしょうね・・・。

UVに関しては元々マテリアルが細かく設定されていたのでその辺は楽でした。一部光沢のあるマテリアルにする等、軽い変更のみです。しかし、異常な程細かく分けられていたため、Meshtoolで加工するとマテリアルの順番が狂い、その度に設定し直しになるのは厄介でしたが・・・。
とりあえずこれで部品が揃い、完成。
ks_dron166_02.jpg

これでドローン君をUE4上で動かせるようになったぞ、やっほい、という所までようやく来ましたが、はて、どういうアニメーションを作ろうか、と考えたときに、既に購入していたScan FXというアセットが、このドローン君と相性が良いことに気が付きました。
Scan FXは文字通り、スキャンやセンサーといったエフェクトを簡単に描写することが出来るお手軽アセットです。それ以外にも、サーモグラフィ風とかナイトビジョン風とか、いかにもなポストプロセスも入っていて、非常に面白いアセットなんで購入していました。

映画を見た方ならご存知かと思いますが、ドローンは対象物をスキャンして敵か味方かを判断する、というシーンがあります。Scan FXを使えばまんまこのシーンを再現できないか? とふと思い立ったわけです。
そうと決まったら早速製作開始です。ミクと対峙させてスキャンさせる、というおおまかなシナリオも出来上がり、ドローンのアニメーションを作成していきました。
ks_dron166_03.jpg

本来ならシーケンサーを使うべきでしょうが、今回はブループリントで管理しました。面倒ではありますが、なんだかんだでこっちの方が後々編集するときに楽なので。
ドローンを全部まとめてひとつのブループリントクラスとし、その中のブループリントでアニメーションを作ります。
おなじみのタイムラインを使って動きを管理するのは、以前ここでもやったドア移動のやり方と同じ。ただ、ブループリントクラス内では動かす対象がアクターではなくコンポーネントという扱いになるので、若干通常と違います。
そこでSet Relative Locationとか、Set Relative Rotationというノードを使って、コンポーネント(各部位パーツ)を動かします。
ks_dron166_04.jpg

動かす前に、必ず変数を使って現在座標をセーブし、加算させるのは同じ。ただし、変数とターゲットとなる対象物はこのままだと互換性がなく繋がらないので、シーンコンポーネントのツリー以下にあるGet Relative LocationやGet Relative Rotationを中継点として使用します。

ドローンの動きはこれで大体出来上がりましたが、カメラの切り替えの方はシーケンサーの方が簡単なのでそっちで管理。
スキャンやドローン目線は当然Scan FXのアセットから拝借して、それを軽く編集して使用。
背景はポストプロセスも含め、Modular SciFi:Propsのアセットのサンプルを多少改変して利用させてもらいました。
ks_dron166_05.jpg


さて、ここまでは割と順調でしたが、また問題発生。今度はミクちゃんの方です。
ミクは今回Tda式のモデル(デフォ服版)をおなじみの専用プラグインを使ってインポートさせ、MMD側でアニメーションを作って、これまたおなじみのMMDBridgeを使ってモーションをベイクさせたvmdファイルを作成して、UE4にアニメーションを取り込みます。
この一連のやり方については、こことかで詳しく解説されています。
プラグインがUE4のバージョン4.16までしか対応してないので、仕方なく今回は4.16で作成してます。まあ取り込んだ後、別プロジェクトに移行させてしまえばバージョンはあまり関係ないんですけど、作業中に幾度と取り込むので、その度にいちいち移行とかやってられないので。

しかし、作ったアニメーションを取り込んでみると、おや、何故か目が動いていない。なんで目だけ動きが移植出来てないのか?
調べてみると、どうもMMDBridge側にも、インポートのプラグイン側にも問題があるようでした。
MMDBridgeでアニメーションをベイクすると、どういうわけか、右目左目のキーフレームだけ全部0座標に上書きされてしまっていました。これは他のモデルでは見られず、Tda式のみで起きていたので、モデル固有の問題みたいですが、何故起きるのかは謎。
ks_dron166_06.jpg

両目のフレームの方は生きていたので、じゃあこっちを使うか、と思っても、今度はインポートすると、フレームが正しく移植されず動かないという結果に。うーん、困ったぞ、全滅じゃないか。
別のモデルを使えば即解決する問題でしたが、このまま放置するのは気持ち悪いので、なんとか打開策はないかと色々試行錯誤した結果、2つの解決法を見出しました。
ひとつは、ベイクする情報を物理のみに限定させる方法。今回は歩かせるとかそういうことはしないので、髪の毛の物理演算だけ再現できれば良かったため、これなら目のフレームはベイクされず元のままです。mmdbridge_vmd.pyをメモ帳なので開き、export modeを1に設定すればOK。
もう一つは、ベイクする前に一旦右目左目の全キーフレームをコピーしておいて、ベイク情報を上書きした後、目のキーフレームを全部削除して、さっきコピーしたものをペーストする、という方法。これならIK情報をベイクしても目を動かすことが出来ます。
しかし、削除とコピペの作業はフレームが長いと割と面倒なので、ちょっと作っては試し出し、というのは難しいですね。

とりあえずこれで何とか問題は解決。ドローン君のアニメーションと帳尻を細かく合わせながら編集し、何とか形になってきました。


最後にドローン目線となるウィジットの作成です。ウィジットはあまりいじったことは無かったので手探りで作っていきました。
まずはドローンのUIを実際の映画で使用されていたものを参考に自作。アルファ抜き状態の物をpsdファイルとして作成すると、UE4上にそのまま移植可能でした。アニメーションさせるため、パーツ毎に分けて取り込み。
色々と各所で解説されているので、配置してアニメーションさせて表示、という所までは割と難なく出来ました。
ks_dron166_07.jpg

問題は、画面サイズに合わせることで、今回はエディターのビューポートに表示すれば良かったので、それに合わせる方法が分からなくて苦労しました。
結局、良い方法が浮かばなかったので、手作業で地道に帳尻合わせで配置させました。ウィジットは良くわからんなあ。

こうして、全てのお膳立てが揃い、ようやく動画が完成。途中で色々と問題が発生したために、中々苦労させられましたが、何とか出来上がってよかったです。
殆どがアセットやら配布モデルやらと借り物ばっかりで、自分で作ったものと言えばアニメーションとウィジットくらいのものだと言うのに、やたらと時間かかってしまって全然内容と見合ってないんですが(爆、まあ色々学べたりもしたので、今後に役立つといいのですが。

動画内でいじられまくったミクが少し不憫に思えたので最後にこんなショットを。
ks_dron166_08.jpg

あー実はこれを作ってる時点でもまた問題が発生してウギャーってなったんですが、もう長くなるのでやめときます(え







web拍手 by FC2
posted by KS(Koumei Satou) at 21:40 | Comment(0) | UE4 | このブログの読者になる | 更新情報をチェックする

2017年11月12日

数字があればもっとセーブ出来るぞ

今回もUE4の話題、前回の続きです。
ライトをオンオフする制御の際に変数を使うという所までやりましたが、今回はその発展形というかもう少し複雑な仕組みを作ろうと思います。といっても処理的には極めて基本的なやつなんですが。


■ノルマを達成出来たらイベント発生

・・・という仕組みは結構汎用性が高く、非常に多用する可能性のあるゲーム的要素ですよね。複数のスイッチを押して初めて開くドアとか、点在するアイテムをすべて拾ったらクエスト完了とか。
で、こういうのどうやって作ったらいいんだろうと、自分の力ではどうにも解決できなかったんですが(爆)、エンジニアの人にやり方を教えてもらって、なんとそんなに簡単に出来るのか、と非常にタメになったのでそれを記しておきます。
ていうか意外とこういう基礎的な事を解説してくれてる所が無いんですよ。みんなこれくらいは自分で解析できるよね、って思ってるんでしょうか。そんなバカな。分かるわけがない(え

やり方は前回やったような2択式のBooleanの変数を使います。とりあえずこれを使って、複数の床パネルを踏んだらライト点灯、という仕組みを作ってみます。
とりあえず2つの床を踏んだらノルマ達成としたいので、Boolean変数を2つ適当な名前を付けて用意しときます。

後は、前回やったライトオンオフの制御の応用です。この辺の仕組みについては前回の記事を参照してもらうとして、とにかく前回使ったブランチノードを使うという事です。
ブランチに繋がっている変数がON設定になっているなら、その先に進む、というのがライトオンオフの仕組みですが、言うなれば、この変数が複数個あるだけの違いでしかないわけです。つまり、複数ある変数がすべてON設定になってるならブランチの先に進む、とするなら、このノルマ達成の仕組みが出来上がります。
とはいえ、前回ではブランチに直接変数を繋げてましたが、当然今回は複数の変数があるのでそういう繋げ方は出来ません。
ks_ue4hensuu2.jpg
そこで登場するのがAND Booleanというノードです。
これは複数のBoolean変数を繋げることが出来るノードで、ブランチと繋げると、その全ての変数がOnかOffになって初めて先に進む、という制御になるわけです。

今回は2つの変数を使うので、このノードにゲットで2つ繋げます。なお、更に変数を繋げたい場合はピンを追加でリンク口を増やせます。
これで基本的な仕組みは出来てしまいました。Tureの先には前回やったライトオンオフの仕組みに繋がってさえいれば、ノルマ達成の制御自体は完成です。
ks_ue4hensuu5.jpg

おっと、床パネル側も指定しておかないと。というかこれも結局は前回やったトリガの仕組みの延長でしかないので、それを複数個用意しておくだけなんですけどね。
今回は、そのパネルの上に置かれたトリガボックスに各変数をセットで繋げ、全部チェックマークを入れておく、という事です。
更に、これらセット変数の先はすべてブランチにつなげておきます。こうすると、どの床を踏んだ時点でも、とりあえずブランチを通ろうとしますが、ノルマが達成していないうちは無反応という事になります。
全ての床を踏んだ時点で各変数がオン状態になるので、ノルマ達成となりそのままブランチを通過しイベントが発生する、という事になります。
ks_ue4hensuu1.jpg

この仕組みを応用すれば、前回やったスイッチによるオンオフでも可能で、スイッチを複数用意して、それらをブランチで繋げれば、全部のスイッチを入れた状態にしておかないとオンにならない、という仕組みも出来ます。


■一定数のノルマに達したらイベント発生

これもまたよくある仕組みですねえ。例えば敵を5体倒したらノルマ達成とか、点在するアイテムを10個中最低でも7個拾えばイベント発生とか。
流石にこの仕組みはBooleanでは難しいので、どうすんの、と思ってたらこれもエンジニアの人が教えてくれました。今度は整数の変数を使えと。
整数(Integer)はそのものズバリ数字です。Booleanがたった2択しか無かったのに比べると、相当に選択肢が増えたセーブ機能って事になるわけですが。

UE4上では緑色の変数、まずは一個用意しておきます。作ったら変数の型がIntegerになってればOK。
とりあえず前回のオンオフ制御を流用し、スイッチを押したら(Eキーを押したら)、という流れを使って、5回スイッチを押したらライト点灯、という仕組みを作ってみます。

Eキーのイベントノードの先に、IncrementIntというノードを繋げます。++という表記になってますが、これ、通るたびに整数を乗算する、というノードらしいです。そこでこの左下に先ほどの整数変数をゲットで繋げます。これで、このノードを通るたび、変数の中の数字が加算されていく、という流れになるわけです。
ks_ue4hensuu3.jpg

更に、ブランチにはEqual(Integer)というノードを繋げます。まあぱっと見分かると思いますが、繋がった2つのノード先の数字がイコールになってれば、右のリンクのBooleanはON状態とみなされる、という事です。
というわけでこのノードにも変数に繋げ、もう片側に5と入力し、Booleanのリンクはブランチに繋げます。これで、変数にセーブされた数字が5の数字と一緒になった時点でブランチを通過できる、という仕組みが出来上がりました。
5回Eキーを押すことで、ライトが点灯する、という仕組みの完成です。
ks_ue4hensuu4.jpg

ただ、このカウンター方式は、場合によっちゃ一回乗算させたつもりが超連続で乗算されてしまい、回数が狂う危険性があります。ノードをループで通ってしまうとなりがちなので、間にDoonceのノードを挟んで一回通るのみとするとか、色々対策が必要になる場合もあるので、注意が必要です。これはまだ色々検討すべき点があるようですな。まあ今回のようなシンプルな仕組みなら問題ないのですが。


■達成したノルマによって発生するイベントを変える

この整数を利用すると、整数の数字によって移動先を振り分ける、という仕組みも可能です。
整数変数はデフォで中身が0になってますが、セットで繋げて、その欄に数字を入れておくと、ノードに到達した時点でその数字に中身が上書きされます。乗算ではなく上書きであることに注意ですが、これにより、入力欄に0と入れておくと、中身がどんな数字であろうと0になるので、リセットなどにも使えます。
ks_ue4hensuu6.jpg

この仕様を利用し、「整数でスイッチ」というノードを使って、数字毎に行き先を変える、みたいな流れが作れます。
具体的な例を言うと、床パネルAを踏んだ状態でスイッチを押すとライトが赤に点灯、パネルBを踏んだら白に、パネルCを押したら青に点灯、みたいな流れとか、Booleanでは中々難しい制御も整数変数なら簡単に出来るわけです。

それぞれの達成ノルマに数字を割り当て、イベント発生時に変数にセーブされた数字と照らし合わせて、行き先を変える、という流れで、これも色々と流用が利きそうな便利なシステムですね。
ちなみに整数でスイッチのノードはswitchで検索すると出てきますよ。
ks_ue4hensuu7.jpg


■ランダムにイベントを発生させる

これも非常に利用度が高いシステムですよね。でも、中々やり方が見出せませんでした。最初はRandom Streamという変数を使う、というやり方を仕入れたのですが、これだとこっちが思うようなランダム制御じゃなくて、確かに最初はランダムで選択してくれるけど、一度選択したら以降はずっと同じ選択を繰り返してしまうという、中途半端なものだったので、他にないのか?と探して見つけたのがこれでした。
結果、変数も使わず、ノードを要しするだけで済みました。Random Streamとは何だったのか・・・。

マルチゲートというノードで、gateで検索すれば出てきます。これも、整数でスイッチノードと同じ感覚のもので、複数の選択肢を用意するのは同じ。
ks_ue4hensuu9.jpg

本来は通るたびに上から順番に選択していく、というもののようですが、randomのチェックを入れとくと、文字通りランダム選択になります。
ただ、このままだと全部の選択肢を通ると機能が停止してしまうので、Loopのチェックを入れておけば延々とにランダム選択が可能になります。逆に言うと、Loopを外しておくと、一度選択したところは二度と通らないランダム選択、という流れが可能という事ですね。


今回はここまで。これらを出来るようになったことで、結構色々なゲーム的制御が出来るようになりました。でも、大半は自力で見いだせなかったものなので、やっぱり素人がブループリントを独学で学ぶのはかなりハードルが高いなあ、とゲンナリです(爆




web拍手 by FC2
posted by KS(Koumei Satou) at 22:16 | Comment(0) | UE4 | このブログの読者になる | 更新情報をチェックする

2017年11月05日

1ビットセーブで充分なのだよ

今回も引き続きUE4の話題を書こうかと思います。
前回はコードプラグインである「Mesh Tool」のレビューを書きましたが、今回は久々にブループリントの話になります。

まあ仕事柄UE4に関わる機会が多くなったこともあり、色々学ばさせてもらってますが、相変わらずブルプリは奥が深すぎて厄介な代物ですねえ。

今回は、私がやり方を覚えた中でも、基本中の基本な事柄ながら、結構気付くまでに苦労した物を紹介しようと思います。
UE4をいじったことの無い人にとってはなんのこっちゃ記事になってしまうと思われますが、まあご容赦ください。


■ボタンを押すことでライトをオンオフさせる

ライトのオンオフについてはネット上にやり方が幾つも上がっていたので、これ自体は簡単なのですが、問題は、スイッチの前でキーを押すことによりオンオフさせるという仕組みを作る事でした。
ks_ue4bpbutton1.jpg

とりあえずライトをオンオフ化させるには、何は無くともライトをステイショナルかムーバブルにしておく必要があります(デフォはステイショナル)。
そして初期値でオフの状態にさせておきたいので、詳細の中にあるRenderingのVisibilityという項目のチェックを外しておきます。これでアクターはいわゆる非表示の状態になります。
ライトをオンオフさせるには、その要領で行います。そこで「Toggle Visibility」というノードを使います。
これは対象物が既に表示されているなら非表示にし、逆に非表示になってるなら表示させることが出来ます。
とりあえずEキーを押したらオンオフ出来るように組みました。(ちなみにキーボードイベントのノードは「キーボード」で検索すると出てきました)
ちなみにToggle Visibilityとターゲットアクターの間に何やら挟まってますが、繋げると勝手に出てくるものなんであまり気にせずに(え
ks_ue4bpbutton2.jpg

これで一応基本の挙動は出来ましたが、しかしこのままでは、フィールドのどの位置にいてもEキーを押せばライトをオンオフ出来てしまいます。
・・・流石にこれはない。やっぱりボタンの側まで行って、そこで押して始めて反応するように出来ないと。
ks_ue4bpbutton3.jpg

イベントTickで監視して、トリガの中にいるときだけ反応させる?・・・いや、というかそれどうやってやるの?とか途方に暮れてましたけど、AnswerHubで答えを見つけ、やっと打開策を見いだせました。ありがたや。

やりかたは、要は変数を使って管理すること。 ・・・うーん変数かあ。また嫌な奴がでてきたなあ。
どーもいまいちまだ私の中で変数というものがどういうものなのか理解できなくてモヤモヤしている状態です。
どこの説明を読んでも、「情報を入れておける箱で、情報の出し入れが可能」という書き方をされていて、「・・・で、だから何?」状態な訳ですが(爆

ただ、これちょっと言い方を変えて「データのセーブ機能」と考えると、ああなるほどそういう事か、とちょっと納得できたような気がします。
「いやちょっと解釈としては間違ってるんだけど・・・」と思われてしまうかもだけど、とりあえず謎の物としてモヤモヤしてるよかはマシという事で。
つまり、一旦ここにデータをセーブしておいて、それを別の所でロードして読み込んで、データを共有させる、みたいなイメージでしょうか。
ゲームとかでセーブ機能は大変便利、だからセーブ機能を持った変数は便利なのだ、という解釈(え
ちなみに、ゲームでも直で全部のデータをセーブ出来るのもあれば、パスワードでセーブするものもあるように、変数にも色んな種類のセーブ機能が用意されています。
今回使うBooleanという赤い変数は、あるかないか、1か0か、オンかオフか、といった、たった2択の情報のみしかセーブできません。
ks_ue4bpbutton4.jpg

しかし逆に、こうしたライトのオンオフみたいなシンプルなイベントにはこういう変数を使った方が分かりやすいしスマートというわけで。
(ちなみにBooleanの変数はデフォルト値が0、すなわちオンオフでいう所のオフ状態になってます)

さて、ボタンの前に来たかどうかを判定するために、ボタンの前にトリガーボックスを配置します。そして、そこからイベントを追加して、OnActorBeginOverlapとOnActorEndOverlapのノードを出します。それぞれ「トリガに触れたら」「トリガから離れたら」イベント発生、という仕組みです。
ks_ue4bpbutton5.jpg

そしてそこに作成しておいた任意のBoolean変数をセットで配置し、BeginOverlapの方に繋げた変数の方だけチェックを入れときます。
これで、いわゆるON状態をセーブさせることになります。逆にendOverlapの方はチェックが入ってないので、OFF状態がセーブされるわけです。
ks_ue4bpbutton6.jpg

さて、これでお膳立てができたので、メインルートのノードを修正します。ON状態の時だけイベントが発生、という仕組みを入れなければならないので。
そこで、ルートの間にブランチノードを挟みます。これは良く使うノードで、条件が満たされて初めてTrueのリンクを通るため、イベント作成やアクションを起こすときは便利です。平たく言うと、Conditionのリンクに繋がった先が「On状態」ならTrueに、そうでなければFalseを通ります。
そこで、ここに先ほどの変数をゲットで繋げます。セットがセーブなら、ゲットはデータロードという事ですね。

というわけで、変数からデータをロードし、読み込んだ情報によってブランチは通す先を変える、という事です。
当然ながら、ロードした情報がONならTrueを通ります。Falseには何も繋げないので無反応という事になりますね。
ks_ue4bpbutton7.jpg

BeginOverlapの状態だと当然変数はONになってるので、Eキーを押せばそのままイベントに繋がります。しかし、トリガから離れるとOFF状態に書き換えられてしまうので、この状態でEキーを押しても、ブランチはFalseを通りイベントは発生しません。これで「ボタンの側にいるときだけ反応」を再現出来ました。

ちなみに、OnActorBeginOverlapなどのトリガーイベントは、とにかくアクターなら何でも反応してしまうので、基本的にはプレイヤーだけに反応させるようにしなければなりません。色々方法はあるようなのですが、一番簡単なのはキャストノードを使う事です。
これまたこのキャストというのがクセ者で、なんだか良くわからない代物なんですが、とにかくここでは一種のフィルタリングとして機能するので、まあそういうものだと解釈しときましょう(え
cast toで検索すると大量に出てきますが、これでフィルタリングしたい対象物の名前を続けて入れれば望みのキャストノードが出ます。ちなみにプレイヤーを示す物はゲームモード毎に違うので注意がが必要です。
(ワールドセッティングのDefault Pawn Classに記載されているやつを使うらしい)
ks_ue4bpbutton8.jpg

これでプレイヤーのみに反応するように出来ました。(このキャストで指定されたアクタ以外の物が触れてもこのキャストの先を通してくれなくなる)

一応これで作りたいものは出来たけど、ライトをオフにしても電灯のメッシュのライトが点灯したままの表現になってるのはやっぱりおかしいので、ライトをオフにしたら、電灯もオフの感じにしたい。
考えられるやり方としては、メッシュを電灯オフの状態になってる物に置き換えるか、あるいはライトの部分のマテリアルだけ変更するか。
ks_ue4bpbutton9.jpg

使っている電灯メッシュが本体とライトで別個のマテリアルを使っていたので、後者のやり方が使えそうなので、それでやってみました。
そのものズバリ、Set Materialノードを使います。
これは、設定したMaterialにチェンジ出来るノードで、メッシュが複数のマテリアルを使っているなら、Element Indexでエレメント番号を指定します。
これでOFFの場合ライト部分のマテリアルを暗いマテリアルに変更させます。逆に電灯をONにした場合は元のマテリアルに戻すため、もう一セット用意。
ks_ue4bpbutton10.jpg

ん、ちょっとまて、ライトのオンオフをトグルのノードでやりくりしてるので、こちらもトグル化できれば簡単だったけど、残念ながらそうではないので、どう繋げればいいんだこれ?
そこで使用したのはFlipFlop。これは、通るたびにAとBのルートを交互に変えて通すというもので、これでトグルの代わりに使うことに。
ks_ue4bpbutton11.jpg

というかブランチのFalseの先にOFF状態を繋げた方がスマートじゃね?と思ったけどまあいいや。

これにて完成。
正直なところ、本当はボタンの前に立って更に視点がボタンの所に向いていて初めて押せる、という仕様にしたいのだけど、流石に現状ではそのやり方を見いだせてないので、今後の課題ですな。
ks_ue4bpbutton12.jpg

ちなみにToggle Visibilityはライト以外でもメッシュなら何でもオンオフできますが、物自体を完全に消してる訳ではないので、コリジョンは生きており、消しても通り抜けすることは出来ないんですけどね。
これを実現するための最適な方法は知りませんが、私の知る限りでは、これと同時に「Set Actor Enable Collision」を使ってコリジョンをオンオフさせるのが妥当かなあ、と。


・・・あれ、たったひとつのイベントを解説してたらもうこんな長文に・・・。続きはまた今度にしよう。
次回は、複数のノルマを達成したらイベント発生とか、一定数のノルマに達したらイベント発生とか、その辺を探求していく予定です。



web拍手 by FC2
posted by KS(Koumei Satou) at 22:52 | Comment(0) | UE4 | このブログの読者になる | 更新情報をチェックする