モバイル入力

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

すべての Roblox セッションの半分以上がモバイルデバイスで再生されるため、幅広いオーディエンス向けのエクスペリエンスを設計するときは、クロスプラットフォームアクセシビリティを考慮することが重要です。あなたは、マウスとキーボードの入力ゲームパッド など、さまざまな入力デバイスをサポートすることを目指すべきです。

モバイルエクスペリエンスを設計するときは、ユーザーがあなたのエクスペリエンスで使用する予定の デバイスの向き を考慮し、次のモバイル関連の入力タスクを実行するために、入力を ContextActionService で実装します:

デバイスの向き

電話やタブレットでは、デバイスの向きが主にユーザーエクスペリエンスとインタラクションに影響します。たとえば、景観モードは 2つの指で操作すると最適で、ポートレートモードは 1本の指のインターフェイスにレンタルできます。

デフォルトでは、Roblox の経験は景観モードで実行され、ユーザーのデバイスが回転すると、経験が景観「左」と景観「右」の間で切り替わります。しかし、必要に応じて、経験を特定の方向にロックできます。

オリエンテーションモード

2つのセンサーベースモードと 3つのロックモードを含む、5種類の異なるオリエンテーションモードがあります。

センサーモード
景観センサデバイスが常に縦長モードで表示され、エクスペリエンスビューが常に上向きに向けられるようにするための、Roblox のデフォルト設定 (ポートレートモードなし) で体験が常に表示されるデフォルト設定。
センサデバイスは物理的な方向を検出し、必要に応じて景観モードとポートレートモードの間で切り替えて、エクスペリエンスビューが常に上向きになるようにします。
ロックモード
残された景観物理ホームボタンのあるデバイスでは、ホームボタンはディスプレイの左側にあります。バーチャルホーム/ナビゲーションバーを持つデバイスでは、タッチ領域はディスプレイの底にあります。
景観右物理ホームボタンのあるデバイスでは、ホームボタンはディスプレイの右側にあります。バーチャルホーム/ナビゲーションバーを持つデバイスでは、タッチ領域はディスプレイの底にあります。
ポートレート物理ホームボタンのあるデバイスでは、ホームボタンはディスプレイの下にあります。バーチャルホーム/ナビゲーションバーを持つデバイスでは、タッチ領域はディスプレイの底にあります。

オリエンテーション属性

オリエンテーションを設定するときは、開始オリエンテーション経験中のオリエンテーション、および現在のオリエンテーションを設定できます。

開始オリエンテーション

StarterGui.ScreenOrientation は、場プレースのデフォルトオリエンテーションを設定します。許容される値には以下があります:

このプロパティは、エクスペリエンスに参加するすべての新規ユーザーに影響するため、Studio 内で StarterGuiEnum.ScreenOrientation の値を設定できます。

経験中のオリエンテーション

PlayerGui.ScreenOrientation は、ユーザーのためにエクスペリエンスの向きを明示的に変更します。このプロパティが の中の 1つの enum に設定されると、エクスペリエンスはすぐに設定に合わせて向きを調整します。これは、エクスペリエンスがミニゲームのためにビューをポートレートにロックして特定のエクスペリエンスを提供する必要があるときに便利です。

次のコードサンプル LocalScript では、画面の向きをポートレートに設定します:


local Players = game:GetService("Players")
local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")
task.wait(2)
playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait

現在の方向

PlayerGui.CurrentScreenOrientation は、現在のデバイスのオリエンテーションを取得します。可能な値には以下が含まれます:

次のコードは、ユーザーの現在の画面オリエンテーションを印刷します:


local Players = game:GetService("Players")
local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")
print(playerGUI.CurrentScreenOrientation)

キャラクター移動モード

Roblox は、モバイルデバイスのユーザーがエクスペリエンスを移動する方法を変更できる複数の StarterPlayer プロパティを提供します。

StarterPlayer.DevTouchMovementMode の値をフォロー中のいずれかに変更することで、Roblox の経験にモバイル移動制御スキームを設定できます:

オプション説明
ClickToMoveユーザーはターゲットの場所をタップしてのみエクスペリエンスを移動できます。このモードには、画面の右下のジャンプボタンが含まれています。自動ジャンプは、この移動モードで常に有効です。
DPad
DynamicThumbstickユーザーが最初に押し下げた場所に動的なサムスティックが表示されます。このモードには、画面の右下のジャンプボタンが含まれています。これは、UserChoice が設定されている場合のモバイルユーザーのデフォルトユーザー設定です。
Scriptableすべてのデフォルトコントロールを無効にし、独自のコントロールスキームを スクリプトする ことができます。
Thumbpad
Thumbstick画面の左下の領域に位置するモバイル用のサムスティック。DynamicThumbstick とは異なり、スティックの位置は静的であり、ユーザーが画面にタッチすると位置が変更されません。
UserChoiceユーザーが経験中の設定メニューから希望のコントロールスキームを選択できます。これはエクスペリエンスのデフォルト移動モードです。

自動ジャンプ

StarterPlayer.AutoJumpEnabled が有効になっていると、ユーザーのキャラクターはプラットフォームの端に近づくと、ギャップを自動的に飛び越えます。StarterPlayer.AutoJumpEnabled は、モバイルデバイスにデフォルトで有効になっています。

StarterPlayer.AutoJumpEnabled を無効にして、この機能を無効にし、ユーザーがキーバインドのみを使用してジャンプするように強制します。

カスタムモバイルボタン

カスタムモバイルボタンを追加するには、次のパラメータを含む ContextActionService:BindAction() メソッドを使用してください:

パラメタ種類説明
actionName文字列バインディングしているアクションの識別文字列。ContextActionService で他の機能と一緒に actionName を使用してバインディングを編集できます。
functionToBind機能指定された入力がトリガーされたときに呼び出される機能。この機能は 3つの引数を受け取ります:
  • actionName と同じストリング。
  • A Enum.UserInputState が関数を呼び出したときに入力状態を定義するもの。
  • 機能呼び出しで使用される InputObject
createTouchButtonブールン値真の場合、ゲームがモバイルデバイスで実行されているときに画面上のボタンを作成します。
inputTypesトークルEnum.KeyCode からの枚数値など、機能にバインドする予定の入力。

次のコードサンプルを使用して、画面上のボタンを作成し、また キーボードゲームパッド 入力を受け入れるインタラクトアクションを作成できます:


local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- アクションを機能にバインドする
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)

カスタムボタンが追加されると、ContextActionService から複数の機能の 1つを使用して、BindAction() によって作成された画面上のボタンをカスタマイズできます。

  • モバイルボタンのテキストラベルを変更するには、SetTitle() 文字列とタイトル文字列を使って actionName を呼び出し、
  • 他の GUI ボタンと同じようにカスタム画像を使用するには、SetImage() メソッドを呼び出し、下の例のアセットIDを選択した画像に置き換えてください。
  • ボタンの位置を設定するには、SetPosition() 位置値で UDim2 を呼び出します。

-- ボタンラベルを「話す」に設定
ContextActionService:SetTitle("Interact", "Talk")
-- ボタン画像を設定
ContextActionService:SetImage("Interact", "rbxassetid://104919049969988")
-- ボタンの位置を設定
ContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))

コンテキストに依存する入力

モバイルデバイスの開発では、コンテキストに基づいて単一のボタンが行うことを変更したいと思うことが多いでしょう。モバイルデバイスの画面スペースが制限されているため、キャラクターが行えるアクションに基づいて異なるアクションを実行するコンテキストボタンを使用します。

たとえば、ユーザーがゴールドの箱の近くに立っており、機能 collectTreasure() にバインドされているときにアクティブな「収集」ボタンを表示できます:


local ContextActionService = game:GetService("ContextActionService")
local function collectTreasure(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print("Collect treasure")
end
end
ContextActionService:BindAction("Interact", collectTreasure, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
ContextActionService:SetTitle("Interact", "Collect")
ContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))

ゲームプレイ中に別の時点で、ユーザーが NPC の近くに立っているときにボタンを「話す」に変更できます。既存のボタンを削除して別のボタンを配置するのではなく、既存の "Interact" アクションに BindAction() を呼び出し、ターゲット機能とボタンタイトルを変更す操作ことができます:


ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
ContextActionService:SetTitle("Interact", "Talk")

他のデバイスを検出する

クロスプラットフォームのエクスペリエンスでは、アクティブに使用されているデバイスの入力オプションを表示して、ユーザーの好ましい入力オプションを参照することが重要です。たとえば、モバイルデバイスには マウスとキーボード または ゲームパッド が接続されているか、デスクトップにタッチスクリーンが有効になっている可能性があります。複数の入力ソースが有効になっている場合、GetLastInputType() を使用して、ユーザーの最後に使用した入力デバイスを取得できます。

基礎として、次の ModuleScript を使用して、ReplicatedStorage 内に配置し、 UserInputModule に名前を変更して、ユーザーの入力タイプを取得し、UIレイアウトまたはコンテキストをエクスペリエンスの特定のニーズに合わせて調整できます。


local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- デバイスに有効なキーボードとマウスがある場合、それらの入力を想定する
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- 装置にタッチ機能があるがキーボードとマウスがない場合、タッチ入力を想定する
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- デバイスにアクティブなゲームパッドがある場合は、ゲームパッド入力を想定する
elseif UserInputService.GamepadEnabled then
inputTypeString = "Gamepad"
end
function UserInput.getInputType()
local lastInputEnum = UserInputService:GetLastInputType()
if lastInputEnum == Enum.UserInputType.Keyboard or string.find(tostring(lastInputEnum.Name), "MouseButton") or lastInputEnum == Enum.UserInputType.MouseWheel then
inputTypeString = "Keyboard/Mouse"
elseif lastInputEnum == Enum.UserInputType.Touch then
inputTypeString = "Touch"
elseif string.find(tostring(lastInputEnum.Name), "Gamepad") then
inputTypeString = "Gamepad"
end
return inputTypeString, lastInputEnum
end
return UserInput

ユーザーインプットモジュール スクリプトが準プレースできたら、LocalScript で次のコードサンプルを使用して、ユーザーの最後の入力タイプを取得します:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- モジュールを要求する
local UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))
local currentUserInput, inputEnum = UserInputModule.getInputType()
print(currentUserInput, inputEnum)