ビデオの内容紹介
前々回 (サードパーソン ブループリント ゲーム入門 (11) – アニメーション ブループリントの EventGraph) は、キャラクターの動きを判定して速度の変数に値を入れるまでをアニメーション ブループリントのイベントグラフで組みました。そして、前回 (サードパーソン ブループリント ゲーム入門 (12) – キャラクター ブループリントのコンポーネント) は、その値を供給するキャラクターブループリントを作りました。今回は、そのキャラクターブループリントのイベントグラフで、キーボードやマウスで入力された値がキャラクターに伝わるようにします。
原題 Introduction to Third Person Blueprint game – 13 – Character Blueprint : Keyboard and Mouse Controls
[1] 前進の入力
キーボードの W、S (など) によって MoveForward が入力されると、その動き (Movement) がキャラクターに伝わるようにします。
まず、メインエディタのコンテンツ ブラウザで、Character フォルダを選択状態にして、MyCharacter をダブルクリックして開きます。
EventGraph を開きます。
スペースで右クリックして、[軸イベント] の MoveForward (前進) を選択します。
InputAxisMoveForward というイベントが設置されました。
これは、MoveForward という Axis (軸=制御の軸となるもの) が入力されると、右側の白い実行ピンにつながっているものが発動するものです (今はまだ何もつながれてませんが) 。
ところで、この Axis は、サードパーソン ブループリント ゲーム入門 (5) 入力関係の準備で既に用意してあります。
青く囲ったものが Axis です。オレンジ色が Key です。Key を使うと、Axis が入力されることになります。今回は、この青い Axis のうち、MoveForward、MoveRight、Trun、LookUp の入力について処理して行きます (アニメーション ブループリントに連絡できるようにします)。
話を元に戻します。スペースで右クリックして AddMovementInput を選択します。
この AddMovementInput という関数は、指定された方向 (World Direction) に動き (movement) をそのポーン (この場合、キャラクター) に追加 (add) する機能があります。
キーワード AddMovementInput
少し詳しく見てみます。AddMovementInput は、Pawn クラスに含まれている関数です。たとえば、APawn というドキュメンテーションでは、Functions (関数) 一覧に AddMovementInput 関数が入っています (APawn クラスは、プログラミング言語 C++ による Pawn クラスのことです。ブループリントの裏側と考えてください)。Achracter クラスはこの APawn クラスの子クラスなので、この AddMovementInput 関数も継承されます。
本線に戻ります。InputAxis MoveForward の実行ピンを AddMovementInput の実行ピンと結びつけます。つまり、InputAxis MoveForward が起動すると、AddMovementInput が実行されることになります。Scale Value は、すでに決まっています。
1.0 は、大きくも小さくもないので、動かした分がそのまま AddMovementInput に渡されます。マイナスの値は反対方向に動くことになります。
次に、World Direction (ワールド空間における方向) に入れる値を作ります。つまり、World Direction は、どちらの方向に前進すると良いかを定めるものです。まず、GetControlRotation (コントローラーの回転を取得する) という関数を使います。
コントローラーとは、Pawn クラス (この場合は Character クラス) をコントロールする実体的なクラスのことです。まだ Character クラスが動く前の段階のことなので、Cotroller クラスとなっています。もっと具体的に言えば、プレイヤーがキーボードを使ってキャラクター (Character クラス) を動かそうとする時に使うクラスです。そのクラスの回転を取得しています。
次に、BreakRot を使ってこの回転を分解します。
Pitch、Yaw、Roll の成分に分解して、Yaw だけを使いたいからです。Yaw は地面に平行な回転のことで、ビューポートでは青色になります。
次に、MakeRot を使って新たな回転を作成します。
(Yaw は Yaw につなぎます。)
ここで、Pitch と Roll には何も値を供給しません。つまり 0.0 のままにしておきます。するとどういうことになるかと言うと、地面に平行にしかキャラクターの向きだけが考慮されることになります。
次に、GetForwardVector を使って、角度をベクターに直します。(なお、キャラクターを回転させていない場合の Get Forward Vector の値は (1,0,0) です。キャラクターを正反対方向に回転させると、(-1, 0, 0) となります。)
これが方向となります。だから、AddMovementInput の World Direction につなぐことができます。
[2] 右方向移動の入力
キーボードの A、D (など) によって MoveRight が入力されると、その動き (Movement) がキャラクターに伝わるようにします。
スペースを右クリックして、イベント MoveRight を選びます。
これも先に作った Axis の MoveRight のことです。
さらに、World Direction は先に作ったものを利用します。どの時点でもキャラクターの向きは 1 つしかないですから。
以上をひとまとめにして、コメントを付けて後から見ても分かるようにしておきます。(コメントは、左クリックしながら範囲指定して、C を押します。)
[3] 横方向の回転を入力
マウスの X ボタンによって Turn が入力されると、その回転 (Yaw) がキャラクターに伝わるようにします。(TurnRate などは後回しにします。まずは、キーボードとマウス関係に限定してブループリントをセットアップします。)
まず、スペースを右クリックして、Turn イベントを出します。
これを AddControllerYawInput につなぎます。
この AddControllerYawInput は、コントローラーに Yaw を追加します。つまり、これによって、キャラクターが回転するようになります。
[4] カメラの上下方向の回転を入力
マウスの Y ボタンによって LookUp が入力されると、その回転 (Pitch) がキャラクターに伝わるようにします。(LookUpRate などは後回しにします。)
スペースを右クリックして、LookUp イベントを出します。
さらに AddControllerPitchInput につなぎます。
AddControllerPitchInput によって、カメラが上下方向に回転するようになります。
これらをまとめて、コメントを付けておきます。
[5]ジャンプの入力
キーボードのスペースバーによって Jump が入力されると、キャラクターがジャンプします。
まず、Jump イベントを出します。
キーボードのスペースバーを押すと、Jump イベントが発生するので、その実行ピンに、キャラクターをジャンプさせる関数 Jump をつなげます。
ジャンプはこれだけです。最後にコメントを付けておきます。
コメント
自分の環境では特にデフォルトで割り当てられているキーがなかったのですが、プレイモード時には上下左右キーで画面を動かせます。
他にどの部分が、このデフォルトのキーを制御している可能性があるでしょうか?
なるほど、そちらの設定にあったんですね。
試してみます、たびたび失礼しました。
こんにちはいつも参考にさせてもらっています。
キー制御をしていてハマってしまったんですが、デフォルトでupキー割り当てられているblueprintって何でしょうか?
再生すると上下左右キーを使うことで、画面をグリグリ動かせますが、この動きと、新たに追加したblueprintが競合してしまいます。
blendegg さん、こんにちは。
ゆっくりしていってくださいね。
ご質問を私が正しく理解していましたら、「デフォルトでupキー割り当て」を行うものは、ブループリントではなく、メインメニューの [編集] (Edit) にある [プロジェクトの設定] (Project Settings) の [Input] だと思います。
もしも、たとえば、Upキーを前進(MoveForward) にバインディングしたくない場合は、Upキー横についている×ボタンをクリックします。(その後、Upキーを別の動作にバインディングするためには、その希望の動作の項目に行って展開して、+ボタンをクリックしてからバインディングします。)
以下は蛇足ですが、もし、言語を日本語にしてお使いの場合は、誤って「↑」 が PageUp キーのことになっているようですので、注意が必要です。