ゲーム開発中に、レベル内のアクタにプレイヤーが 入力 を実行できるようにしたい場合があります。例えば、プレイヤーが近づくと宝物箱が開く、ライトのオンオフの切り替えができる、あるいはプレイヤーがボタンを押すと何かしらの影響を与えるインタラクティブなオブジェクトなどです。
アクタに入力を設定すると、プレイヤー入力にそのアクタが反応する方法とタイミングをある程度制御できるようになります。
実装ガイド
このガイドでは、アクタの 入力を有効 または 入力を無効 にする基本的な方法を説明します。アクタの入力を有効にすると、プレイヤーがボタンまたはキーを押してアクタに何かしら影響を及ぼすイベントを実行できるようになります (ライトのオンオフの切り替え、ドアの開閉、何かをアクティブにする、など)。
『入力の使用を有効/無効にする』 セクションでは、 Trigger Volume を使ってプレイヤーがレベル内でアクタの近くにいるかを判断して、入力を有効 / 無効にする方法を説明します。この方法は、近くにいる時、または現実世界のシナリオでアクタに影響しうると考えられる範囲に来た場合のみプレイヤーがアクタに影響を及ぼすようにしたいときに便利です。
アクタの入力を有効にする
この例では、スターターコンテンツを有効にした Blueprint First Person Template を使用します。
以下の方法で、アクタの入力を有効にします。
-
「StarterContent/Blueprints」フォルダ内で、Blueprint_Effect_Fire アセットを開きます。
-
[Event Graph] タブで、グラフ内を 右クリック して、 Event Begin Play ノードを見つけて追加します。
-
グラフ内を 右クリック し、 Get Player Controller ノードを見つけて追加します。
-
グラフ内を 右クリック し、 Enable Input ノードを見つけて追加します。
-
Event Begin Play の出力ピンを Enable Input ノードの入力ピンに接続します。
-
Get Player Controller ノードを Enable Input ノードの Player Controller ピンに接続します。
これが、アクタで入力を有効にする基本的な方法です。
Enable Input ノードは、 Target (通常は Self - 、アクタそのもの) だけでなく Player Controller (入力を与えるプレイヤー) も指定する必要があります。この設定で、 Input Event ノード (キーやマウスボタンの押下など) を見つけて追加し、これらのキーが押されるとアクタに影響を与えるアクションを実行します。
上の例では、 Event Begin Play ノードはゲームが開始すると (レベル内にアクタが存在するならば)、指定された Player Controller に対して Enable Input を宣言します。デフォルトの Player Controller はシングルプレイヤー ゲームに Player Index 0 を使います。マルチプレイヤーのシナリオがある場合、 Player Index 値でプレイヤーを指定することができます。
アクタの入力を無効にする
アクタの入力を有効にするように、 Disable Input ノードを使えばアクタの入力を無効にすることもできます。
上記の例では、前述の方法でアクタの入力を有効にしてから、 E Key Event を追加しました。E キーが押されると、アクタへ入力を与えないように、画面に何らかのテキストを表示してアクタの入力を無効にします。
Enable Input ノードと同様、 Disable Input ノードは Target と Player Controller を指定する必要があります。
入力の使用を有効/無効にする
上記の方法は入力を有効 / 無効にしますが、通常はアクタがプレイヤーから入力を受け取ることを認める場合に何らかの規則が必要でしょう。上記の方法で Event Begin Play の入力を有効化し、(例えば) キーを押してライトをオンオフできる場合、プレイヤーはワールドのどこからでもライトのオンオフが可能になります。
以下のような感じで、プレイヤーがライトの近くにいるかどうかに基づいて入力の有効化 / 無効化を行いたいとします。
-
「StarterContent/Blueprints」フォルダで、Blueprint_CeilingLight アセットを開きます。
-
[Components] パネルで [Add Component] をクリックし、 Sphere Collision を探して追加します。
-
[Details] パネルで、 Variable Name を [Trigger] に、 Z Transform を [-180.0] に、 X, Y, Z の Scale を [8] に設定します。
(プレイヤーが内部の場合) Sphere の入力を有効にし、 (プレイヤーが外側の場合) 入力を無効にします。
-
Event Graph に戻ります。
-
[MyBlueprint] ウィンドウで、 [Trigger] を 右クリック し、 [Add Event] -> [Add OnComponentBeginOverlap] を選びます。
-
[Trigger] を 右クリック し、 [Add Event] -> [Add OnComponentEndOverla] を選びます。
これらの 2 つのノードはグラフへ追加しなければなりません。
-
Begin Overlap ノードの Other Actor ピンを引き出し Cast To FirstPersonCharacte ノードを探して追加します。
ここでは、 FirstPersonCharacter (Project Template のデフォルトのプレイヤー キャラクター) というアクタが Trigger をオーバーラップすると何かをするようにします。
-
End Overlap ノードの Other Actor ピンを引き出し Cast To FirstPersonCharacter ノードを追加します。
-
Get Player Controller ノード、 Enable Input ノード、 Disable Input ノードを 右クリック して追加します。
-
以下のようにノードを接続します。
プレイヤーがトリガー領域に入る時のみ入力は有効になり、プレイヤーがトリガーを離れると無効になります。これにより、プレイヤーがワールドのどこからでもアクタに影響してしまうことを防ぎ、作成したトリガー領域の内部にいる場合のみに制限されます。
-
E Key Event を 右クリック し Print String ノードに追加します。
-
コンパイル し 保存 してから、ブループリントを終了します。 (もし警告が表示されても、無視して次のステップへ進んでください)。
-
Blueprint_CeilingLight をレベルにドラッグし、 [Play] ボタンをクリックしてエディタで再生します。
再生中にライトから離れた場所にいる時に E を押しても、何も起こりません。ライトに近づいて(トリガー内で) E を押すと、「Hello」というテキストがウィンドウの左上隅に表示されます。この例では Print String ノードを接続しましたが、キーを押した時にプレイヤーがトリガー領域内にいる場合、ライトのカラー、明るさ、その他の設定を切り替えることができます。
入力の詳細
上の例の E Key Event を Space Bar Key Event に置き換えて使ってみます。エディタで再生した場合、どうなるでしょうか。ライト用のトリガー領域の外にいる場合 スペースバー を押すとジャンプすることができますが、トリガー領域内に入ると スペースバー を押してもジャンプはしませんが、その代りに Print String とテキスト「 Hello 」を呼び出します。これは Input Priority によるものです。
入力コマンドを共有すると (この場合では、ライトに割り当てた入力と Jump は両方とも スペースバー に結びついています)、優先度の低いアクションが無視されます。Light ブループリント内で Space Bar Key Event をクリックし [Details] パネルを見ると、 Consume Input 用のオプションがあるはずです。
[Consume Input] チェックボックスのチェックを外し、再びエディタで再生すると、ライトのトリガー ボリュームの内外でのジャンプが可能になっているはずです。ライトのトリガー ボリューム内で スペースバー を押すと、 Print String ノードと表示する「Hello」というテキストも呼び出します。
また、 [Input Details] ウィンドウには、 [Execute when Paused] (一時停止 (paused) ステート中にこのキーを押してコマンドの実行を可能にします) と [Override Parent Binding] (親クラスで設定されているバインディングの削除を可能にします) のオプションがあります。