Hơn một nửa tất cả các phiên Roblox được chơi trên các thiết bị di động, vì vậy rất quan trọng phải xem xét khả năng truy cập chéo khi thiết kế một trải nghiệm cho một lượng lớn khán giả.Bạn nên hướng tới hỗ trợ một loạt các thiết bị nhập, bao gồm nhập chuột và bàn phím và gamepad.
Khi thiết kế một trải nghiệm di động, hãy xem xét hướng thiết bị mà bạn dự định người dùng sẽ sử dụng trong trải nghiệm của bạn, sau đó thực hiện các đầu vào của bạn với ContextActionService để thực hiện các nhiệm vụ nhập liệu di động liên quan sau:
- Tạo nút trên màn hình chỉ có thể nhìn thấy trên các thiết bị di động.
- Thiết lập đầu vào phụ thuộc bối cảnh cho phép cùng một nút hoặc đầu vào thực hiện một hành động khác 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 con 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 lời nhắc trên màn hình chính xác cho người dùng.
Hướng thiết bị
Trên điện thoại và máy tính bảng, hướng thiết bị chủ yếu ảnh hưởng đến trải nghiệm và tương tác của người dùng.Ví dụ, chế độ cảnh quan tốt nhất được vận hành với hai ngón tay trong khi chế độ chân dung có thể cho phép giao diện một ngón tay.
Mặc định, các trải nghiệm Roblox chạy trong chế độ cảnh, cho phép trải nghiệm chuyển đổi giữa cảnh "bên trái" và cảnh "bên phải" khi thiết bị của người dùng xoay.Tuy nhiên, trải nghiệm có thể bị khóa vào một hướng cụ thể nếu cần.
Các chế độ hướng
Có năm chế độ xoay khác nhau, bao gồm hai chế độ dựa trên cảm biến và ba chế độ bị khóa.
Các chế độ cảm biến | |
---|---|
Cảm biến cảnh quan | Cài đặt Roblox mặc định mà trải nghiệm luôn xuất hiện trong chế độ cảnh quan (không có chế độ chân dung) và thiết bị phát hiện hướng vật lý của nó để đảm bảo rằng góc nhìn trải nghiệm luôn hướng lên trên. |
Cảm biến | Thiết bị phát hiện hướng vật lý của nó để đảm bảo rằng góc nhìn trải nghiệm luôn hướng lên, chuyển đổi giữa chế độ cảnh quan và chế độ chân dung khi cần thiết. |
Chế độ bị khóa | |
---|---|
Cảnh quan còn lại | Trên các thiết bị có nút nhà vật lý, nút nhà là bên trái của màn hình.Trên các thiết bị có thanh trang chủ/điều hướng ảo, khu vực chạm của nó nằm ở đáy của màn hình. |
Cảnh quan bên phải | Trên các thiết bị có nút trang chủ vật lý, nút trang chủ ở bên phải của màn hình.Trên các thiết bị có thanh trang chủ/điều hướng ảo, khu vực chạm của nó nằm ở đáy của màn hình. |
Hồ sơ | Trên các thiết bị có nút trang chủ vật lý, nút trang chủ nằm dưới màn hình.Trên các thiết bị có thanh trang chủ/điều hướng ảo, khu vực chạm của nó nằm ở đáy của màn hình. |
Tính chất hướng
Khi đặt một hướng, bạn có thể đặt hướng bắt đầu, hướng trong trải nghiệm và hướng hiện tại.
Bắt đầu hướng dẫn
StarterGui.ScreenOrientation đặt hướng mặc định cho một địa điểm. Các giá trị chấp nhận bao gồm:
Bởi vì thuộc tính này ảnh hưởng đến tất cả các người dùng mới tham gia trải nghiệm, bạn có thể đặt giá trị của nó trong StarterGui → Enum.ScreenOrientation trong Studio.
Hướng trong kinh nghiệm
PlayerGui.ScreenOrientation thay đổi rõ ràng hướng trải nghiệm cho một người dùng.Khi thuộc tính này được đặt thành một trong các Enum.ScreenOrientation enums trong một LocalScript, trải nghiệm sẽ ngay lập tức tự định hình để phù hợp với cài đặt.Điều này có thể hữu ích khi một trải nghiệm cần cung cấp một trải nghiệm cụ thể như khóa góc nhìn sang chân dung cho một trò chơi nhỏ.
Ví dụ mã sau trong một LocalScript đặt hướng màn hình thành dọc:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")task.wait(2)playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait
Hướng hiện tại
PlayerGui.CurrentScreenOrientation nhận được hướng thiết bị hiện tại. Các giá trị có thể bao gồm:
Các mã sau in hướng màn hình hiện tại của người dùng:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")print(playerGUI.CurrentScreenOrientation)
Các chế độ di chuyển nhân vật
Roblox cung cấp một số tính năng StarterPlayer bạn có thể thiết lập để 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ể đặt các chương trình kiểm soát di chuyển di động cho các trải nghiệm Roblox bằng cách thay đổi giá trị của StarterPlayer.DevTouchMovementMode thành một trong các 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ấn vào một vị trí mục tiêu.Chế độ này bao gồm một nút nhảy trong khu vực dưới bên phải của màn hình.Nhảy tự động luôn luôn hoạt động trong chế độ di chuyển này. |
DPad | |
DynamicThumbstick | Một thanh gạt năng độ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 trong khu vực 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 di động nếu UserChoice được đặ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 chương trình kiểm soát riêng của mình . |
Thumbpad | |
Thumbstick | Một thanh gạt di động nằm ở vùng thấp bên trái của màn hình.Không giống như DynamicThumbstick, vị trí của thanh gạt là tĩnh và không thay đổi vị trí khi người dùng chạm vào màn hình. |
UserChoice | Cho phép người dùng chọn cơ chế điều khiển mong muốn của họ từ menu Cài đặt trong trải nghiệm. Đây là chế độ di chuyển mặc định cho các trải nghiệm. |
Nhảy tự động
Khi StarterPlayer.AutoJumpEnabled được bật, nhân vật của người dùng tự động nhảy qua các khoảng trống khi tiếp cận cạnh của một nền tảng.StarterPlayer.AutoJumpEnabled được bật mặc định cho các thiết bị di động.
Vô hiệu hóa StarterPlayer.AutoJumpEnabled để vô hiệu hóa tính năng này và buộc người dùng phải nhảy chỉ bằng cách sử dụng keybind của họ.
Nút di động tùy chỉnh
Để thêm nút di động tùy chỉnh, hãy sử dụng phương pháp ContextActionService:BindAction() nhận các tham số sau:
Tham số | Loại | Mô tả |
---|---|---|
actionName | chuỗi | Một chuỗi xác định cho hành động bạn đang gắn kết. Bạn có thể sử dụng tên hành động với các chức năng khác trong ContextActionService để chỉnh sửa gắn kết. |
functionToBind | chức năng | Chức năng được gọi khi đầu vào được chỉ định được kích hoạt. Chức năng này nhận ba tham số:
|
createTouchButton | boolean như vậy | Khi đúng, tạo một nút trên màn hình khi trò chơi đang chạy trên thiết bị di động. |
inputTypes | tuple đăng nhập | Các đầu vào bạn dự định gắn vào chức năng, chẳng hạn như các giá trị enum từ một Enum.KeyCode . |
Bạn có thể sử dụng ví dụ mã sau đây để tạo một hành động Tương tác tạo ra một nút trên màn hình và cũng chấp nhận một đầu vào bàn phím và gamepad:
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- Gắn hành động vào chức năng
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
Một khi nút tùy chỉnh được thêm vào, 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() .
- Để thay đổi nhãn văn bản cho một nút di động, gọi SetTitle() với chuỗi actionName và một chuỗi tiêu đề.
- Để sử dụng hình ảnh tùy chỉnh giống như các nút GUI khác, hãy gọi phương pháp SetImage(), thay thế ID tài sản ví dụ bên dưới bằng hình ảnh của riêng bạn.
- Để đặt vị trí của một nút, gọi SetPosition() với một giá trị vị trí UDim2.
-- Đặt nhãn nút thành "Nói chuyện"ContextActionService:SetTitle("Interact", "Talk")-- Chỉnh hình ảnh nútContextActionService:SetImage("Interact", "rbxassetid://104919049969988")-- Đặt vị trí nútContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
Nhập phụ thuộc vào ngữ cảnh
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 bị giới 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ì nhân vật có thể làm.
Ví dụ, bạn có thể hiển thị một nút "Thu thập" hoạt động khi người dùng đang đứng gần một chiếc rương vàng, gắn vào 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:SetTitle("Interact", "Collect")
ContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
Tại một điểm khác trong quá trình trải nghiệm trò chơi, bạn có thể thay đổi nút thành "Nói chuyện" khi người dùng đang ở gần một NPC.Thay vì xóa nút hiện tại để đặt nút khác, bạn có thể chỉ cần gọi BindAction() trên hành động "Interact" hiện tại, thay đổi chức năng mục tiêu và tiêu đề nút:
ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)ContextActionService:SetTitle("Interact", "Talk")
Phát hiện các thiết bị khác
Trong trải nghiệm trên nhiều nền tảng, thật quan trọng để tham chiếu các lựa chọn nhập ưa thích của người dùng bằng cách hiển thị các lựa chọn nhập cho thiết bị đang được sử dụng chủ động.Ví dụ, một thiết bị di động có thể có một chuột và bàn phím hoặc gamepad kết nối, hoặc có thể có khả năng một máy tính xách tay có màn hình cảm ứng được bật.Nếu nhiều nguồn nhập được bật, bạn có thể sử dụng GetLastInputType() để lấy thiết bị nhập cuối cùng của người dùng.
Là một nền tảng, bạn có thể sử dụng ModuleScript dưới đây, được đặt trong ReplicatedStorage và đổi tên thành UserInputModule để lấy đánh máyđầu vào của người dùng, sau đó bạn có thể điều chỉnh bố trí hoặc ngữ cảnh cho trải nghiệm của mình theo nhu cầu cụ thể.
local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- Nếu thiết bị có bàn phím và chuột hoạt động, cho rằng những đầu vào đó
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- Nếu thiết bị có khả năng chạm nhưng không có bàn phím và chuột, cho rằng đầu vào chạm được
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- Nếu thiết bị có gamepad hoạt động, cho rằng gamepad đã 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
Khi kịch bản UserInputModule đã được triển địa điểm, sử dụng mẫu mã sau đây trong LocalScript để lấy đá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)