ユーザー入力をアクションに接続することで、ユーザーは体験の機能をはるかに良く、直感的に制御できるようになります。このチュートリアルでは、特定のキーにリロードアクションをバインドします。
はじめに
このチュートリアルでは、Create Player Toolsで作成されたBlasterツールを使用します。これらの手順に従ってツールを作成するか、BlasterモデルをダウンロードしてStarterPackに挿入できます。
モデルは、任意の体験の間で使用するためにインベントリに追加できます。モデルを体験に追加するには、以下の手順を行います。
- ブラウザーでモデルページを開き、Getボタンをクリックします。これにより、モデルがインベントリに追加されます。
- ドロップダウンがMy Modelsに設定されていることを確認します。
- Blasterモデルを選択し、体験に追加します。
アクションハンドラーを作成する
まず、ユーザー入力が検出されたときに処理する関数が必要です。
Blasterの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関数を無効にし、リロードアニメーションが終了したら再度有効にします。