すべての Roblox セッションの半分以上がモバイルデバイスで再生されるため、幅広いオーディエンス向けのエクスペリエンスを設計するときは、クロスプラットフォームアクセシビリティを考慮することが重要です。あなたは、マウスとキーボードの入力 や ゲームパッド など、さまざまな入力デバイスをサポートすることを目指すべきです。
モバイルエクスペリエンスを設計するときは、ユーザーがあなたのエクスペリエンスで使用する予定の デバイスの向き を考慮し、次のモバイル関連の入力タスクを実行するために、入力を ContextActionService で実装します:
- 画面上のボタンを作成 モバイルデバイスでのみ表示可能。
- 設定コンテキストに依存する入力を設定して、同じボタンまたは入力が、状況に応じて異なるアクションを実行できるようにする
- 他の入力デバイスを検出する、例えばモバイルタブレットに接続されたマウスまたはキーボード、ユーザーに正しい画面上のプロンプトを提供する。
デバイスの向き
電話やタブレットでは、デバイスの向きが主にユーザーエクスペリエンスとインタラクションに影響します。たとえば、景観モードは 2つの指で操作すると最適で、ポートレートモードは 1本の指のインターフェイスにレンタルできます。
デフォルトでは、Roblox の経験は景観モードで実行され、ユーザーのデバイスが回転すると、経験が景観「左」と景観「右」の間で切り替わります。しかし、必要に応じて、経験を特定の方向にロックできます。
オリエンテーションモード
2つのセンサーベースモードと 3つのロックモードを含む、5種類の異なるオリエンテーションモードがあります。
センサーモード | |
---|---|
景観センサ | デバイスが常に縦長モードで表示され、エクスペリエンスビューが常に上向きに向けられるようにするための、Roblox のデフォルト設定 (ポートレートモードなし) で体験が常に表示されるデフォルト設定。 |
センサ | デバイスは物理的な方向を検出し、必要に応じて景観モードとポートレートモードの間で切り替えて、エクスペリエンスビューが常に上向きになるようにします。 |
ロックモード | |
---|---|
残された景観 | 物理ホームボタンのあるデバイスでは、ホームボタンはディスプレイの左側にあります。バーチャルホーム/ナビゲーションバーを持つデバイスでは、タッチ領域はディスプレイの底にあります。 |
景観右 | 物理ホームボタンのあるデバイスでは、ホームボタンはディスプレイの右側にあります。バーチャルホーム/ナビゲーションバーを持つデバイスでは、タッチ領域はディスプレイの底にあります。 |
ポートレート | 物理ホームボタンのあるデバイスでは、ホームボタンはディスプレイの下にあります。バーチャルホーム/ナビゲーションバーを持つデバイスでは、タッチ領域はディスプレイの底にあります。 |
オリエンテーション属性
オリエンテーションを設定するときは、開始オリエンテーション、経験中のオリエンテーション、および現在のオリエンテーションを設定できます。
開始オリエンテーション
StarterGui.ScreenOrientation は、場プレースのデフォルトオリエンテーションを設定します。許容される値には以下があります:
このプロパティは、エクスペリエンスに参加するすべての新規ユーザーに影響するため、Studio 内で StarterGui → Enum.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つの引数を受け取ります:
|
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)