ぼっちゲーム開発

Unreal Engineを中心とした3Dツール周りのネタを備忘録を兼ねて気ままに書き連ねています

Inputを使ってActorを動かす

Input設定のActionマップとAxisマップ

前回はActorの作成をしましたが、今回はInputの設定をしてActorを動かしてみたいと思います。

Input設定にはActionAxisの二つのマップが存在し、これらを使う事によりInputイベントを任意の入力(キーボードボタンやゲームパッドのボタン等)と対応させる事が出来ます。

これにより、もし入力するボタンが変わったとしてもマップを変更するだけの最小限の変更で済みます。

それでは紹介していきたいと思います。

Input設定

まずはレベルエディタの

メニュー > Edit > ProjectSettings

を選択してください。

Project Settings・・・文字通りプロジェクト内の様々な設定をする事が出来ます。 

 

f:id:msyasuda:20160928044854j:plain

 

選択するとProjectSettingsのウインドウが表示されます。

左項目から

Engine > Input

と選択すると、Inputについての設定が表示されます。

その中のBindingsを見ると、Action MappingsAxis Mappingsの二つが存在します。

 

Action Mappings・・・指定の入力と紐づいたPressedとReleased二つの状態のイベントを取得できます。

Axis Mappings・・・指定の入力の押し込み具合によるイベントを取得できます。

 

f:id:msyasuda:20160928050500j:plain

 

今回はオンラインゲームによくあるようなwsadで前後左右動くようにします。

それぞれの各マッピングの横にある+をクリックするとマップが追加され、作成されたマップ名の横にある+をクリックするとバインドが追加されます。

下のように設定します。

 

f:id:msyasuda:20160928052858j:plain

 

レベルブループリントによる制御

アクターをInputから移動させる方法はいくつかありますが、今回は最も簡単なレベルブループリントを使った方法で試したいと思います。

前回のようにCubeからブループリントを作成し、レベルブループリントのEvent Graphを開きます。

前方(後方)への移動

空白でマウス右クリックし、MoveForwardと入力します。

候補からInputs  > Axis Events > MoveForwardを選択します。

 

f:id:msyasuda:20160928053428j:plain

 

これにより設定したMoveForwardの入力イベントを取得する事が出来ます。

次にレベルブループリントからActorを参照出来るようにします。

ビューポート上で作成したCubeを選択した状態で、レベルブループリント画面の空白を右クリックします。

ボックスにCreate a Reference to Cube_BPがあるので選択します。

 

f:id:msyasuda:20160928070417j:plain

 

 Cube_BPのノードが作成されているのを確認出来ます。

 

f:id:msyasuda:20160928070643j:plain

 

作成されたCube_BPノードから現在地を取得します。

Cube_BPからドラッグし、GetActorLocationノードを作成します。

 

f:id:msyasuda:20160928073227j:plain

 

Actorの進行方向を取得します。

Cube_BPからドラッグし、GetActorForwardVectorノードを作成します。

 

f:id:msyasuda:20160928073443j:plain

 

今回は入力に対して+10ずつ移動するようにしたいので、Axis Valueに10掛けます。

Axis Valueからドラッグ > float x float を作成。

 

f:id:msyasuda:20160928073658j:plain

 

進行方向に移動量を掛けます。

Get Actor Forward Vectorをドラッグ > vector x float を作成 > 移動量とつなぐ

 

f:id:msyasuda:20160928073922j:plain

 

Actorの現在置に作成した移動量を持つベクトルと足し、移動後の位置を求めます。

GetActorLocationをドラッグ > vector + vector を作成 > 移動量ベクトルをつなぐ

 

f:id:msyasuda:20160928074219j:plain

 

最後にCube_BPの現在地を移動後の位置で書き換えます。

Cube_BPをドラッグ > SetActorLocationを作成 > 移動後の位置をNew Locationにつなぐ MoveForwardと実行ピン > SetActorLocationをつなぐ

下が完成形です。

 

f:id:msyasuda:20160928074748j:plain

 

また、ノードをつなぐ穴の形をしたものはピンと呼ばれています。

ピンには役割によって種類が分かれます。

ピン・・・ノードについた穴になっている部分

入力ピン・・・ノード左側のデータの入力に使用するピン

出力ピン・・・ノード右側のデータの出力に使用するピン

実行ピン・・・右向きの矢印のようなピン、つなぐ事で処理が実行される。

 

右(左)方向への移動

空白を右クリックし、MoveRightイベントノードを設置します。

f:id:msyasuda:20160928075949j:plain

 

MoveForwardと同じ要領でノードを作成します。

ただし、Get Actor Forward VectorをGet Actor Right Vectorに置き換えてください。

下が完成形です。

 

f:id:msyasuda:20160928080724j:plain

 

Actor位置をリセットする

Actor位置のリセットを実現するために、まずActorの初期位置を保存しておく必要があります。

上の作業で作ったCube_BPの参照をCtrl + Cでコピーし、Event BeginPlayの側でCtrl + Vとする事でノードコピーします。 

 

f:id:msyasuda:20160928091336j:plain

 

次に初期位置を格納する変数を作成します。

変数とはデータを入れる箱のようなものと考えてもらえれば良いと思います。

MyBlueprintパネル > Valiables > + を選択する

すると変数が作成されるのでDetailsパネルを次のように設定します。

Valiable Name : InitLocation

Valiable Type : Vector

 

f:id:msyasuda:20160928091409j:plain

 

変数にはそれぞれ値を取得するGETと値を設定するSETの二つのノードがあります。

MyBlueprintsパネルの変数名を選択した状態で次の操作でノードを設置する事が出来ます。

GET : Ctrl + ドラッグ&ドロップ

SET : Alt + ドラッグ&ドロップ

 

f:id:msyasuda:20160928092944j:plain

 

Event BeginPlayでは初期位置の保存をしなければならないので、Alt + ドラッグ&ドロップでSetノードを設置します。

上でやった要領でGetActorLocationで取得した値をSetにつなぎます。

 

f:id:msyasuda:20160928091452j:plain

 

最後にResetLocationイベントのReleasedでボタンを離した時に、保存しておいたInitLocationをSetActorLocationのNew LocationにSetするようにつなぎます。

この時はInit LocationのGetが必要なので、Ctrl + ドラッグ&ドロップします。

これでActor位置のリセット処理は完了です。

 

f:id:msyasuda:20160928091427j:plain

 

以上で移動処理が出来ましたが、作成したブループリント内のMeshに設定が必要です。

 

MeshのMobilityを変更する

クラスブループリント画面のコンポーネントパネルからStaticMeshを選択します。

画面右のDetailパネルのStatic Mesh項目のMobilityを確認してください。

 

MeshにはMobilityという概念が存在し、移動不可なメッシュか移動可能なメッシュかを区別するようになっています。

この分類により移動する必要のない静的メッシュに無駄な処理が実行されないようになっています。

逆に移動させたいメッシュがStatic設定になっていると動く事はありません。

今回はMeshを移動させたいのでMovableにします。

 

f:id:msyasuda:20160928081321j:plain

 

実行

CompileしてレベルエディタのPlayを押します。

実行するとCubeが移っていません。

これは、ビューの位置がPlayer Startというプレイヤーが配置される場所にあるためです。

 

f:id:msyasuda:20160928084008j:plain

 

ビューの位置を変えるため、Playのプルダウンを押し、Current Camera Locationにします。

 

f:id:msyasuda:20160928084714j:plain

 

これで実行すると・・・

現在のカメラ位置になっている事が確認出来ます。

 

f:id:msyasuda:20160928084941j:plain

 

静止画だとわからないですが、wを押すとCubeが移動しました。

Spaceバーを押す事で、初期位置に戻る事も確認出来ました。

 

f:id:msyasuda:20160928085402j:plain

 

 今回は少し長かったですが、作業は大まかに分けると下記内容を行いました。

  1. Input設定(マッピングバインドの追加)
  2. レベルブループリントで各イベント処理の実装
  3. クラスブループリント内Static MeshのMobility変更

以上、Inputを使ってActorを動かすでした。