カメラとプレイヤーの向いている向きにより入力による移動方向を変更する

いろいろな向き

向きによってプレイヤーの進む方向を変更する場合、いろいろな考え方がありゲームの内容によって使い分けるのがいいでしょう。

以下で何をプレイヤーの向きとするのか、その一例をあげてみます。尚、飛行が用いられるゲームでは無ければ、z軸はxyの軸とは違う扱いをすることが多いので、その軸の成分を捨てる処理を行うとよいでしょう。

  • カメラの向き:画面前のプレイヤーから見ると、カメラの向きから見た映像が一番直感的でしょう。真上真下から見た視点の場合には使えない方法です。
  • カメラの位置からプレイヤーの位置への方向ベクトル:基本的にカメラはプレイヤーを常にとらえて移動するので多くの場合、上記の処理と同じ動作をするでしょう。プレイヤーが常にカメラの中央にいない場合にカメラの向きの場合とは動作が異なってきます。
  • プレイヤーオブジェクトの向き:真上から見た場合には自然な動作に見えるでしょう。もし真上以外の方向から見る場合にプレイヤー視点を用いる場合には横方向の入力に、移動ではなく向き自体の変更を行う操作を割り当てることをお勧めします。

今回の記事では、PlayerControllerや入力に関しては、前回作成したPlayerControllerを用い、スタティックメッシュも前回のものを用いますが、他は最初から作っていきます。新規レベルから始めましょう。

UE4 物体をコントローラーで動かそう | それとこれとあれかどれかと (andandor.com)

尚、私自身は、記事で作成した内容は以下のように保存し、まだ使うものに関しては右クリックから複製したうえで、役割毎のフォルダに別に保存いたしました。

Pawnを作成しコンポーネントを追加

とりあえずポーンの作成まで進めてしまいましょう、今回はプロジェクタイルムーブメントは利用しないことにいたします。

カメラはそのまま利用してもよいですが、そのままだとトランスフォームの位置を簡単な計算で求める必要があります。SpringArmという便利なコンポーネントがあるので使ってしまいましょう。”DefaultSceneRoot/StaticMesh/SpringArm/Camera”という階層構造に並べ替えて、SpringArmのZの回転の三角を左右にドラッグしてみましょう。プレイヤーを中心に回転するのがわかるはずです。確認したら戻しておきましょう。

真横から見ると少し見づらいので、少し上に挙げておきましょう。yの回転を-30にしておきました。一度確認してみましょう。

確認前にワールドセッティングの設定とPlayerStartの位置を確認しておきましょう。ワールドセッティングの設定は、プロジェクト設定から初期値を設定することも可能ですが、今回は説明しません。基本的にレベルを作ったら最初に確認しておきましょう。PlayerStartの位置が他のオブジェクトと重なっていると、プレイヤーが生成されないことがあります気を付けましょう。

インターフェースの作成

ここで一度インターフェースというものについて説明します。共通したインターフェースを持っているオブジェクトは、そのインターフェースのイベント及び関数を扱えるという約束事みたいなものです。インターフェースを実装することにより同じコントローラーを用いて複数の種類のポーンを操作することが可能となります。ブループリントインターフェースを作成します。ブループリントインターフェースを開くと以下のような画面ができるはずです。

二つの関数を作成しましょう。+ボタンで関数を追加し名前を変更しましょう。各種関数の設定は右の画像のようになります。Vertical、Horizontalともに同じです。

作ったインターフェースはクラスの設定から登録できます。先ほど作ったPawnのブループリントを開きましょう。Pawnのブループリントを開き、クラスの設定を開きましょう。画面が狭い場合には黄色で囲った部分を押すと出てくるはずです。詳細タブにインターフェースの設定が出てくるはずですので、追加をクリックして先ほど作ったインターフェースを追加しましょう。

すると画面にインターフェースが追加されるはずです。右クリックからイベントを実装します。2つとも実装してしまいましょう。

関数作成

VericalMoveインターフェースの関数はこちらになります。各コンポーネントはコンポーネントタブから引っ張って持ってくることができ、各関数の出し方はピンを引っ張って関数名で検索すれば出ると思われます。ノードをコピーしたものののファイルも置いておきます。ファイルの内容をイベントグラフへ張り付ければ同じものが作られるはずです。

HorizontalMoveをどう扱うかは、難しい問題です。シューティングゲームなどでは、カメラはプレイヤーとは別にそれ用の操作を用意することが多いです。ただ、今回は横の移動をカニ移動にするのではなく、回転させて正面方向を変更する操作にしようと思います。以下のようにノードをつなげました。

プレイヤーコントローラーの修正

プレイヤーコントローラーを修正しましょう。キャストノードから先は作り変えるので削除してください。

まず、CastTo”作ったブループリントインターフェース名”のノードを探しましょう。別にキャストしなくてもいいんですが筆者自身の好みの問題です。ノードを引っ張った状態から探した場合には、そのままでは見つからないと思うので状況に合わせた表示のチェックはいったん外しましょう。キャストノードを作ったら、状況に合わせた表示のチェックはオンにして、そこから作成したインターフェース名を探しましょう。

二つとも実装したらこんな感じになります。

きちんと入力を受けて動くようになりましたが、宙に浮いているのとスタティックメッシュ自身の回転を忘れていました。修正していきましょう。

仕上げ

PawnのTickに以下のようにつなげましたが実は少しだけ問題があります。実行してみた場合に、下に落ちているのに等速直線運動しているのが問題ではありません。今回は地面にくっついていればいいというスタンスなのでそれに関しては、今回の挙動で問題ないです。実際には物理の数式とか使って物体を加速させてください。ここで問題なのはAddRelativeLocationです。AddRelativeLocationは一つ上の階層から見た位置を変化させる命令です。StaticMeshの上の階層はDefaultSceneRootです。StaticMeshはDefaultSceneRootを基準として動いているということです。DefaultSceneRootのおまけが好き勝手に動いているということです。それの何が問題化というとすぐには思いつきませんが何が起こっているのか実際に見てみましょう。

床から落ちる前のPawnのZの値は238.609です。そのまま床下に落ちていきましょう。値は全く変わっておりません。つまり現状、地面から落ちる場合に、自分自身の位置が変化しているのではなく、あくまで、DefaultSceneRootが手を動かしているかのようにDefaultSceneRootの一部のみが動いているという状況になっています。コンポーネントのルートが、ワールドなので一番浅い階層のものを動かすのは問題ありませんが、そこより深くなると自身が移動せずにそこに付随しているものとして扱われてオブジェクト上で移動することになります。DefaultSceneRootをRelativeLocationにつなげればいいのではないかと思う方もいるかもしれませんが、DefaultSceneRootには当たり判定を実装しておりません。修正で一番簡単なのは、DefaultSceneRootをStaticMeshで上書きすることですが、今までの説明もあるので別の方法を用いようかと思います。

以下のようにブループリントを実装しました。やっていることとしては、コンポーネントの移動先に自分自身をワープさせて常に自分の位置と同期をとっているという感じです。実際には、StaticMeshをDefaultSceneRootに上書きして、しまったほうが良いですがこういうやり方もあるということで、きちんと考えて作らないとこのようなことになってしまうことも多いので、自分で何かを作成する場合にはよく考えて作成しましょう。

回転処理はこちら、DefaultSceneRootが回転すればカメラも回転するのでSpringArmを回転させる処理はいらないです。もっと言えばSpringArmすらいらないです。まあSpringArmはあっても困らないので残しておきます。SpringArmはもっと複雑なカメラ操作を行う場合には便利に使うことができるコンポーネントです。

最終的にポーンのイベントグラフはこんな感じになりました。

ここまでで移動処理の実装は終わりです。一度動かしてみてうまく動くか確かめてみましょう。

終わり

以上が移動処理の一例です。ほかにもいろいろな方法でキャラクターは動かすことができます。目的に合った使い方をしましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA