Hơn một nửa tổng số các phiên Roblox được chơi trên các thiết bị di động, vì vậy nó rất quan trọng để xem xét khả năng truy cập ngang hàng khi thiết kế một trải nghiệm cho một lượng lớn người dùng. Bạn nên hướng tới hỗ trợ một loạt các thiết bị đầ
Khi thiết kế một trải nghiệm cho điện thoại, hãy xem xét hướng điện thoại mà bạn định cho người dùng sử dụng trong trải nghiệm của bạn, sau đó thực hiện các lựa chọn của bạn bằng cách sử dụng ContextActionService để thực hiện các công việc nhập liệu liên qu
- Tạo các nút trên màn hình. chỉ hiển thị trên các thiết bị di động.
- Cài đặt ngữ cảnh phụ thuộc vào输入 cho phép cùng một nút hoặc nhập để thực hiện một hành động khác nhau tùy thuộc vào tình huống.
- Phát hiện các thiết bị nhập khác, chẳng hạn như một chuột hoặc bàn phím kết nối với một máy tính bảng di động, để cung cấp các thông báo trên màn hình đúng cho người dùng.
Tương tác thiết bị
Trên các thiết bị, hướng thiết bị chủ yếu ảnh hưởng đến trải nghiệm người dùng và tương tác. Ví dụ, chế độ cảnh quan tốt nhất được lập bằng hai ngón tay trong khi chế độ hoạt ảnh sẽ lend cho một giao diện ngón tay.
Mặc định, các trải nghiệm Roblox được chạy ở chế độ trượt tuyết, cho phép trải nghiệm chuyển đổi giữa trượt tuyết "bên trái" và trượt tuyết "bên phải" khi thiết bị người dùng di chuyển. Tuy nhiên, các trải nghiệm có thể được khóa vào một hướng nhất định nếu được yêu c
Chế độ hướng
Có năm chế độ hướng khác nhau, bao gồm hai chế độ dựa trên cảm biến và ba chế độ bị khóa.
Chế độ cảm biến | |
---|---|
Cảm biến địa hình | Cài đặt Roblox mặc định mà trải nghiệm luôn xuất hiện trong chế độ trình chiếu (không có chế độ chân dung) và thiết bị phát hiện hướng tương tự của thiết bị để đảm bảo rằng trải nghiệm luôn luôn được hướng lên. |
Cảm biến | Thiết bị này phát hiện hướng vịnh lý thể họa của nó để đảm bảo trải nghiệm luôn luôn hướng lên trên, chuyển đổi giữa chế độ quang cảnh và chế độ hình ảnh như cần thiết. |
Chế độ bị khóa | |
---|---|
Cảnh quan bên trái | Trên các thiết bị có nút nhà vật lý, nút nhà ở phía bên trái của màn hình. Trên các thiết bị có thanh nhà/barảng màn hình ảo tưởng, vị trí chạm của nó ở dưới của màn hình. |
Landscape Phải | Trên các thiết bị có nút nhà vật lý, nút nhà ở phía phải của màn hình. Trên các thiết bị có thanh nhà/bar trải nghiệm ảo tưởng, vị trí của nó ở dưới cùng của màn hình. |
Hình ảnh | Trên các thiết bị có nút về mặt đất, nút trang chủ được đặt dưới màn hình. Trên các thiết bị có thanh về mặt đất/bar dẫn đường, vị trí chạm của nó ở dưới cùng của màn hình. |
Tính chỉnh hướng
Khi cài đặt một hướng, bạn có thể cài đặt Phía bắt đầu, Trong kinh nghiệm và Hiện tại.
Bắt đầu Orientation
StarterGui.ScreenOrientation thiết lập hướng mặt địa điểm. Các giá trị được chấp nhận bao gồm:
Vì đặt tính này ảnh hưởng đến tất cả những người mới tham gia trải nghiệm, bạn có thể tùy chỉnh giá trị của nó trong StarterGui → Enum.ScreenOrientation trong Studio.
Hướng dẫn trong kinh nghiệm
PlayerGui.ScreenOrientation Explicitly thay đổi hướng của trải nghiệm cho một người dùng. Khi thuộc tính này được đặt vào một trong những Enum.ScreenOrientation enums trong một LocalScript , trải
Mẫu mã code sau đây trong một LocalScript thiết lập hướng màn hình thành hình chữ nhật:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")task.wait(2)playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait
Hướng dẫn hiện tại
PlayerGui.CurrentScreenOrientation lấy hướng tấm nền hiện tại. Các giá trị có thể bao gồm:
Mã sau in hướng hiện tại của màn hình người dùng:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")print(playerGUI.CurrentScreenOrientation)
Chế độ di chuyển nhân vật
Roblox cung cấp một loạt các StarterPlayer tính năng bạn có thể cài đặt để thay đổi cách người dùng trên các thiết bị di động có thể di chuyển qua trải nghiệm của bạn.
Bạn có thể cài đặt các cơ chế điều khiển di chuyển trên điện thoại cho các trải nghiệm Roblox bằng cách thay đổi giá trị của StarterPlayer.DevTouchMovementMode đến một trong những giá trị theo dõi:
Tùy chọn | Mô tả |
---|---|
ClickToMove | Người dùng chỉ có thể di chuyển qua trải nghiệm bằng cách nhấp vào một vị trí mục tiêu. This mode includes a jump button in the lower-right region of the screen. Nhảy tự động luôn luôn được kích hoạt trong chế độ di chuyển này. |
DPad | |
DynamicThumbstick | Một que thumbstick động xuất hiện nơi người dùng ban đầu nhấn xuống. Chế độ này bao gồm một nút nhảy ở phía dưới bên phải của màn hình. Đây là cài đặt người dùng mặc định cho người dùng cho điện thoại nếu UserChoice được cài đặt. |
Scriptable | Vô hiệu hóa tất cả các điều khiển mặc định và cho phép bạn lập trình hệ thống điều khiển của riêng bạn . |
Thumbpad | |
Thumbstick | Một que thumbstick di động được đặt ở vị trí bên dưới cùng bên trái của màn hình. Không giống như DynamicThumbstick , vị trí que thumbstick là tĩnh và không thay đổi khi người dùng chạm vào màn hình. |
UserChoice | Cho phép người dùng chọn chế độ điều khiển mong muốn từ menu Cài đặt trong trải nghiệm. Đây là chế độ di chuyển mặc định cho trải nghiệm. |
Nhảy chính xác
Khi StarterPlayer.AutoJumpEnabled được bật, nhân vật của người dùng tự động nhảy qua các khe khi đang đến gần mép của một nền tảng. StarterPlayer.AutoJumpEnabled được bật bởi mặc định cho các thiết bị di động.
Vô hiệu hóa StarterPlayer.AutoJumpEnabled để tắt tính năng này và buộc người dùng nhảy chỉ bằng các phím liên hệ của họ.
Thêm nút mobile
Để thêm các nút di động, hãy sử dụng phương thức ContextActionService:BindAction() .
Các biểu tượng BindAction() được sử dụng để lấy các tham số sau đây:
Tham số | Kiểu | Mô tả |
---|---|---|
tên hành động | chuỗi | Một dãy chuỗi xác định hành động mà bạn đang liên kết. Bạn có thể sử dụng actionName với các chức năng khác trong ContextActionService để chỉnh sửa liên kết. |
chức năngToBind | chức năng | Hàm để gọi khi đầu vào được kích hoạt. Hàm này nhận ba引数:
|
tạoTouchButton | boolean | Khi đúng, tạo một nút trên màn hình khi trò chơi đang chạy trên một thiết bị di động. |
nhập kiểu | tuỳ tùy | Các đầu vào bạn định để kết nối với chức năng, chẳng hạn như giá trị danh sách từ một Enum.KeyCode . |
Bạn có thể sử dụng mẫu mã sau đây để tạo một hành động Interact tạo một nút trên màn hình và cũng chấp nhận một bàn phím và gamepad input:
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- Kết hợp hành động để hoạt động
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
Loại bỏ nút mobile
Để loại bỏ một nút di động khỏi màn hình, gọi UnbindAction() bằng cách sử dụng dòng chuỗi actionName bạn đã truyền cho BindAction() .
Sử dụng mẫu mã sau đây để bỏ kết nối hành động Interact đã tạo:
-- Huỷ kết nối hành động theo tênContextActionService:UnbindAction("Interact")
Tùy chỉnh giao diện người dùng
Bạn có thể sử dụng một trong nhiều chức năng từ ContextActionService để tùy chỉnh các nút trên màn hình được tạo bởi BindAction() .
Văn Bản Nút
Để thay đổi nhãn văn bản cho một nút cho điện thoại, gọi SetTitle() với dòng chuỗi actionName và một tiêu đề:
-- Đặt nhãn nút thành "Nói chuyện"ContextActionService:SetTitle("Interact", "Talk")
Hình ảnh nút
Các nút trên điện thoại có thể sử dụng hình ảnh tùy chỉnh giống như các nút GUI khác bằng cách sử dụng phương thức SetImage() .
Sử dụng mã mẫu sau đây để thiết lập hình ảnh nút, thay thế ID tài nguyên bằng hình ảnh của bạn chọn:
-- Tùy chỉnh hình ảnh nútContextActionService:SetImage("Interact", "rbxassetid://0123456789")
Vị trí nút
Bởi mặc định, vị trí của một nút mới xuất hiện gần phần dưới cùng của màn hình. Bạn nên cẩn thận đặt vị trí của nút trên các thiết bị di động và lưu ý vị trí của ngón tay và bàn tay.
Sử dụng mã mẫu sau đây để thiết lập vị trí của nút với phương thức SetPosition() :
-- Đặt vị trí nútContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
Nhập dữ liệu phụ thuộc
Khi phát triển cho các thiết bị di động, bạn thường muốn thay đổi những gì một nút duy nhất làm dựa trên ngữ cảnh. Vì không gian màn hình trên các thiết bị di động có hạn, hãy sử dụng các nút ngữ cảnh thực hiện các hành động khác nhau dựa trên những gì mà nhân vật có thể làm.
Ví dụ, bạn có thể hiển thị một nút "Thu thập" chủ động khi người dùng đang ở gần một rương vàng:
Sử dụng mẫu mã sau đây để tạo một nút di động có nhãn "Thu thập" và liên kết với chức năng 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:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
-- Đặt hình ảnh để màu xanh "Thu thập"
ContextActionService:SetImage("Interact", "rbxassetid://0123456789")
Ở một điểm khác trong trò chơi, bạn có thể thay đổi nút "Nói chuyện" khi người dùng đang ở gần một NPC. Thay vì thêm và xóa nút hiện có, bạn chỉ có thể sử dụng ContextActionService:BindAction() trên màn hình NPC hiện tại, thay đổi chức năng và hình ảnh nút.
Sử dụng mẫu mã sau đây để thiết lập nhãn nút hiện tại thành "Nói chuyện" và kết nối với một hàm tên là talkToNPC():
ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)-- Đặt hình ảnh thành màu vàng "Nói chuyện"ContextActionService:SetImage("Interact", "rbxassetid://0011223344")
Phát hiện các thiết bị khác
Trong các trải nghiệm ngang nền tảng, là cần thiết phải biết thiết bị hiện tại của người dùng để điều chỉnh UI và hiển thị các mục bản chỉnh bố trí chính xác.
Ví dụ, nếu một người dùng tiếp cận một rương kho báu và có một hành động liên quan đến việc thu thập vàng, bạn có thể hiển thị người dùng di động một nút "Thu thập" trên màn hình và người dùng máy tính để bàn một biểu tượng "T" trên màn hình.
Hãy lưu ý rằng một thiết bị di động cũng có thể có một chuột và bàn phím hoặc gamepad được kết nối. Nó cũng có thể là một máy tính để bàn có touchscreen được kết nối. Nó là quan trọ
Trong những trường hợp này, bạn có thể sử dụng UserInputService để phát hiện các thiết bị nhập. Nếu nhiều thiết bị nhập được bật, hãy sử dụng UserInputService:GetLastInputType() để lấy thiết bị nhập cuối cùng được sử dụng để hiển thị
Bạn có thể sử dụng các thành phần sau đây ModuleScript , được đặt trong ReplicatedStorage và đổi tên thành UserInputModule , để lấy đánh máynhập của người dùng, sau đó bạn có thể chỉnh sửa bố trí UI hoặc ngữ cảnh của trải nghiệm cho phù hợ
Sử dụng các thành phần sau đây ModuleScript để kiểm tra các thiết bị nhập được kích hoạt và thiết bị nhập cuối cùng đã được sử dụng:
local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- Nếu thiết bị có bàn phím và chuột đang hoạt động, hãy cho rằng những lựa chọn này
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- Else if device has touch capability but no keyboard and chuột, hãy tưởng tượng nhập touch
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- Nếu không có gamepad đang chơi, hãy tưởng tượng gamepad đang nhập
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
Một khi UserInputModule script đã ở địa điểm, hãy sử dụng mẫu code sau đây trong một LocalScript để nhận được đánh máynhập cuối cùng của người dùng:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Yêu cầu modulelocal UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))local currentUserInput, inputEnum = UserInputModule.getInputType()print(currentUserInput, inputEnum)