Ponad połowa wszystkich sesji Roblox jest odtwarzana na urządzeniach mobilnych, więc ważne jest rozważenie dostępności na wielu platformach podczas projektowania doświadczenia dla szerokiej grupy odbiorców.Powinieneś dążyć do wsparcia różnych urządzeń wejściowych, w tym wejść myszy i klawiatury oraz konsoli do gier.
Projektując doświadczenie mobilne, rozważ orientację urządzenia , którą zamierzasz używać w swoim doświadczeniu, a następnie wdroż swoje wejścia za pomocą , aby wykonać następujące zadania związane z mobilnością:
- Twórz przyciski na ekranie widoczne tylko na urządzeniach mobilnych.
- Ustaw kontekstowe niezależne wejścia, które pozwalają na wykonanie tej samej akcji przez tę samą przycisk lub wejście w zależności od sytuacji.
- Wykryj inne urządzenia wejściowe , takie jak mysz lub klawiatura podłączona do mobilnego tabletu, aby dostarczyć poprawne komunikaty na ekranie użytkownikowi.
Orientacja urządzenia
Na telefonach i tabletach orientacja urządzenia głównie wpływa na doświadczenie użytkownika i interakcję.Na przykład tryb krajobrazowy najlepiej działa z dwoma kciukami, podczas gdy tryb portretowy może pożyczyć się do interfejsu jedno-palcowego.
Domyślnie doświadczenia Roblox uruchamiane są w trybie krajobrazowym, umożliwiając przełączanie doświadczenia między krajobrazem "lewym" a krajobrazem "prawym", gdy urządzenie użytkownika się obraca.Jednak doświadczenia mogą być zamknięte do określonej orientacji, jeśli tego zapragniesz.
Tryby orientacji
Istnieją pięć różnych trybów orientacji, w tym dwa tryby oparte na czujnikach i trzy zamknięte tryby.
Tryby czujników | |
---|---|
Sensor krajobrazowy | Domyślne ustawienie Roblox, w którym doświadczenie zawsze pojawia się w trybie krajobrazowym (bez trybu portretowego) i urządzenie wykrywa jego fizyczną orientację, aby zapewnić, że widok doświadczenia zawsze jest skierowany w górę. |
Sensor | Urządzenie wykrywa swoją fizyczną orientację, aby zapewnić, że widok doświadczenia zawsze jest skierowany w górę, przełączając między trybem krajobrazowym a portretowym w razie potrzeby. |
Zablokowane tryby | |
---|---|
Pozostała sceneria | Na urządzeniach z fizycznym przyciskiem domowym przycisk domu jest po lewej stronie wyświetlacza.Na urządzeniach z wirtualną listą domową/paskiem nawigacji jej obszar dotykowy znajduje się na dole wyświetlania |
Prawo krajobrazowe | Na urządzeniach z fizycznym przyciskiem domowym przycisk domowy znajduje się po prawej stronie wyświetlacza.Na urządzeniach z wirtualną listą domową/paskiem nawigacji jej obszar dotykowy znajduje się na dole wyświetlania |
Portret | Na urządzeniach z fizycznym przyciskiem domowym przycisk domowy znajduje się poniżej wyświetlacza.Na urządzeniach z wirtualną listą domową/paskiem nawigacji jej obszar dotykowy znajduje się na dole wyświetlania |
Właściwości orientacyjne
Podczas ustawiania orientacji możesz ustawić początkową orientację, orientację w doświadczeniu i obecną orientację.
Początkowa orientacja
StarterGui.ScreenOrientation ustawia domyślną orientację dla miejsce. Akceptowalne wartości obejmują:
Ponieważ ta właściwość wpływa na wszystkich nowych użytkowników, którzy dołączają do doświadczenia, możesz ustawić jej wartość w StarterGui → Enum.ScreenOrientation w Studio.
Orientacja w doświadczeniu
PlayerGui.ScreenOrientation wyraźnie zmienia orientację doświadczenia dla użytkownika.Gdy ta właściwość jest ustawiona na jedną z Enum.ScreenOrientation enumerów w LocalScript , doświadczenie natychmiast zostanie przystosowane do dopasowania ustawienie.Może to być przydatne, gdy doświadczenie musi zapewnić określone doświadczenie, takie jak zamknięcie widoku w pozycję portretową dla minigry.
Poniższy przykład kodu w LocalScript ustawia orientację ekranu na poziom pionowy:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")task.wait(2)playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait
Obecna orientacja
PlayerGui.CurrentScreenOrientation otrzymuje obecną orientację urządzenia. Możliwe wartości obejmują:
Poniższy kod drukuje obecną orientację ekranu użytkownika:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")print(playerGUI.CurrentScreenOrientation)
Tryby ruchu postaci
Roblox oferuje kilka właściwości StarterPlayer, które możesz ustawić, aby zmienić sposób poruszania się użytkowników na urządzeniach mobilnych w twoim doświadczeniu.
Możesz ustawić mobilne schematy kontroli ruchu dla doświadczeń Roblox, zmieniając wartości StarterPlayer.DevTouchMovementMode na jedną z obserwuje:
Opcja | Opis |
---|---|
ClickToMove | Użytkownicy mogą poruszać się po doświadczeniu tylko poprzez dotknięcie lokalizacji docelowej.Ten tryb obejmuje przycisk skoku w prawym dolnym regionie ekranu.Automatyczne skakanie jest zawsze aktywne w tym trybie ruchu. |
DPad | |
DynamicThumbstick | Dynamiczny joystick pojawia się tam, gdzie użytkownik początkowo naciska.Ten tryb obejmuje przycisk skoku w prawym dolnym regionie ekranu.To jest domyślne ustawienie użytkownika dla użytkowników mobilnych, jeśli UserChoice jest ustawiać. |
Scriptable | Wyłącza wszystkie domyślne kontrolki i pozwala na skryptowanie własnego schematu kontroli. |
Thumbpad | |
Thumbstick | Przycisk mobilny położony w lewym dolnym regionie ekranu.W przeciwieństwie do DynamicThumbstick, pozycja przycisku jest statyczna i nie zmienia pozycji, gdy użytkownik dotyka ekranu. |
UserChoice | Umożliwia użytkownikom wybór pożądanego schematu kontroli z menu Ustawień w doświadczeniu. Jest to domyślny tryb ruchu dla doświadczeń. |
Automatyczne skakanie
Gdy włączono StarterPlayer.AutoJumpEnabled, postać użytkownika automatycznie skacze przez szczeliny, gdy zbliża się do krawędzi platforma.StarterPlayer.AutoJumpEnabled jest włączone domyślnie dla urządzeń mobilnych.
Wyłącz StarterPlayer.AutoJumpEnabled, aby wyłączyć tę funkcję i zmusić użytkowników do skoku tylko za pomocą ich skrótów klawiszowych.
Niestandardowe mobilne przyciski
Aby dodać niestandardowe przyciski mobilne, użyj metody ContextActionService:BindAction(), która przyjmuje następujące parametry:
Parametr | Typ | Opis |
---|---|---|
actionName | ciąg | Sznurek identyfikatorów dla akcji, którą wiążesz. Możesz używać nazwy akcji z innymi funkcjami w ContextActionService do edycji wiązania. |
functionToBind | funkcja | Funkcja do wezwania, gdy określone wejście zostanie uruchomione. Ta funkcja otrzymuje trzy argumenty:
|
createTouchButton | booleanowy | Gdy prawda, tworzy przycisk na ekranie, gdy gra jest uruchamiana na urządzeniemobilnym. |
inputTypes | tuplekumentacja | Wejścia, które zamierzasz przypiąć do funkcji, takie jak wartości enum z Enum.KeyCode . |
Możesz użyć następującego przykładu kodu, aby utworzyć akcję interakcji, która tworzy przycisk na ekranie i akceptuje również wejście klawiatury i grypadu:
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- Zwiąż działanie z funkcją
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
Po dodaniu niestandardowego przycisku możesz użyć jednej z kilku funkcji z ContextActionService , aby dostosować przyciski na ekranie, które są tworzone przez BindAction() .
- Aby zmienić etykietę tekstową dla przycisku mobilnego, wezwij SetTitle() z ciągiem actionName i ciągiem tytułu.
- Aby użyć niestandardowego obrazu tak jak inne przyciski GUI, wezwij metodę SetImage(), zastępując przykładową ID zasobu poniżej obrazem swojego wyboru.
- Aby ustawić pozycję przycisku, wezwij SetPosition() z wartością pozycji UDim2.
-- Ustaw etykietę przycisku na "Rozmawiaj"ContextActionService:SetTitle("Interact", "Talk")-- Ustaw obraz przyciskuContextActionService:SetImage("Interact", "rbxassetid://104919049969988")-- Ustaw pozycję przyciskuContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
Wrażliwe na kontekst wejścia
Rozwijając aplikacje na urządzenia mobilne, często możesz chcieć zmienić to, co robi pojedynczy przycisk w oparciu o kontekst.Ponieważ przestrzeń ekranowa na urządzeniach mobilnych jest ograniczona, użyj kontekstowych przycisków, które wykonują różne akcje w oparciu o to, co może zrobić postać.
Na przykład możesz wyświetlić aktywny przycisk "Zbierz", gdy użytkownik stoi w pobliżu skrzyni z złotem, związany z funkcją 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))
Na innym etapie rozgrywkamożesz zmienić przycisk na "Rozmowa", gdy użytkownik stoi w pobliżu NPC.Zamiast usuwać istniejący przycisk, aby umieścić inny, możesz po prostu wezwać BindAction() na istniejącą akcji"Interact", zmieniając celową funkcję i tytuł przycisku:
ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)ContextActionService:SetTitle("Interact", "Talk")
Wykryj inne urządzenia
W przypadku doświadczeń na wielu platformach ważne jest odwoływanie się do preferowanych opcji wejściowych użytkownika poprzez wyświetlanie opcji wejściowych dla aktywnie używanego urządzenia.Na przykład urządzenie mobilne może mieć mysz i klawiaturę lub gamepad połączony, lub możliwe jest, że komputer ma włączony ekran dotykowy.Jeśli włączono wiele źródeł wejściowych, możesz użyć GetLastInputType(), aby uzyskać ostatnio używane urządzenie wejściowe użytkownika.
Jako fundacja możesz użyć następującego ModuleScript, umieszczonego w ReplicatedStorage i zmienionego na Moduł wpisu użytkownika , aby pobrać wpisywaćwpisu użytkownika, po czym możesz dostosować układ interfejsu lub kontekst do specyficznych potrzeb swojego doświadczenia.
local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- Jeśli urządzenie ma aktywną klawiaturę i mysz, załóż te wejścia
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- W przeciwnym razie, jeśli urządzenie ma możliwość dotykania, ale nie ma klawiatury i myszy, zakładaj, że dotyk jest wpisany
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- W przeciwnym razie, jeśli urządzenie ma aktywny gamepad, przyjmij wejście gamepada
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
Gdy skrypt UserInputModule jest już miejsce, użyj następującego przykładu kodu w LocalScript, aby uzyskać ostatni wpisywaćwejścia użytkownika:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Wymagaj modułulocal UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))local currentUserInput, inputEnum = UserInputModule.getInputType()print(currentUserInput, inputEnum)