読者です 読者をやめる 読者になる 読者になる

GameProgrammar's Night

ゲームプログラム系の覚え書き

UnrealEngine4で2Dゲームを作ろう! その10 マチネでデモ

まずは、こちらをご覧下さい。

現在制作中のゲームのデモになります。
10/25のイベント向けに作ったもので、マチネを利用して作りました。

マチネ

 マチネは、UE4上でカットシーンを作るための機能でタイムラインを使ってActorに動きをつけることができます。
 基本的な使い方は、公式ドキュメント「マチネ & シネマティクス | Unreal Engine」やhistoriaさんの「[UE4] Matineeでカットシーン制作(1) Actorを登録して動かしてみる | historia Inc - 株式会社ヒストリア」を参考にして頂くとして、ここではケーススタディを書きたいと思います。

マチネの大切な仕様

 マチネでカットシーンを作る上で重要な仕様がいくつかあります。

マチネ実行中でも、ActorのTickなどは通常通り動作している

 PIE実行してBPのデバッグ表示を見れば一目瞭然なのですが、ActorのTickやEvent動作はマチネ実行とは独立して実行されています。
 そのため、あるActorはマチネで動かして、あるActorはAIで動かして、あるActorはユーザー入力で動かすなど、すべて混ぜて使うことができます。

 この仕様は、元Flasherの自分にはかなり嬉しくて、マチネとBPを混ぜ合わせて作ることで大分早く作れたかなと思います。

マチネで設定しているパラメータは絶対である

 ActorのTickなどで値を操作していても、マチネ上で設定されているパラメータに強制的に上書きされます。1つのActorをマチネとBPの両方で操作している場合に顕在化するので、気をつけましょう。

 地味にハマリました……。

キーフレーム間の補間処理を切ることができない

 キーフレーム間は必ず補間処理が走ります。そのため、ある時間帯はActorのTickに任せて、また時間がきたらマチネの管理に戻すということはできません。

 補間を切りたい時だけ、Pauseすればいいんじゃないか? とも思いましたが、マチネ全体が止まってしまうのでそれはそれで困るという結果に。

操作できるActorは、レベルに配置されているもののみ(アウトライナに存在しているActorのみ)

 SpawnしたActorをマチネの対象にすることはできません。また、PlayerControllerのような実行前に実体がないActorも対象にできません。
 できてくれるとかなり使い出あるんで、そのうちできるようになったりしないですかね。

以上のことを踏まえて、今回作成したデモは、以下のような構成となっています。

今回は、記事が長いのでここで折りたたんでおきます。

デモ構成

カットシーン分割

 動作確認を素早く行うことを考えて、カットごとにマチネアクターを用意しています。

 レベルBPのBeginPlayで今確認したいマチネの実行をはじめます。
f:id:katze_7514:20151028201914j:plain

 カットのつなぎは、マチネが一つ終了したら次のマチネをPlayする実装になっています。
f:id:katze_7514:20151028201917j:plain

 この仕組みをちゃんと動かすには、各カットの頭でActorの位置や状態をセットアップするようにしておきます。前のカットがある前提で実装してはいけません。

キャラクター

 マチネで操作しているのは、移動だけです。Flipbook切り替えは、タイミングをEvent発行させて各Actorで行っています。
 3DのAnimと違いFlipbook切り替えはマチネに対応されてなかったため、そうなっています。Flipbookトラックできるとイイネ

プレイヤー

f:id:katze_7514:20151028195249j:plain
 本ゲームの主人公です。今の段階でもそれなりにPawn/PlayerController共に実装してあります。
 攻撃は、マチネからEventを発生させて対応するBPのEventや関数を呼び出しています。

f:id:katze_7514:20151028221215j:plain

 PlayerControllerとマチネの動作がカチあってしまったので、マチネ動作中はPlayerControllerの動作を止めています。

エネミー

f:id:katze_7514:20151028195250j:plain
 今回のデモ用に作った敵キャラクターです。デモ用と割り切って実装しています。
 攻撃魔法をヒットさせるためにコリジョンは持っていますが、AIは実装されてません。状態に応じてアニメーションを変化させる部分だけ実装してあります。
 その仕組みをマチネのEventに合わせて呼んでいます。

f:id:katze_7514:20151028221014j:plain

攻撃魔法(エフェクト)

f:id:katze_7514:20151028221944j:plain

 攻撃魔法Actorは、ゲームロジックとして実装してある正規のルートで生成しています。攻撃のフロントエンドとなるEventを、マチネのEventを受けて呼んでいるだけで、動きはActorに実装したものが動いています。
 今回の攻撃魔法Actorは指定したエネミーに向かって飛んで行き、ヒットしたらヒットエフェクトを出して自滅します。

f:id:katze_7514:20151028223909j:plain

 エネミーに攻撃が当たった時、ノックバックしているのはマチネでの移動です。攻撃魔法Actorを発生させてからエネミーに当たるまでの時間は、目で合わせています。ProjectileMoveの速度計算方法がわからなかったので気合いです。

カメラ

 はじめはマチネでカメラを動かそうと思っていたのですが、デモとはいえ実装済みのゲームカメラと違う動きをするのもよくないなと思ったので、カメラは自前のCameraActorが動いています。ただし、マチネと連携を取れるようにカメラに用意したEventを呼ぶことで動作できるように、少しだけ実装しなおしています。元々ゲームカメラは、プレイヤーのPawnに自動で追随するものでした。
 画面のフェードイン/アウトは行う必要があったので、Directorグループは存在していますが、Fadeトラックしか作っていません。

f:id:katze_7514:20151028224705j:plain

UI

f:id:katze_7514:20151028224838j:plain:w350

 会話シーンのUIは、UMGで実装しています。デモ用と割り切っているので、汎用性もなにもありません。表示する画像を直接おいています。
 マチネのEvent発行に合わせて、表示・非表示・テキストの変更を行っています。

f:id:katze_7514:20151028225224j:plain

 UI表示は、マチネのフェードのさらに上に表示されます。デモの最後に全部フェードアウトしているのは、Directorのフェードアウトに合わせて、α値を0にするUMGアニメーションをタイミング合わせて再生しています。

最後に

 という感じで、マチネとBP処理をハイブリットさせて作りました。マチネのことを調べながらやっても、1日ちょっとででっち上げられたので上々かなと思っています。
 Actor側もマチネと連携して動かすつもりで作っておくと、即売会前にデモをでっち上げやすくなるので良いかとw BPも整理されますしね。

 マチネについては、細々とした不満はありますが、かなり良くできていて素晴らしいなと思います。
 PG脳で作る分にはすぐに意図が読み取れるので良かったですが、これを実際にカットシーンデザイナーが触るとなるとどうするんですかね? スクリプトぐらい触れないとカットシーンデザイナーにはなれないって感じなんですかね(

おまけ

マチネ作業中のUI配置
 タスクバーを挟んで右がメインディスプレイ(24型1920x1200)、左がセカンドディスプレイ(19型1280x1024)です。
 セカンド側にPIEを広げて、メイン側でマチネやBPの編集をします。ポイントはアウトライナをマチネやBPウインドウの近くにおくことでカーソルの移動量を減らしてるとこでしょうか。

f:id:katze_7514:20151028231836j:plain