UE4 物体をコントローラーで動かそう
まずは入力を受け取ろう
まずは入力を受け取るためにプロジェクト設定を開きましょう。左上の編集タブから開くことも可能ですが以下の画像のように開くことも可能です。
プロジェクト設定のエンジンに含まれるインプットを開きましょう。
この設定のバインディングを編集することにより入力を受け取れるようになります。
今回は以下のように設定いたしました。アクションマッピングは今回は使う予定がありませんが設定してみました。軸マッピングに関しては今回の説明で使用するので設定しておきましょう。
(1)必要な入力は +ボタンを押すことで増やすことができるので必要な分だけ増やしましょう。(2)の横のリストから入力を選んでもいいですがまるで囲っているボタンを押して、設定したいキーを押すと自動で設定することも可能です。(3)Scaleに関してはDとSには-1を設定しておきましょう。
ワールドセッティング
まず以下の図の黄色い丸で示されたワールドセッティングを開きましょう。もしなければ赤丸で示されたウィンドウの中のワールドセッティングにチェックが入っていない可能性があります。
まずGameModeのゲームモードオーバーロードの横に図では隠れていますが、+ボタンがあるはずなので押しましょう。
すると 新規のゲームモードを作成 ウィンドウがでるので好きな名前で保存しましょう。
コンテンツブラウザを確認してみると一つファイルが作成されているはずです。ただし、黄色の〇で示されたところにマークがある場合それはまだ保存されていないことを示しているのですべて保存を押して保存してしまいましょう。尚、新規レベルから始めている場合にはレベルの保存を聞かれるはずなので適当な名前で保存しましょう。また保存したくないものがある場合には、保存対象を選択して右クリックのメニューからでも保存可能です。
再度、ワールドセッティングのGameModeの選択したゲームモードの内容を見ると値が変更可能になっているはずです。
クリックすればいろいろと選べるものが出てくると思いますが、とりあえず今回使用するのはDefaultPawnClassとPlayerControllerClassだけです。
例えばTutorialCharcterを選択して虫メガネボタンを押せばコンテンツブラウザで、最初からサンプルとして入っていたそのBluePrintの場所に飛ぶことができます。しかし今回は使いませんのでいったんDefaultPawnClass は None にしておきましょう。
コンテンツブラウザ右下の表示オプションのエンジンコンテンツを表示のチェックを外すと、コンテンツブラウザからエンジンコンテンツが表示されなくなります。
動かすものを作ろう
とりあえずGameModeは作りましたが動かすものがありません。本来は別のソフトBlender等のモデリングソフトや実はWindows10 に付属している3Dペイント等でもつくることが可能なのですが、今回はUnrealEngineだけで完結させようと思います。画面左にアクタを配置タブがあると思います。なければウィンドウのチェックが外れていると思います。
コーンをドラッグして画面に配置しましょう。ワールドセッティング横に詳細タブがあると思います。ここには、上のアウトライナで選択したものの詳細を決定することができます。ブラシセッティングはジオメトリ特有の設定です。ジオメトリを選択する場合ビューポートから選択すると、ジオメトリの面を選択してしまうことがあるので、注意しましょう。まずサイズが大きすぎるので、Zを100、OuterRadiusを50に設定いたします。
次にスフィアを作って半径を50にしておきましょう。アウトライナからConeブラシを選択してトランスフォームの位置を0にしましょう。以下の図の黄色い○を押すことでまとめて初期化(0)にできます。
以下のようになって別にこのままでもいいのですがどちらが前方かは分かったほうがいいので、くちばし的なものをつけましょう。
コーンを追加して以下のように値を設定しました。
- 位置:(X=30.000000,Y=0.000000,Z=150.000000)
- 回転:(Pitch=-90.000000,Yaw=0.000000,Roll=0.000000)
- Z:70.000000
- OuterRadius:20.000000
Coneブラシ2の面を選択してサーフェスのマテリアルを設定しましょう。なしの部分を押してマテリアルの新規アセットを作成しましょう。マテリアルを作成したらコンテンツブラウザに表示されるはずです。
以下のような画面が出るはずなので、ベースカラーのピンを引っ張ってConstant4Vectorを選択しましょう。色の設定ができるので黄色くしましょう。保存を押してマテリアル設定の画面を閉じましょう。
現状くちばしの選択した部分の身の色が変わっているはずなので、ジオメトリから選択 一致するブラシを選択 を押しましょう。
すると、下記のようにサーフェスのマテリアルが二つになっているので下にも同じものを設定すれば統合されるはずです。見た目も選択したブラシ全体が黄色くなりました。
それぞれのブラシに新しくマテリアルを作って、同じように色を付けましょう。
こんな風になりました。本来はこの程度なら1つマテリアルを作ったうえでそのマテリアルから作ったマテリアルインスタンスを用いてもいいんですが、ただでさえオブジェクトを動かすという本来の目的から脱線しているのでそこについては、またの機会にお話しいたします。
最後に三つのブラシをコントロールを押したまま複数同時に選択して、ブラシセッティングのスタティックメッシュを作成を押すことで、新しく作ったスタティックメッシュを保存することが可能です。
今回、Blender内で完結させるために、このような方法でスタティックメッシュを作りましたが、先に述べたように本来スタティックメッシュは他のソフトで作ってきたものを利用するのが基本です。細かく作りこむことも大変なので単純なもの以外は、ちゃんとそれ用のソフトを使って作ることをお勧めします。
ライティングを再ビルドする必要があります。と出ている場合には、全レベルをビルドを押すことで表示が消えるはずです。隠れている場合には黄色い部分の矢印を押してください。
もし真っ黒になってしまった場合には、スタティックメッシュを開いて、LightMapCoordinateIndexを1にして再度ビルドしてください。
Pawnの作成
先ほどの項では動かすための物体を作るという本来の目的からすごく脱線した内容を説明していましたが、ここからはプレイヤーが物体を操作するための手順として必要なものです。UE4では、PlayerController を使って Pawnを動かします。コンテンツブラウザの追加/インポートを押して、その中の基本アセットを作成からブループリントクラスを作成を選びましょう。
Actor,Pawn,Character,PlayerController,それにすべてのクラスからアクセス可能なAIControllerに関して簡単に説明いたします。
- Actor は Unity で一番よくつかわれるであろうオブジェクトです。すべてクラスを見るとPlayerControllerとAIControllerもActorに含まれているということがわかると思います。そして、Pawn,CharacterもActorです。それぞれActorをベースとして作られています。
- Pawn はよく使うクラスに書いてある説明の通りなのですが、今回使用するものなので別に説明いたします。
- Character は Pawn をベースとして作られています。pawnに歩く機能やアニメーションさせることが可能なスケルタルメッシュが追加されたものです。
- PlayerController プレイヤーがPawnを操作する場合このPlayerControllerを用いて操作することになります。
- AIController PawnはAIControllerによってでも操作させることも可能です。
PawnとControllerの組み合わせは操り人形のようなものです。ここでControllerは棒でPawnは、紐もしくは紐から先です。Pawnそのものに動かす物体を持たせてもよいですが、Pawnには紐としての役割だけしてもらい動かすActorは別に用意するという方法もあります。
例えば、以下で公開しているオセロゲームは、オセロ盤のActorに二つのPawnコンポーネントを保有させています。この二つのPawnのコントローラーをプレイヤーコントローラーにするかAIコントローラーにするかを切り替えることによって一つのActorを二人のポーンに操作させています。
REVERSI:無料ゲーム配信中! [ふりーむ!] (freem.ne.jp)
上記のようにPawnからActorを操作することが可能ですが、今回はPawnの中にスタティックメッシュを追加しましょう。
親クラスを選択からPawnを選択してください。するとPawnが作られるのでダブルクリックして開きましょう。
ポーンにスタティックメッシュとカメラを設定
ポーンを開くと以下のような画面が現れるのでコンポーネントを追加からStaticMeshを選択してください。
作成されたStaticMeshを選択することにより右側の詳細タブからスタティックメッシュを設定可能です。先ほど作ったスタティックメッシュを設定しましょう。
このように位置をずらしてカメラがプレイヤーオブジェクトをうまく映せるようにします。
ここでいったんプレイヤーをビューポートに表示してみましょう。DefaultPawnClassを先ほど作ったPawnに変更し、最初に作ったスタティックメッシュがビューポートに表示されている場合には削除してしまいましょう。プレイしたらプレイヤーが表示されたら成功です。カメラの位置が悪かったら少し修正してしまいましょう。
ここでは、(X=-300.000000,Y=0.000000,Z=100.000000)(Pitch=-20.000000,Yaw=0.000000,Roll=0.000000)と設定しました。詳細などの各種値は名前の部分を右クリックしてコピーできることも知っておきましょう。
ポーンを物理移動させる
Pawnのブループリントからプロジェクタイルムーブメントを追加しましょう。 ProjectileMovement は projectile 物体をを発射するためのコンポーネントですが、重力が欲しいのと必要十分な機能はあるので今回はこちらを利用します。
この状態で再度実行するとPawnが落ちていくことを確認できるはずです。
なぜ床っぽいものがあるのに落ちて行ってしまうのかそれは当たり判定を実装していないからです。スタティックメッシュを開いて、コリジョンからボックス単純化コリジョンを追加を選択しまして保存しましょう。スタート時にプレイヤーと床が衝突しているとおかしな動作をするので、開始時にプレイヤーが生まれる位置であるPlayerStartを少し高いところにしておきましょう。
正しく動作させるにはもう一つだけ設定が必要となります。プロジェクタイルムーブメントの説明を読むと、通常はアクタのルートコンポーネントが移動するとあり、当たり判定もルートコンポーネントで取得いたしますので、先ほど設定したスタティックメッシュのコリジョンを用いる場合にはスタティックメッシュをドラッグしてルートコンポーネントに移動させましょう。
この状態で実行すると、プレイヤーが地面に着地するでしょう。
プレイヤーコントローラーの作成
ポーンを作ったのと同じ要領で、プレイヤーコントローラーも作ってしまいましょう
新しく作成したプレイヤーコントローラーもワールドセッティングから設定してしまいましょう。プレイヤーコントローラーの設定は今のところはこれだけでいいです。次はポーンのブループリントのノードをいじっていきましょう。
ポーンのイベントグラフでポーンの移動処理を実装
ポーンのイベントグラフを開きましょう。イベントグラフタブを押すことでイベントグラフを編集することが可能です。イベントグラフタブがない場合には、左下のマイブループリントからイベントグラフを開きましょう、それもなければウインドウから表示しましょう。
イベントグラフの何もないところで右クリックカスタムイベントを追加を選択しましょう。二つ必要なので複製してしまいましょう。名前は何でもいいですが、ここでは、VerticalMoveとHorizontalMoveと名付けました。画像の文字の綴りが間違っていますが気にしないでください。
インプットの+をおして、出てきた選択欄からfloatを選びましょう。それを両方のノードに設定します。
コンポーネントのプロジェクタイルムーブメントをイベントグラフ上にドラッグドロップしましょう。そしてピンをドラッグしてSetVelocityを選択しましょう。
とりあえず動かすことができるかTickにつないで確認してみましょう。ここで重力で落ちていってほしいので、Zの値に関してはもともとの値をそのまま入れたいので、GetVelocityも呼び出しましょう。複数の値を持つ速度のピンは、右クリックで分割できるので分割してつないでください。今回Xの値を300にしましたが、あまりに小さい値だと動いているか全くわからない場合があるので、気を付けてください。
これで実行してみても実はまだきちんと動きません。 ProjectileMovement の設定をいくつか変更する必要があります。コンポーネントからProjectileMovementを選択し、プロジェクタイルバウンスの4つの値を変更します。
- ShouldBounce:この値がオフになっていると、地面に触れた時点で動きを止めてしまいますので今回の使い方ではオンにしましょう
- Bounciness:値が入っていると跳ねます。今回はプレイヤーを動かせればいいので跳ねてもいいですが、ついでなので0にしておきます。
- Friction:摩擦です、今回は速度を常に上書きして動かすつもりなので、いらないので0にしておきます。ボールを投げたり転がしたりする場合この値が0だと止まらなくなってしまいます。これだけ設定すればオブジェクトは動き出します。
- BounceVelocityStopSimulatingThreshold:地面に触れた後この閾値より速度が小さい場合にプロジェクタイルが停止します。Updateで動かしている間は問題ないですが、コントローラーで動かす場合には0になることもあるので、最低値の0にしておきましょう。(原因見つけ出すのにものすごく苦労した。)
動くことは確認できたので、入力を受け取るためのカスタムイベントに、以下のようにつなぎましょう。×はfloat*floatです。
コントローラーから操作する
ポーンの作成は終わったので次はコントローラ側を作成しましょう。プレイヤーコントローラーのブループリントを開いてください。左下のような画面が出た場合にはそのままブループリントエディタを開くを押してください。右クリックしてVertical(最初に作った軸マッピングの名前)で検索すると、軸イベントと軸値のノードがあると思いますが、今回は軸イベントを選んでください。
二つの軸イベントを用意して、次にGetControlledPawnノードを探してください。更にCastTo作成したポーン名 のノードを見つけ出してつなげましょう。CastToノードのピンを伸ばしたら、先ほど名付けた名前のノードがあるはずなのでつなげましょう。
最終的には以下のようになります。視認性のためにノードを迂回させたい場合にはRerouteというノードを呼び出してください。
以上でコントローラーからプレイヤーを動かすはとりあえず終了です。
尚移動方向に違和感があった場合、PlayerStartを90度回転させましょう。
まだプレイヤーが回転したりした場合などにいろいろと問題が生じますが、プレイヤーを動かすことができるようになりました。次回はプレイヤーの向きを変更させても正しく動くようにしていく予定です。
今回プレイヤーの移動に、ProjectileMovementを使用しましたが、 AddRelativeLocation 等、他にもオブジェクトを移動させる方法はたくさんあります。ProjectileMovementはプレイヤーを動かすのにそれほど向いていないような気がする。自分が使いやすいと思う操作方法を使ってプレイヤーを制御しましょう。(ProjectileMovementがうまく動かなかった原因を探すの大変だった。)
いろいろと間違っているところもあるかもしれませんので鵜呑みにはせずにこの記事が参考になってくれたら幸いです。