入力のための GameObject コンポーネント
Input System には、入力の設定と操作を簡素化する 2 つの MonoBehaviour
コンポーネントが用意されています。
コンポーネント | 説明 |
---|---|
PlayerInput |
1 人のプレイヤーと、そのプレイヤーに関連付けられている Input Action を表します。 |
PlayerInputManager |
複数の同時ユーザーに対応できる設定 (ゲーム内のプレイヤーロビーや画面分割ゲームプレイなど) を処理します。 |
ノート: これらのコンポーネントは Input System API の上に構築されています。したがって、実行される処理はすべて、開発者が自分でプログラムできるものです。これらのコンポーネントの主な目的は、そのまま使用できる簡単な設定として、カスタムスクリプトの必要性を大幅に削減することです。
PlayerInput
コンポーネント
各 PlayerInput
インスタンスは、単独のプレイヤーまたはユーザーを表します。複数の PlayerInput
インスタンスを同時に存在させて (同一の GameObject
(ゲームオブジェクト) に含めることはできませんが)、ローカルマルチプレイヤー設定を表すこともできます。Input System では、各プレイヤーとそのプレイヤーが排他的に使用する一意の一揃いの Device を一対にします。ただし、手動で 2 人以上のプレイヤーが 1 つの Device を共有するように組み合わせることもできます (例えば、キーボードを左右に分けたり、ホットシートモードを使用したりできます)。
各 PlayerInput
は 1 つの InputUser
に対応します。PlayerInput.user
を使用すると、コンポーネントから InputUser
を照会できます。
PlayerInput
を設定するには、以下のプロパティを使用します。
プロパティ | 説明 |
---|---|
Actions |
プレイヤーに関連付けられている一揃いの Input Action。入力を受け取るには、各プレイヤーに一揃いの Action が関連付けられている必要があります。詳細については、Action に関するドキュメントを参照してください。 |
Default Control Scheme |
デフォルトで有効にする Control Scheme (Control Scheme) (Action で定義されているものから選択)。 |
Default Action Map |
デフォルトで有効にする、Actions 内の Action Map (Action Map)。None に設定すると、有効な Action がない状態でプレイヤーが開始します。 |
Camera |
プレイヤーに関連付けられている個別のカメラ。split-screen (画面分割) 設定を使用する場合にのみ必要です。それ以外の場合は効果はありません。 |
Behavior |
このプレイヤーに発生したできごとを、PlayerInput コンポーネントがゲームコードに通知する方法を決定します。通知動作 に関するドキュメントを参照してください。 |
Action
入力を受け取るには、各プレイヤーに一連の Input Action が関連付けられている必要があります。PlayerInput
インスペクターの Create Actions ボタンを使用すると、Input System によってデフォルトセットの Action が作成されます。ただし、PlayerInput
コンポーネントには、Action の組み合わせに関する制限はありません。
PlayerInput
は、Action の 有効化と無効化 を自動的に処理し、Actionへの コールバック のインストールも行います。複数の PlayerInput
コンポーネントが同じ Action を使用する場合、各コンポーネントはそれぞれ自動的に Action のコピー を作成します。
PlayerInput
を初めて有効にすると、Default Action Map
(デフォルトの Action Map) のすべての Action が有効になります。デフォルトの Action Map がない場合、PlayerInput
は、どの Action も有効にしません。手動で Action を有効にするには、PlayerInput
を使用しない場合 と同様に、Action Map または Action の Enable
と Disable
を呼び出します。現在有効になっている Action Map を確認したり、別の Action Map に切り替えたりするには、PlayerInput.currentActionMap
プロパティを使用します。Action Map 名を指定して Action Map を切り替えるために、PlayerInput.SwitchCurrentActionMap
を呼び出すこともできます。
プレイヤーの入力を無効にするには、PlayerInput.DeactivateInput
を呼び出します。再び有効にするには、PlayerInput.ActivateInput
を呼び出します。後者の場合は、デフォルトの Action Map があると、それが有効になります。
PlayerInput
を無効にすると、現在アクティブな Action Map (PlayerInput.currentActionMap
) が自動的に無効になり、プレイヤーと組み合わされているすべての Device の関連付けが解除されます。
プレイヤーによって Action がトリガーされたときに通知を受け取る方法については、この後の 通知動作 セクションを参照してください。
SendMessage
/BroadcastMessage
Action
PlayerInput
の 通知動作 が、Send Messages
または Broadcast Messages
に設定されている場合は、以下のように、コンポーネント内にメソッドを定義してアプリケーションを Action に応答させることができます。
public class MyPlayerScript :MonoBehaviour
{
//"fire" アクションが "OnFire" メソッドになります。アクションを
//トリガーしたコントロールの値を参照する必要がない場合は、メソッドを
//引数なしで使用します。
public void OnFire()
{
}
//アクションをトリガーしたコントロールの値を参照する場合は、
//InputValue 型のパラメーターを宣言できます。
public void OnMove(InputValue value)
{
//コントロールから値を読み取ります。型は、アクションがバインドされているコントロールの
//タイプによって異なります。
var v = value.Get<Vector2>();
//重要: 渡された InputValue が有効なのは、コールバックの存続期間中のみです。
//InputValue の参照をどこかに格納して後で Get<T>() を呼び出しても、
//正しく動作しません。
}
}
Send Messages
を使用する場合は、同じ GameObject
上に、Broadcast Messages
を使用する場合は、いずれかの子 GameObject
上にコンポーネントが存在している必要があります。
UnityEvent
Action
PlayerInput
の 通知動作 が Invoke Unity Events
に設定されている場合は、各 Action をターゲットメソッドにルーティングする必要があります。メソッドの形式は、InputAction
の started
、performed
、canceled
の各コールバック と同じです。
public class MyPlayerScript :MonoBehaviour
{
public void OnFire(InputAction.CallbackContext context)
{
}
public void OnMove(InputAction.CallbackContext context)
{
var value = context.ReadValue<Vector2>();
}
}
通知動作
インスペクターで Behavior
(動作) プロパティを使用すると、プレイヤーに関連するできごとが発生したときに、PlayerInput
コンポーネントからどのようにゲームコードに通知するかを決定できます。
以下のオプションを使用できます。
Behavior | 説明 |
---|---|
Send Messages |
PlayerInput コンポーネントが含まれている GameObject の GameObject.SendMessage を使用します。 |
Broadcast Messages |
PlayerInput コンポーネントが含まれている GameObject の GameObject.BroadcastMessage を使用します。これにより、GameObject 階層構造で下方向にメッセージがブロードキャストされます。 |
Invoke Unity Events |
メッセージの種類ごとに別個の UnityEvent を使用します。このオプションを選択すると、PlayerInput で使用できるイベントに Events 折りたたみからアクセスできます。Action に対してトリガーされたイベントに渡される引数は、started 、performed 、canceled の各コールバック に渡されるものと同じです。 |
Invoke CSharp Events |
Invoke Unity Events と同様ですが、イベントは、PlayerInput API で使用できるプレーン C# イベントです。これらをインスペクターから設定することはできません。代わりに、スクリプト内でイベントにコールバックを登録する必要があります。以下のイベントを使用できます。
|
PlayerInput
は、アクションごとの通知に加えて、以下の全般的な通知も送信します。
通知 | 説明 |
---|---|
DeviceLostMessage |
プレイヤーに割り当てられている Device の 1 つが失われました。この状況は、例えば、ワイヤレスデバイスのバッテリが切れた場合に発生する可能性があります。 |
DeviceRegainedMessage |
プレイヤーが Device の喪失から回復し、再開可能になったときにトリガーされる通知。 |
Device の割り当て
各 PlayerInput
には、1 つ以上の Device を割り当てることができます。デフォルトで 2 つの PlayerInput
コンポーネントが同一の Device に割り当てられることはありませんが、これを強制的に行うことができます。そのためには、PlayerInput.Instantiate
を呼び出すときに手動で Device をプレイヤーに割り当てるか、PlayerInput
の InputUser
の InputUser.PerformPairingWithDevice
を呼び出します。
PlayerInput
コンポーネントに Device が割り当てられている場合は、このコンポーネントが、それらの Device を関連付けられている Action アセット内の Control Scheme と照合し、Input Device に一致する Control Scheme だけを有効にします。
UI 入力
PlayerInput
コンポーネントは、InputSystemUIInputModule
と連携して UI システム を作動させることができます。
これを設定するには、PlayerInput
コンポーネントの UI Input Module
フィールドに、InputSystemUIInputModule
コンポーネントへの参照を割り当てます。これが正しく機能するには、PlayerInput
コンポーネントと InputSystemUIInputModule
コンポーネントが、同じ InputActionAsset
を使用するように設定されている必要があります。
この設定が完了すると、PlayerInput
コンポーネントは、特定のプレイヤーの Action を設定するときに、同じ Action 設定を InputSystemUIInputModule
にも割り当てるようになります。つまり、プレイヤーの制御に使用されるものと同じ Action 設定および Device 設定によって UI も制御されます。
MultiplayerEventSystem
コンポーネントを使用して UI イベントを送出する場合も、この設定を使用して、別々のプレイヤーによって制御される複数の UI インスタンスを同時に画面上に配置できます。
PlayerInputManager
コンポーネント
ノート: Input System パッケージには、
Simple Multiplayer
というサンプルが付属しており、Unity エディターのパッケージマネージャー UI からインストールできます。このサンプルは、PlayerInputManager
を使用して単純なローカルマルチプレイヤーシナリオを設定する方法の実例を示しています。
Player Input
システムを使用すると、1 つの画面と複数のコントローラーを持つ 1 台のデバイスを複数のプレイヤーで共有する、ローカルマルチプレイヤーゲームの設定が簡単になります。これを設定するには、PlayerInputManager
コンポーネントを使用します。このコンポーネントは、ゲームへのプレイヤーの参加と離脱に合わせて、PlayerInput
インスタンスの作成と生存期間を自動的に管理します。
プロパティ | 説明 |
---|---|
Notification Behavior |
接続されているプレイヤーに対する変更について、PlayerInputManager コンポーネントがゲームコードに通知する方法を指定します。この動作は PlayerInput コンポーネントと同じです。 |
Join Behavior |
参加が有効になっている場合に、プレイヤーが参加できるメカニズムを決定します。Join Behavior (参加動作) に関するドキュメントを参照してください。 |
Player Prefab |
ゲーム内のプレイヤーを表すプレハブ。PlayerInputManager コンポーネントは、新しいプレイヤーが参加するたびにこのプレハブのインスタンスを作成します。このプレハブには、階層内に 1 つ PlayerInput コンポーネントが必要です。 |
Joining Enabled By Default |
このプロパティが有効になっている場合は、Join Behavior で指定されたメカニズムによって、新しいプレイヤーが参加できます。 |
Limit Number of Players |
ゲームに参加できるプレイヤーの数を制限するには、このプロパティを有効にします。 |
Max Player Count (Limit number of Players が有効な場合にのみ表示されます。) |
ゲームに参加できるプレイヤーの最大数。 |
Enable Split-Screen |
有効になっている場合は、使用可能な画面領域の一部が自動的に各プレイヤーに割り当てられます。画面分割 マルチプレイヤーに関するドキュメントを参照してください。 |
参加動作
インスペクターで Join Behavior
(参加動作) プロパティを使用すると、新しいプレイヤーをゲームに追加するタイミングが PlayerInputManager
コンポーネントでどのように決定されるかを指定できます。以下のオプションから、PlayerInputManager
で使用する特定のメカニズムを選択できます。
Behavior | 説明 |
---|---|
Join Players When Button IsPressed |
どのプレイヤーとも組み合わされていない Device でのボタンの押下をリッスンします。プレイヤーがボタンを押して参加が許可されたら、ボタンが押された Device を使用して新しいプレイヤーを追加します。 |
Join Players When Join Action Is Triggered |
Join Players When Button IsPressed と同様ですが、プレイヤーによってトリガーされたコントロールが、開発者によって定義された特定のアクションに一致する場合にのみ、プレイヤーの参加を許可します。例えば、プレイヤーが特定のゲームパッドボタンを押したときに参加するように設定できます。 |
Join Players Manually |
プレイヤーを自動的には追加しません。新しいプレイヤーを参加させるには、明示的に JoinPlayer を呼び出します。または、GameObject を直接作成して PlayerInput コンポーネントを追加すると、Input System によって自動的に参加が許可されます。 |
画面分割
Split-Screen
オプションを有効にすると、PlayerInputManager
は、使用可能なスクリーンスペースをアクティブなプレイヤー間で自動的に分割します。これを機能させるには、PlayerInput
プレハブで Camera
プロパティを設定する必要があります。PlayerInputManager
は、それぞれのカメラインスタンスのサイズと位置を自動的に変更して、各プレイヤーに固有の画面の部分を割り当てます。
Split-Screen
オプションを有効にした場合は、以下の追加プロパティをインスペクターで設定できます。
プロパティ | 説明 |
---|---|
Maintain Aspect Ratio |
値が false の場合、ゲームで画面を分割するときに、画面解像度とは異なるアスペクト比の画面領域を生成できます。 |
Set Fixed Number |
この値が 0 より大きい場合、PlayerInputManager は、実際のプレイヤーの数とは関係なく、常に固定数の矩形に画面を分割します。 |
Screen Rectangle |
プレイヤーの分割画面を割り当てるために使用できる、正規化された画面矩形。 |
デフォルトでは、ゲーム内のすべてのプレイヤーがすべての UI 要素を操作できます。ただし、画面分割が設定されたゲームでは、特定の 1 つのカメラに限定されたスクリーンスペース UI を構築することができます。PlayerInput
、InputSystemUIInputModule
、MultiplayerEventSystem
の各コンポーネントを使用して、これを設定する方法については、前述の UI 入力 セクションを参照してください。
PlayerInputManager
の通知
PlayerInputManager
は、現在のプレイヤーの設定に何らかの目立った変化が生じたときに通知を送信します。これらの通知は、PlayerInput
の場合と同様 に Notification Behavior
プロパティに従って配信されます。
ゲームでは、以下の通知をリッスンできます。
通知 | 説明 |
---|---|
PlayerJoinedMessage |
新しいプレイヤーがゲームに参加しました。参加したプレイヤーの PlayerInput インスタンスが渡されます。ノート: PlayerInputManager が有効化されたときに既にアクティブな PlayerInput コンポーネントが存在する場合、PlayerInputManager は、それらの各コンポーネントに Player Joined 通知を送信します。 |
PlayerLeftMessage |
プレイヤーがゲームから離脱しました。離脱したプレイヤーの PlayerInput インスタンスが渡されます。 |