はじめにこの解説は、そらまめゲームスが開発中の3D謎解きゲーム「Labyrinth(仮題)」の実装方法を解説したものです。Labyrinth2019年1月1日Labyrinthではゲームのシステム部分のUE4プロジェクトを公開しております!私たちの方針はノウハウの全公開ですので、少しずつですが実装方法をご紹介していこうと思います。LabyrinthのUE4プロジェクト公開に関するお知らせ2019年9月20日あくまでLabyrinthでの実装事例を報告したもので、推奨される実装方法とは限りません。難しい実装は何一つしていませんのであまり期待をしないでくださいね!実装を参考にするのは自己責任でお願いします。要件定義Labyrinthでは肩越しカメラでの操作を想定しています。カメラの注視点(見ている先)を主人公のやや右側に置き、その点を起点にカメラが動きます。最近のゲームでは手ブレのような演出や、いろいろな補間処理が入っているのでかなり複雑な設計になっていると思いますが、Labyrinthでは至ってシンプルな実装になっています。以下の操作でカメラを動かすことができます。全体像カメラは、PlayerCharacterのブループリントクラスで管理します。タッチ入力は、前回作成したPlayerControllerのイベントを使用します。スワイプなどのイベントをPlayerCharacterが受け取り、カメラを動かす速度を算出します。PlayerCharacterのTickにて、算出した速度を用いてカメラを動かしたり、速度を減衰(ブレーキ)したりします。Tickで処理しなくても、タッチ入力のイベントを受け取った時点でカメラを動かすことは可能ですが、そうすると、タッチを離すとピタッと止まってしまう動きになり、慣性のような滑らかな動きになりません。今回のように、タッチ入力を一旦速度にしてからTickで動かしてあげると、滑らかに動かすことができます。遥ちゃんのやや右側に、SpringArmコンポーネントを追加し、その子にカメラを追加します。することで、SpringArmを動かせば自撮り棒のようにカメラがついてきます。Offsetで設定すると良いです。することで、カメラを動かしてもキャラクターが常に画面左に居続けるような動き方になります。PlayerControllerの入力イベントを取得するPlayerControllerからスワイプなどのイベントを取得するために、PlayerCharacterのBeginPlayにてイベントをバインドします。PlayerCharacterのBeginPlayにて取得したいイベントをバインドする図のように、スワイプ、二本指ズーム、二本指スワイプのイベントにバインドして、それぞれカメラ移動、カメラズーム、カメラ回転の速度を算出する関数を呼び出すようにしました。入力イベントを元に速度を算出するスワイプによってカメラ移動やカメラズームの速度を算出する関数が呼び出されます。関数の中では以下の2つの計算をしています。加速度を速度に加算カメラ移動、カメラズーム、カメラ回転は似たような計算をしているので、ここではカメラ移動の解説をします。入力値を加速度に変換タッチ入力値を元に速度を算出タッチ入力値を加速度として使用するために用意した変数にセットします。その際に補正値を掛けて、ちょうど良い数値になるようにします。補正値はゲーム中にデバッグ機能として調整できるようにしておくと楽になります。加速度を速度に足すときは最大速度チェックを!ただ加算しているだけですが、ちゃんと最大速度と最小速度で抑えておかないとどこまででも速くなってしまいます。最大値と最小値もゲーム中にデバッグで調整できるようにしておきます。速度をカメラに反映するPlayerCharacterのTickでのカメラ更新処理PlayerCharacterのTickにて実際にカメラを動かします。シンプルですね!ここでもカメラ移動のみ見てみます。ズームと回転も似たような処理をしているのでぜひ参考にしてみてください。カメラ移動値を更新する実際にカメラを操作する値を更新する値をループさせたり上限値を設けたりといった最終調整を行います。移動値を更新(算出)する際に気を付けることは、Tickで行っていますので可変フレームレートに対応することです。フレームレートによる差を吸収するために、alweiさんの記事を参考に可変フレームレート対応をしました。Enginehttp://unrealengine.hatenablog.com/entry/2015/08/09/210000ここ最近体調を崩したり、様々な作業に終われて更新が滞り気味でした。更新頻度を上げていくために小ネタを多めにしていこうかと思います。最近のゲームエンジンではほぼ全てのエンジンで可変フレームレートに対応しています。FPS]というブループリント関数ライブラリにfloat値を流し込むと、前フレームからの経過時間をもとに値を補正してくれます。可変フレームレート対応は、どんなときに気をつけるべきか慣れてないとわかりづらく、対応漏れが起きやすいです。私も苦手です!気を配る箇所としては、ものを動かす時、カウントを数える時、などをフレームごとに行う場合が要注意ポイントです。ちゃん私の場合はフレームレートを変更するデバッグ機能を入れておくことで、フレームレートを変えても正しく動くかどうか確認できるようにしています。カメラ位置を更新する移動値をSpringArmに適用するいよいよ値をカメラに反映します。いっても、実際は自撮り棒であるSpringArmの方を動かします。カメラ速度を減衰させる速度を減衰させる速度は減衰させないと常にその速さで動き続けてしまいます。タッチ操作の指を離した後も、少し余韻を残しつつ停止するような動きになるように、速度を減衰させて止めるようにします。Engineユーザー助け合い所」に書きました。デバッグ機能で調整するゲーム操作周りは、プレー感に直結する部分なので調整は入念に行う必要があります。その際に、PCゲームであればUE4エディタ上で動かしながら調整できますが、モバイルの場合は実機上で動かしながら調整できることが望ましいです。Labyrinthでは今回のカメラ操作に関するパラメータはすべて実機上で調整できるようにデバッグ機能を用意しました。ここまで用意するのは手間がかかりますし、自己満足の部分が大きいです...。場合は、「これは実機で動かしてみないとわからんな~」という値のみを実機で調整できるようにしてやればいいかと思います!また、デバッグ機能としてフレームレートを変更できるようにして、可変フレームレートの動作確認をできるようにしています。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。