クロスプラットフォームの入力アクションシステムを使用すると、アクションを接続し、さまざまなハードウェア入力に対してバインディングを整理できます。 コンテキストと組み合わせることで、プレイのどのフェーズでも、どのデバイスでも機能するモジュラー入力システムを簡単に構成および編集できます。 使用例には以下が含まれます。
- プレイヤーがバトルモードまたは観客モードにいるかどうかに応じて、アクションが動的に入れ替わる一人称シューティングシステム。
- 加速/減速、車のブースター、給油ステーションを備えた包括的な運転システム。
- 格闘ゲームのアビリティシステムのホットキーで、プレイヤーがパンチを逃すことなく、シームレスに動きを入れ替えます。
入力コンテキスト
InputContextは、関連する入力アクションを保持するアクションのコレクションです。たとえば、ゲーム内キャラクターの操作用のPlayContextや、UIメニューをナビゲートするための操作用のNavContextがあります。 Enabledプロパティを介してコンテキストを有効/無効にすることができ、たとえば、インベントリメニューが開いているときにNavContextを有効にし、プレイヤーがメニューを閉じて主要なゲームプレイに戻るときにPlayContextに切り替えることができます。
ゲームが最初に複数の入力コンテキストを使用しない場合でも、入力システムの最上位レベルにプライマリコンテキストを作成することをお勧めします。たとえば、ゲームプレイ中に発生する入力用のPlayContextインスタンスです。
フォルダーに新しいInputContextを挿入し、名前をPlayContextに変更します。

入力アクション
InputActionは、「ジャンプ」、「スプリント」、「射撃」などのゲームプレイアクションメカニクスを定義します。これらのアクションは、入力バインディングを使用してハードウェア入力にマッピングされます。
InputActionは、そのTypeプロパティ(Enum.InputActionType)に応じて、いくつかのバリエーションを持つことができます。デフォルトはBoolで、ButtonA、E、またはMouseLeftButtonなどの入力の押下/解放からtrue/falseの値を受け取るように設計されています。
| 入力アクションタイプ | 使用例 |
|---|---|
| Bool | ジャンプ、射撃、スプリントなどのトリガーされたアクションで、アナログ入力の押下/解放のしきい値をサポートします。 |
| Direction1D | 車のアクセルペダルやビューのズームレベルなど、変動するゼロからフルのアクション。 |
| Direction2D | カメラの回転や標準のRobloxキャラクターの移動など、2Dの方向移動。 |
| Direction3D | 上下に浮遊し、加速/減速し、左右にドリフトできる空中の車両のような3Dの方向移動。 |
| ViewportPosition | マウス入力のような2Dビューポート座標で、カスタムカーソルやレイキャスティングでワールドオブジェクトを選択するために使用されます。 |
シンプルなキャラクタースプリントのためのInputActionをテストするには:
- 推奨エクスプローラーで最上位のWorkspaceオブジェクトを選択し、プロパティウィンドウでPlayerScriptsUseInputActionSystemプロパティをEnabledに設定します。
ReplicatedStorage内のPlayContextコンテキストに新しいInputActionを作成します。専用のアクションを示すために、名前をCharacterSprintに変更します。

入力バインディング
InputBindingは、親のInputActionをトリガーするハードウェアバインディングを定義します。たとえば、キーの押下、ゲームパッドのボタン、またはタッチ対応デバイスでのタップです。 クロスプラットフォームの互換性のために、各InputActionには、ゲームパッド、キーボード/マウス、およびタッチのためのInputBindingが必要です。

Robloxは、移動、カメラ操作、および基本的な環境との相互作用のためのデフォルトの入力バインディングを提供します — Robloxプレイヤーはこれらの操作に慣れていますので、特定のケースでのみそれらをオーバーライドする必要があります。また、予約済みの入力はオーバーライドすることができず、常にその意図された目的で機能します。
| アクション | マウス/キーボード | ゲームパッド | タッチ |
|---|---|---|---|
| Robloxメニューを開く | Esc | Startボタン (ButtonStart) | 該当なし |
| デベロッパーコンソール | F9 | 該当なし | 該当なし |
| 全画面モード (Windows) デスクトップ表示 (Mac) | F11 | 該当なし | 該当なし |
| ビデオを録画 (Windows) | F12 | 該当なし | 該当なし |
| スクリーンショットを撮る | PrintScreen | 該当なし | 該当なし |
親のInputActionに割り当てられたTypeは、子のInputBindingインスタンスに対して有効な一般的な入力タイプ(キー/ボタン/タップ、アナログトリガー、スティックなど)に直接影響します。さらに、親アクションの接続されたイベントに送信される値は、バインディングの選択された入力タイプに依存します。アクションタイプ、バインディング、および戻り値の相関関係の詳細については、入力イベントを参照してください。
シンプルなキャラクタースプリントのためのバインディングを接続するには:
CharacterSprintアクションに新しいInputBindingを挿入し、名前をKeyboardBindingに変更します。次に、バインディングのKeyCodeプロパティをLeftShiftに設定します。


CharacterSprintアクションに2つ目のInputBindingを挿入し、名前をGamepadBindingに変更します。次に、バインディングのKeyCodeプロパティをButtonYに設定します。


CharacterSprintアクションに3つ目のInputBindingを挿入し、名前をTouchBindingに変更します。次に、プロパティウィンドウで、バインディングのUIButtonプロパティを、以前にStarterGui内で作成したSprintButtonボタンにリンクします。


入力イベント
InputActionインスタンスには、InputBindingsからのプレイヤー入力を処理するための3つの組み込みイベントがあります。
- StateChanged — このイベントは、状態が変化するたびにすべての入力アクションタイプに対して発火します。ただし、状態が同じ状態に遷移しようとする場合は発火しません。
入力アクションのType(Bool、Direction1D、Direction2D、Direction3D、またはViewportPosition)と、子のInputBindingからの一般的な入力タイプ(キー/ボタン/タップ、アナログトリガー、スティックなど)に応じて、Pressed、Released、およびStateChangedイベントハンドラーに返される値が異なります。相関関係をよりよく理解するために、以下の表を確認してください。
Boolタイプは、ジャンプ、射撃、スプリントなどのトリガーされたアクションに最適で、アナログ入力の押下/解放のしきい値をサポートします。
| InputBindingsの有効な入力タイプ | InputActionイベントに返される値 |
|---|---|
| バインディングのKeyCodeプロパティを介して、キーボードキーや基本的なマウス/ゲームパッドボタンからのブール入力、またはバインディングのUIButtonプロパティを介してGuiButtonの押下/解放。 |
|
| バインディングのKeyCodeプロパティを介して、ゲームパッドトリガー(ButtonL2/ButtonR2)からのアナログ入力の変動量。 |
|
シンプルなキャラクタースプリントのためのイベントを接続するには:
CharacterSprintツリーに新しいScriptを挿入し、さまざまな入力バインディングの横に配置します。次に、RunContextをClientに設定し、名前をOnActivateに変更します。

OnActivateスクリプトに以下のコードを貼り付けます。行13〜15のPressedイベント接続に注意してください。これは、スプリント入力バインディングが押下されたときにキャラクターの歩行速度を2倍にし、行16〜18の対応するReleasedイベント接続は、スプリント入力バインディングが解放されたときに歩行速度をデフォルトにリセットします。
OnActivate (クライアントスクリプト)local Players = game:GetService("Players")local player = Players.LocalPlayerlocal character = player.Characterif not character or character.Parent == nil thencharacter = player.CharacterAdded:Wait()endlocal humanoid = character:WaitForChild("Humanoid")local defaultWalkSpeed = humanoid.WalkSpeedlocal inputAction = script.ParentinputAction.Pressed:Connect(function()humanoid.WalkSpeed = defaultWalkSpeed * 2end)inputAction.Released:Connect(function()humanoid.WalkSpeed = defaultWalkSpeedend)ゲームをプレイテストし、以前に選択したバインディングでキャラクタースプリントアクションをテストします:キーボード用のLeftShift、ゲームパッド用のButtonY、およびタッチ対応デバイス用の画面上のSprintButton。ゲームパッド入力を直接Roblox Studioでテストするには、コントローラーエミュレーターを使用できます。
コンテキストの変更
PlayContextのような入力コンテキストを持っている場合、スクリプトを介してゲームプレイ中にそれを有効/無効にしたり、Priorityを変更して、どのアクションが他のアクションよりも優先されるかを決定したり、Sinkを使用して低優先度のコンテキスト内で処理される入力をブロックしたりできます。
他のスクリプトからコンテキストを切り替えやすくするために、ReplicatedStorage内の入力フォルダーに新しいBindableEventを挿入し、名前をContextEventに変更します。

同じレベルに新しいScriptを作成し、RunContextをClientに設定し、名前をUpdateContextに変更します。

UpdateContextスクリプト内に以下のコードを貼り付けます。
UpdateContext (クライアントスクリプト)local ReplicatedStorage = game:GetService("ReplicatedStorage")local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")local contextEvent = inputsFolder:WaitForChild("ContextEvent")-- バインダブルイベントを接続contextEvent.Event:Connect(function(targetContext, enabled)local context = inputsFolder:FindFirstChild(targetContext)if context thencontext.Enabled = enabledprint(context.Name .. ": " .. tostring(context.Enabled))elsewarn("InputContextが見つかりません!")endend)UpdateContextスクリプトが配置されると、バインダブルイベントを発火させることで、名前付きのInputContextを更新できるようになります。たとえば、ScreenGui内のGuiButtonを駆動するLocalScriptから発火させることができます。
ボタンスクリプトlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")local contextEvent = inputsFolder:WaitForChild("ContextEvent")local button = script.Parentbutton.Activated:Connect(function()-- ターゲット入力コンテキストと有効状態でバインダブルイベントを発火contextEvent:Fire("PlayContext", true)end)
バインディングの表示
アクションとバインディングを設定したら、通常、プレイヤーに対して、どのキーまたはボタンが各アクションをトリガーするかを画面上の補助ヒントを介して表示する必要があります:

入力アクションシステムは、2つのアプローチを提供します。
InputActionLabelは、任意のScreenGuiまたはSurfaceGuiに挿入できるGuiObjectです。InputActionプロパティが既存のInputActionインスタンスを参照するように設定されると、プレイヤーの現在の入力デバイスに対して正しいキー割り当てを自動的に解決して表示します。スクリプトは不要です。プレイヤーがデバイスを切り替えたり(たとえば、キーボードを使用した後にゲームパッドを拾ったり)、コントロールを再バインドしたりすると、ラベルは瞬時に更新されます。
InputActionLabelを追加するには:
StarterGui内のScreenGuiコンテナに、他のGuiObjectと同様にInputActionLabelを挿入します。
プロパティウィンドウで、InputActionプロパティを表示したいInputActionインスタンス(たとえば、ReplicatedStorage内の「スプリント」アクション)に設定し、位置/サイズを希望通りに設定します。
ラベルが表示する内容を解決するとき、次の順序で以下を確認します。
カスタム画像 — 子のInputBindingsがDisplayImageプロパティを設定している場合、ラベルはそれらの画像を直接レンダリングします。
プラットフォームキー画像 — カスタム画像がない場合、ラベルは子のInputBindingsのプラットフォーム提供の画像をUserInputService:GetImageForKeyCode()を介してレンダリングします。複合バインディングには、修飾子がある場合、+区切りで複数のアイコンが表示されます。
カスタム名 — 利用可能な画像がない場合、子のInputBindingsがDisplayNameプロパティを設定している場合、ラベルはそのテキストをラベルのスタイルプロパティを使用してレンダリングします。
プラットフォームキー文字列 — 上記のすべてがない場合、ラベルはプラットフォーム提供の文字列をUserInputService:GetStringForKeyCode()を介してレンダリングします。
InputActionが割り当てられていない場合や、子のInputBindingが存在しない場合、ラベルはプレースホルダーアイコンをレンダリングします。
入力アクションマネージャー
入力アクションマネージャーツールは、入力アーキテクチャを設計、監査、スケールするための統一されたマトリックススタイルのインターフェースです。
これにアクセスするには、スタジオのウィンドウメニューに移動し、入力 ⟩ 入力アクションマネージャーを選択します。ゲームがすでに入力コンテキスト、アクション、またはバインディングを使用している場合、マネージャーは自動的にDataModelをスキャンし、既存のインスタンスをエディタグリッドに抽出します。新しい入力関連のインスタンスは、ReplicatedStorage内のInputsフォルダーに自動的に追加されます。

上記のセクションで説明したように、キャラクタースプリントのための入力セットアップを構成するには:
- 推奨エクスプローラーで最上位のWorkspaceオブジェクトを選択し、プロパティウィンドウでPlayerScriptsUseInputActionSystemプロパティをEnabledに設定します。
StarterGui内のScreenGuiコンテナに、画面上のボタンを作成し、名前をSprintButtonに変更し、位置/サイズを希望通りに設定します。

入力アクションマネージャーで、コンテキスト列のヘッダーにカーソルを合わせ、**+**ボタンをクリックします。新しいコンテキストに適切な名前(たとえば、PlayContext)を入力し、Enterを押します。InputContextの一致する名前がReplicatedStorageに表示されます。


新しいコンテキストにカーソルを合わせて**+**ボタンをクリックします。ポップアップメニューからBoolを選択し、アクションの名前にCharacterSprintを入力してEnterを押します。一致する名前のInputActionがコンテキストの下に表示されます。


CharacterSprintツリーに新しいScriptを挿入し、さまざまな入力バインディングの横に配置します。次に、RunContextをClientに設定し、名前をOnActivateに変更します。

OnActivateスクリプトに以下のコードを貼り付けます。行13〜15のPressedイベント接続に注意してください。これは、スプリント入力バインディングが押下されたときにキャラクターの歩行速度を2倍にし、行16〜18の対応するReleasedイベント接続は、スプリント入力バインディングが解放されたときに歩行速度をデフォルトにリセットします。
OnActivate (クライアントスクリプト)local Players = game:GetService("Players")local player = Players.LocalPlayerlocal character = player.Characterif not character or character.Parent == nil thencharacter = player.CharacterAdded:Wait()endlocal humanoid = character:WaitForChild("Humanoid")local defaultWalkSpeed = humanoid.WalkSpeedlocal inputAction = script.ParentinputAction.Pressed:Connect(function()humanoid.WalkSpeed = defaultWalkSpeed * 2end)inputAction.Released:Connect(function()humanoid.WalkSpeed = defaultWalkSpeedend)



