docs.unity3d.com
    目次を表示する/隠す

    入力のための GameObject コンポーネント

    Input System には、入力の設定と操作を簡素化する 2 つの MonoBehaviour コンポーネントが用意されています。

    コンポーネント 説明
    PlayerInput 1 人のプレイヤーと、そのプレイヤーに関連付けられている Input Action を表します。
    PlayerInputManager 複数の同時ユーザーに対応できる設定 (ゲーム内のプレイヤーロビーや画面分割ゲームプレイなど) を処理します。

    ノート: これらのコンポーネントは Input System API の上に構築されています。したがって、実行される処理はすべて、開発者が自分でプログラムできるものです。これらのコンポーネントの主な目的は、そのまま使用できる簡単な設定として、カスタムスクリプトの必要性を大幅に削減することです。

    PlayerInput コンポーネント

    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 の各コールバック に渡されるものと同じです。

    PlayerInput の UnityEvent
    Invoke CSharp Events Invoke Unity Events と同様ですが、イベントは、PlayerInput API で使用できるプレーン C# イベントです。これらをインスペクターから設定することはできません。代わりに、スクリプト内でイベントにコールバックを登録する必要があります。

    以下のイベントを使用できます。

    • onActionTriggered (プレイヤーのすべてのアクションに対応する集合的なイベント)
    • onDeviceLost
    • onDeviceRegained

    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 インスタンスの作成と生存期間を自動的に管理します。

    PlayerInputManager

    プロパティ 説明
    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 インスタンスが渡されます。
    トップに戻る
    Copyright © 2023 Unity Technologies — 商標と利用規約
    • 法律関連
    • プライバシーポリシー
    • クッキー
    • 私の個人情報を販売または共有しない
    • Your Privacy Choices (Cookie Settings)