Nhập di động

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

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ươ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ìnhCà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ếnThiế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áiTrê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ảiTrê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 ảnhTrê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 StarterGuiEnum.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ọnMô tả
ClickToMoveNgườ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
DynamicThumbstickMộ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.
ScriptableVô 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
ThumbstickMộ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.
UserChoiceCho 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ểuMô tả
tên hành độngchuỗiMộ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ăngToBindchức năngHàm để gọi khi đầu vào được kích hoạt. Hàm này nhận ba引数:
  • Một chuỗi bằng cùng với tên hành động.
  • Một Enum.UserInputState định nghĩa trạng thái nhập khi nó gọi chức năng.
  • Class.InputObject được sử dụng trong hàm gọi chức năng.
tạoTouchButtonbooleanKhi đú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ểutuỳ tùyCá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ímgamepad 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ên
ContextActionService: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út
ContextActionService: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út
ContextActionService: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ọ

PC
Di động

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 module
local UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))
local currentUserInput, inputEnum = UserInputModule.getInputType()
print(currentUserInput, inputEnum)