ユーザー入力をアクションに接続することで、ユーザーはゲームの機能をより良く、直感的に制御できるようになります。このチュートリアルでは、特定のキーにリロードアクションをバインドします。
始めに
このチュートリアルでは、プレイヤーツールの作成で作成されたブラスターツールを使用します。ツールを作成する手順に従うか、ブラスターモデルをダウンロードしてStarterPackに挿入できます。
モデルは、任意のゲーム間で使用するためにインベントリに追加できます。ゲームにモデルを追加するには:
- ブラウザでモデルページを開き、取得ボタンをクリックします。これにより、モデルがインベントリに追加されます。
- ドロップダウンがマイモデルに設定されていることを確認します。
- ブラスターモデルを選択してゲームに追加します。
アクションハンドラーを作成する
まず、ユーザー入力が検出されたときに処理する関数が必要です。
ブラスター内のToolController LocalScriptを開きます。

アクションの名前を格納するための変数を作成します。
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function toolEquipped()tool.Handle.Equip:Play()endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)actionName、inputState、inputObjectの3つの引数を受け取るonActionという名前の関数を作成します。これは、ユーザー入力が検出されたときに実行される関数になります。
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)endlocal function toolEquipped()tool.Handle.Equip:Play()end関数内で、与えられたactionNameがリロードアクション名と一致するか確認し、inputStateがUserInputState.Begin(開始状態)であることを確認します。これは重要です。なぜなら、inputStateが変わるたびに関数が実行されますが、リロードは一度だけ行う必要があるからです。
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thenendendユーザーがリロードしたときに明確にするために、ツールのTextureIdを一時的に"rbxassetid://6593020923"に変更し、その後元の値"rbxassetid://92628145"に戻します。
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endend
アクションをバインドする
ContextActionServiceを使用して、特定の入力に関数をバインドできます。これは、BindAction関数を使用して行い、いくつかの引数を受け取ります:
- アクションの名前。
- アクションを処理する関数(コールバックとも呼ばれます)。
- タッチボタンを表示するかどうか。
- アクションに関連付けるEnum.KeyCodesの任意の数。
KeyCodesは、キーボードのキーやコントローラーのボタンなど、異なる入力ボタンを表す値です。コードの完全なリストはこちらで入手できます。
スクリプトの先頭でContextActionServiceを取得します。
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"toolEquipped関数内で、BindActionを呼び出し、次の引数を渡します:
- アクションの名前(RELOAD_ACTION)
- アクションハンドラー(onAction)
- タッチボタンを作成するための値(true)
- 検出するキー入力(Enum.KeyCode.R)
local RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endツールを装備し、キーボードのRキーを押してプレイテストします。バックパックアイコンは、武器がリロード中であることを示す待機シンボルに一時的に変更されるはずです:
アクションのバインド解除
ユーザーがツールの装備を解除したとき、アクションはバインド解除される必要があります。そうしないと、ツールが装備されていない状態でリロードできてしまいます。
toolUnequippedという新しい関数を作成し、アクション名を渡してUnbindActionを呼び出します。
local function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)toolUnequipped関数をUnequippedイベントに接続し、イベントが発火したときに関数が実行されるようにします。
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Unequipped:Connect(toolUnequipped)tool.Activated:Connect(toolActivated)プレイテストを行い、すべてが正しく機能することを確認します。ツールが装備されているときはリロードできるが、装備されていないときはリロードできないはずです。
リロードアニメーションはこれで完成です - 追加のチャレンジとして、ブラスターが発射されるたびに弾薬カウンターをカウントダウンしてみてください。その後、弾薬がないときにtoolActivated関数を無効にし、リロードアニメーションが終了したら再度有効にします。