Inputを使ってActorを動かす
Input設定のActionマップとAxisマップ
前回はActorの作成をしましたが、今回はInputの設定をしてActorを動かしてみたいと思います。
Input設定にはActionとAxisの二つのマップが存在し、これらを使う事によりInputイベントを任意の入力(キーボードボタンやゲームパッドのボタン等)と対応させる事が出来ます。
これにより、もし入力するボタンが変わったとしてもマップを変更するだけの最小限の変更で済みます。
それでは紹介していきたいと思います。
Input設定
まずはレベルエディタの
メニュー > Edit > ProjectSettings
を選択してください。
Project Settings・・・文字通りプロジェクト内の様々な設定をする事が出来ます。
選択するとProjectSettingsのウインドウが表示されます。
左項目から
Engine > Input
と選択すると、Inputについての設定が表示されます。
その中のBindingsを見ると、Action MappingsとAxis Mappingsの二つが存在します。
Action Mappings・・・指定の入力と紐づいたPressedとReleased二つの状態のイベントを取得できます。
Axis Mappings・・・指定の入力の押し込み具合によるイベントを取得できます。
今回はオンラインゲームによくあるようなwsadで前後左右動くようにします。
それぞれの各マッピングの横にある+をクリックするとマップが追加され、作成されたマップ名の横にある+をクリックするとバインドが追加されます。
下のように設定します。
レベルブループリントによる制御
アクターをInputから移動させる方法はいくつかありますが、今回は最も簡単なレベルブループリントを使った方法で試したいと思います。
前回のようにCubeからブループリントを作成し、レベルブループリントのEvent Graphを開きます。
前方(後方)への移動
空白でマウス右クリックし、MoveForwardと入力します。
候補からInputs > Axis Events > MoveForwardを選択します。
これにより設定したMoveForwardの入力イベントを取得する事が出来ます。
次にレベルブループリントからActorを参照出来るようにします。
ビューポート上で作成したCubeを選択した状態で、レベルブループリント画面の空白を右クリックします。
ボックスにCreate a Reference to Cube_BPがあるので選択します。
Cube_BPのノードが作成されているのを確認出来ます。
作成されたCube_BPノードから現在地を取得します。
Cube_BPからドラッグし、GetActorLocationノードを作成します。
Actorの進行方向を取得します。
Cube_BPからドラッグし、GetActorForwardVectorノードを作成します。
今回は入力に対して+10ずつ移動するようにしたいので、Axis Valueに10掛けます。
Axis Valueからドラッグ > float x float を作成。
進行方向に移動量を掛けます。
Get Actor Forward Vectorをドラッグ > vector x float を作成 > 移動量とつなぐ
Actorの現在置に作成した移動量を持つベクトルと足し、移動後の位置を求めます。
GetActorLocationをドラッグ > vector + vector を作成 > 移動量ベクトルをつなぐ
最後にCube_BPの現在地を移動後の位置で書き換えます。
Cube_BPをドラッグ > SetActorLocationを作成 > 移動後の位置をNew Locationにつなぐ MoveForwardと実行ピン > SetActorLocationをつなぐ
下が完成形です。
また、ノードをつなぐ穴の形をしたものはピンと呼ばれています。
ピンには役割によって種類が分かれます。
ピン・・・ノードについた穴になっている部分
入力ピン・・・ノード左側のデータの入力に使用するピン
出力ピン・・・ノード右側のデータの出力に使用するピン
実行ピン・・・右向きの矢印のようなピン、つなぐ事で処理が実行される。
右(左)方向への移動
空白を右クリックし、MoveRightイベントノードを設置します。
MoveForwardと同じ要領でノードを作成します。
ただし、Get Actor Forward VectorをGet Actor Right Vectorに置き換えてください。
下が完成形です。
Actor位置をリセットする
Actor位置のリセットを実現するために、まずActorの初期位置を保存しておく必要があります。
上の作業で作ったCube_BPの参照をCtrl + Cでコピーし、Event BeginPlayの側でCtrl + Vとする事でノードコピーします。
次に初期位置を格納する変数を作成します。
変数とはデータを入れる箱のようなものと考えてもらえれば良いと思います。
MyBlueprintパネル > Valiables > + を選択する
すると変数が作成されるのでDetailsパネルを次のように設定します。
Valiable Name : InitLocation
Valiable Type : Vector
変数にはそれぞれ値を取得するGETと値を設定するSETの二つのノードがあります。
MyBlueprintsパネルの変数名を選択した状態で次の操作でノードを設置する事が出来ます。
GET : Ctrl + ドラッグ&ドロップ
SET : Alt + ドラッグ&ドロップ
Event BeginPlayでは初期位置の保存をしなければならないので、Alt + ドラッグ&ドロップでSetノードを設置します。
上でやった要領でGetActorLocationで取得した値をSetにつなぎます。
最後にResetLocationイベントのReleasedでボタンを離した時に、保存しておいたInitLocationをSetActorLocationのNew LocationにSetするようにつなぎます。
この時はInit LocationのGetが必要なので、Ctrl + ドラッグ&ドロップします。
これでActor位置のリセット処理は完了です。
以上で移動処理が出来ましたが、作成したブループリント内のMeshに設定が必要です。
MeshのMobilityを変更する
クラスブループリント画面のコンポーネントパネルからStaticMeshを選択します。
画面右のDetailパネルのStatic Mesh項目のMobilityを確認してください。
MeshにはMobilityという概念が存在し、移動不可なメッシュか移動可能なメッシュかを区別するようになっています。
この分類により移動する必要のない静的メッシュに無駄な処理が実行されないようになっています。
逆に移動させたいメッシュがStatic設定になっていると動く事はありません。
今回はMeshを移動させたいのでMovableにします。
実行
CompileしてレベルエディタのPlayを押します。
実行するとCubeが移っていません。
これは、ビューの位置がPlayer Startというプレイヤーが配置される場所にあるためです。
ビューの位置を変えるため、Playのプルダウンを押し、Current Camera Locationにします。
これで実行すると・・・
現在のカメラ位置になっている事が確認出来ます。
静止画だとわからないですが、wを押すとCubeが移動しました。
Spaceバーを押す事で、初期位置に戻る事も確認出来ました。
今回は少し長かったですが、作業は大まかに分けると下記内容を行いました。
以上、Inputを使ってActorを動かすでした。