Hệ thống Hành động Nhập liệu

*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ệ thống Hành động Nhập liệu đa nền tảng cho phép bạn kết nối các hành động và sắp xếp các liên kết qua nhiều đầu vào phần cứng khác nhau trong thời gian chỉnh sửa. Kết hợp với các ngữ cảnh, bạn có thể dễ dàng cấu hình và chỉnh sửa một hệ thống nhập liệu mô-đun hoạt động trên bất kỳ thiết bị nào trong bất kỳ giai đoạn chơi nào. Một số trường hợp sử dụng bao gồm:

  • Một hệ thống bắn súng góc nhìn thứ nhất với các hành động thay đổi động tùy thuộc vào việc người chơi đang ở chế độ chiến đấu hay chế độ quan sát.
  • Một hệ thống lái xe toàn diện được trang bị tăng tốc/giảm tốc, bộ tăng tốc xe và trạm tiếp nhiên liệu.
  • Phím tắt cho một hệ thống khả năng trong một trò chơi chiến đấu để thay đổi các động tác một cách liền mạch mà không để người chơi bỏ lỡ một cú đấm nào.

Các ngữ cảnh nhập liệu

Một InputContext là một tập hợp các hành động chứa các hành động nhập liệu liên quan, ví dụ như PlayContext cho các điều khiển nhân vật trong trò chơi và NavContext cho các điều khiển để điều hướng xung quanh các menu UI. Bạn có thể bật/tắt các ngữ cảnh (và các hành động tương ứng của chúng) thông qua thuộc tính Enabled, chẳng hạn như để bật NavContext khi một menu kho mở và sau đó chuyển sang PlayContext khi người chơi đóng menu và trở lại gameplay chính.

Ngay cả khi một trò chơi có thể không sử dụng nhiều ngữ cảnh nhập liệu ban đầu, vẫn được khuyến nghị tạo một ngữ cảnh chính ở cấp độ cao nhất của bất kỳ hệ thống nhập liệu nào, chẳng hạn như thể hiện PlayContext cho các đầu vào xảy ra trong quá trình chơi.

  1. ĐƯỢC KHUYẾN NGHỊ
    Tạo một Folder có tên Inputs bên trong ReplicatedStorage để chứa các ngữ cảnh nhập liệu khác nhau.

    Thư mục mới bên trong ReplicatedStorage, được đổi tên thành Inputs
  2. Chèn một InputContext mới vào thư mục và đổi tên nó thành PlayContext.

    Thể hiện InputContext mới bên trong ReplicatedStorage, được đổi tên thành PlayContext
  3. TÙY CHỌN
    Trong cửa sổ Thuộc tính, đặt Priority thành 2000 và bật Sink. Một ngữ cảnh với Sink được bật sẽ tiêu thụ các sự kiện nhập liệu cho các KeyCodes đã liên kết của nó ở mức độ ưu tiên của nó, chặn các đầu vào đó không đến được các ngữ cảnh có độ ưu tiên thấp hơn. Điều này rất thực tế cho các trường hợp như một màn hình kho cần ngăn chặn các đầu vào gameplay cụ thể trong khi mở. Trong ví dụ này, PlayContext được cấp cho một Priority đủ cao để tiêu thụ các đầu vào đã liên kết của nó trước khi các ngữ cảnh mặc định PlayerScripts xử lý chúng.

    InputContext với Priority được đặt thành 2000 và Sink được bật

Các hành động nhập liệu

Một InputAction định nghĩa một cơ chế hành động gameplay như "Nhảy", "Chạy", hoặc "Bắn". Những hành động này sau đó được ánh xạ đến các đầu vào phần cứng bằng cách sử dụng các liên kết nhập liệu.

Một InputAction có thể có nhiều biến thể tùy thuộc vào thuộc tính Type của nó (Enum.InputActionType). Mặc định là Bool, được thiết kế để nhận các giá trị true/false từ việc nhấn/thả các đầu vào như ButtonA, E, hoặc MouseLeftButton.

Loại Hành động Nhập liệuVí dụ Sử dụng
BoolCác hành động được kích hoạt như nhảy, bắn, chạy, v.v. với hỗ trợ cho các ngưỡng nhấn/thả trên các đầu vào analog.
Direction1DCác hành động biến đổi từ không đến đầy như bàn đạp tăng tốc của xe hoặc mức độ phóng đại của ống ngắm.
Direction2DDi chuyển theo hướng 2D như xoay camera, hoặc di chuyển nhân vật Roblox tiêu chuẩn.
Direction3DDi chuyển theo hướng 3D như một phương tiện bay có thể bay lên/xuống, tăng tốc/giảm tốc, và trôi trái/phải.
ViewportPositionTọa độ viewport 2D như đầu vào chuột, chẳng hạn cho các con trỏ tùy chỉnh hoặc raycasting để chọn các đối tượng trong thế giới.

Để thử nghiệm một InputAction cho việc chạy nhân vật đơn giản:

  1. ĐƯỢC KHUYẾN NGHỊ
    Chọn đối tượng Workspace cấp cao nhất trong Explorer và sau đó, trong cửa sổ Thuộc tính, đặt thuộc tính PlayerScriptsUseInputActionSystem thành Enabled.

  2. Tạo một InputAction mới bên trong ngữ cảnh PlayContext trong ReplicatedStorage. Đổi tên nó thành CharacterSprint để chỉ định hành động của nó.

    Thể hiện InputAction mới bên trong một InputContext, được đổi tên thành CharacterSprint
  3. Trong cửa sổ Thuộc tính, lưu ý rằng Type của hành động là Bool (mặc định). Đây là một loại hợp lý cho việc chạy nhân vật đơn giản như một hành động boolean true/false (nhân vật đang chạy hoặc không chạy).

    Thuộc tính Type của một InputAction được đặt thành Bool

Các liên kết nhập liệu

Một InputBinding định nghĩa liên kết phần cứng nào nên kích hoạt InputAction cha, chẳng hạn như nhấn phím, nút tay cầm, hoặc chạm vào một thiết bị cảm ứng. Để đảm bảo tính tương thích đa nền tảng, mỗi InputAction nên có một InputBinding cho tay cầm, bàn phím/chuột, và cảm ứng như được minh họa ở đây.

Roblox cung cấp các liên kết đầu vào mặc định cho chuyển động, điều khiển camera và tương tác cơ bản với môi trường — người chơi Roblox đã quen thuộc với những điều khiển này, vì vậy bạn chỉ nên ghi đè chúng trong những trường hợp cụ thể. Cũng lưu ý rằng các đầu vào đã được dự trữ không thể bị ghi đè và sẽ luôn hoạt động với mục đích của chúng.

Hành độngChuột/Bàn phímGamepadCảm ứng
Mở menu RobloxEscStart button (ButtonStart)Không có
Developer ConsoleF9Không cóKhông có
Chế độ toàn màn hình (Windows)
Hiển thị màn hình chính (Mac)
F11Không cóKhông có
Ghi video (Windows)F12Không cóKhông có
Chụp màn hìnhPrintScreenKhông cóKhông có

Loại Type được gán cho InputAction cha ảnh hưởng trực tiếp đến các loại đầu vào chung nào (phím/nút/chạm, kích hoạt analog, cần điều khiển, v.v.) là hợp lệ cho các thể hiện InputBinding con. Ngược lại, các giá trị được gửi đến các sự kiện kết nối của hành động cha phụ thuộc vào loại đầu vào đã chọn của một liên kết. Xem các sự kiện nhập liệu để biết chi tiết về mối tương quan giữa các loại hành động, các liên kết và các giá trị trả về.

Để kết nối các liên kết cho việc chạy nhân vật đơn giản:

  1. Chèn một InputBinding mới vào hành động CharacterSprint và đổi tên nó thành KeyboardBinding. Sau đó, đặt thuộc tính KeyCode của liên kết thành LeftShift.

  2. Chèn một InputBinding thứ hai vào hành động CharacterSprint và đổi tên nó thành GamepadBinding. Sau đó, đặt thuộc tính KeyCode của liên kết thành ButtonY.

  3. Bên trong một ScreenGui container trong StarterGui, tạo một nút trên màn hình, đổi tên nó thành SprintButton, và định vị/thay đổi kích thước nó theo ý muốn.

  4. Chèn một InputBinding thứ ba vào hành động CharacterSprint và đổi tên nó thành TouchBinding. Sau đó, trong cửa sổ Thuộc tính, liên kết thuộc tính UIButton của liên kết với nút SprintButton mà bạn đã tạo trước đó bên trong StarterGui.

Các sự kiện nhập liệu

Thể hiện InputAction có ba sự kiện tích hợp sẵn để xử lý đầu vào của người chơi đến từ InputBindings.

  • Pressed — Sự kiện này chỉ được kích hoạt khi Type của hành động nhập liệu được đặt thành Bool, và chỉ khi trạng thái chuyển từ false sang true.
  • Released — Sự kiện này chỉ được kích hoạt khi Type của hành động nhập liệu được đặt thành Bool, và chỉ khi trạng thái chuyển từ true sang false.
  • StateChanged — Sự kiện này được kích hoạt cho tất cả các loại hành động nhập liệu bất cứ khi nào trạng thái thay đổi, ngoại trừ khi trạng thái cố gắng chuyển sang cùng một trạng thái.

Tùy thuộc vào Type của hành động nhập liệu (Bool, Direction1D, Direction2D, Direction3D, hoặc ViewportPosition) và loại đầu vào chung đến từ một InputBinding con (phím/nút/chạm, kích hoạt analog, cần điều khiển, v.v.), các giá trị khác nhau được trả về cho các trình xử lý sự kiện Pressed, Released, và StateChanged. Xem các bảng sau để hiểu rõ hơn về mối tương quan.

Loại Bool là tốt nhất cho các hành động được kích hoạt như nhảy, bắn, chạy, v.v. với hỗ trợ cho các ngưỡng nhấn/thả trên các đầu vào analog.

Các Loại Đầu vào Hợp lệ trên InputBindingsTrả về cho Sự kiện InputAction
Các đầu vào boolean từ các phím bàn phím hoặc các nút chuột/tay cầm cơ bản thông qua thuộc tính KeyCode của liên kết, hoặc một lần nhấn/thả GuiButton thông qua thuộc tính UIButton của liên kết.
  • Sự kiện Pressed:
    • true khi nhấn
  • Sự kiện Released:
    • true khi thả
  • Sự kiện StateChanged:
    • true (đang nhấn) hoặc false (đã thả)
Các lượng đầu vào biến đổi từ các đầu vào analog như các kích hoạt tay cầm (ButtonL2/ButtonR2) thông qua thuộc tính KeyCode của liên kết.

Để kết nối các sự kiện cho việc chạy nhân vật đơn giản:

  1. Chèn một Script mới vào cây CharacterSprint, bên cạnh các liên kết nhập liệu khác nhau. Sau đó, đặt RunContext của nó thành Client và đổi tên nó thành OnActivate.

  2. Dán mã sau vào script OnActivate. Lưu ý kết nối sự kiện Pressed ở các dòng 1315 mà gấp đôi tốc độ đi bộ của nhân vật khi một liên kết nhập liệu chạy được nhấn, và kết nối sự kiện Released tương ứng ở các dòng 1618 mà đặt lại tốc độ đi bộ về mặc định khi một liên kết nhập liệu chạy được thả.

    OnActivate (Client Script)
    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local character = player.Character
    if not character or character.Parent == nil then
    character = player.CharacterAdded:Wait()
    end
    local humanoid = character:WaitForChild("Humanoid")
    local defaultWalkSpeed = humanoid.WalkSpeed
    local inputAction = script.Parent
    inputAction.Pressed:Connect(function()
    humanoid.WalkSpeed = defaultWalkSpeed * 2
    end)
    inputAction.Released:Connect(function()
    humanoid.WalkSpeed = defaultWalkSpeed
    end)
  3. Chơi thử trò chơi của bạn và thử nghiệm hành động chạy nhân vật với các liên kết mà bạn đã chọn trước đó: LeftShift cho bàn phím, ButtonY cho tay cầm, và nút trên màn hình SprintButton cho các thiết bị cảm ứng. Hãy nhớ rằng bạn có thể sử dụng Bộ giả lập tay cầm để thử nghiệm các đầu vào tay cầm trực tiếp trong Roblox Studio.

Thay đổi ngữ cảnh

Khi bạn đã có một ngữ cảnh nhập liệu như PlayContext, bạn có thể bật/tắt nó trong quá trình chơi thông qua lập trình, thay đổi Priority của nó để xác định các hành động nào có ưu tiên hơn các hành động khác, và Sink các đầu vào để không bị xử lý trong các ngữ cảnh có độ ưu tiên thấp hơn.

  1. Để dễ dàng chuyển đổi ngữ cảnh từ các script khác, hãy chèn một BindableEvent mới vào thư mục nhập liệu của bạn trong ReplicatedStorage và đổi tên nó thành ContextEvent.

  2. Tạo một Script mới ở cùng cấp, đặt RunContext của nó thành Client, và đổi tên nó thành UpdateContext.

  3. Bên trong script UpdateContext, dán mã sau:

    UpdateContext (Client Script)
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")
    local contextEvent = inputsFolder:WaitForChild("ContextEvent")
    -- Kết nối sự kiện có thể liên kết
    contextEvent.Event:Connect(function(targetContext, enabled)
    local context = inputsFolder:FindFirstChild(targetContext)
    if context then
    context.Enabled = enabled
    print(context.Name .. ": " .. tostring(context.Enabled))
    else
    warn("Ngữ cảnh Nhập liệu không tìm thấy!")
    end
    end)
  4. Với script UpdateContext đã được đặt, bạn có thể cập nhật một InputContext có tên bằng cách kích hoạt sự kiện có thể liên kết, chẳng hạn từ một LocalScript điều khiển một GuiButton bên trong một container ScreenGui.

    Script Nút
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")
    local contextEvent = inputsFolder:WaitForChild("ContextEvent")
    local button = script.Parent
    button.Activated:Connect(function()
    -- Kích hoạt sự kiện có thể liên kết với ngữ cảnh nhập liệu mục tiêu và trạng thái bật
    contextEvent:Fire("PlayContext", true)
    end)

Hiển thị các liên kết

Khi bạn đã thiết lập các hành độngcác liên kết, bạn thường cần hiển thị cho người chơi, thông qua các gợi ý hỗ trợ trên màn hình, phím hoặc nút nào kích hoạt mỗi hành động:


Hệ thống Hành động Nhập liệu cung cấp hai cách tiếp cận:

  • ĐƯỢC KHUYẾN NGHỊ
    InputActionLabel — Một GuiObject không cần mã, kéo và thả tự động hiển thị đầu vào chính xác theo nền tảng.
  • TRUNG BÌNH
    PreferredBinding — Một thuộc tính InputAction chỉ đọc cho các nhà phát triển muốn kiểm soát hoàn toàn cách các liên kết được hiển thị trong UI tùy chỉnh.

InputActionLabel là một GuiObject mà bạn có thể chèn vào bất kỳ ScreenGui hoặc SurfaceGui nào. Khi thuộc tính InputAction của nó được đặt để tham chiếu đến một thể hiện InputAction hiện có, nó tự động giải quyết và hiển thị liên kết phím chính xác cho thiết bị nhập liệu hiện tại của người chơi — không cần lập trình. Khi người chơi chuyển đổi thiết bị (ví dụ, nhặt tay cầm sau khi sử dụng bàn phím) hoặc thay đổi liên kết điều khiển, nhãn sẽ cập nhật ngay lập tức.

Để thêm một InputActionLabel:

  1. Bên trong một container ScreenGui trong StarterGui, chèn một InputActionLabel giống như bất kỳ GuiObject nào khác.

  2. Trong cửa sổ Thuộc tính, đặt thuộc tính InputAction của nó thành thể hiện InputAction mà bạn muốn hiển thị (ví dụ, hành động "Chạy" của bạn dưới ReplicatedStorage) và định vị/thay đổi kích thước nó theo ý muốn.

  3. Khi nhãn giải quyết những gì cần hiển thị, nó kiểm tra các điều sau theo thứ tự:

    1. Hình ảnh Tùy chỉnh — Nếu các InputBindings con có thuộc tính DisplayImage được đặt, nhãn sẽ hiển thị những hình ảnh đó trực tiếp.

    2. Hình ảnh Phím Nền tảng — Thiếu hình ảnh tùy chỉnh, nhãn sẽ hiển thị hình ảnh do nền tảng cung cấp cho các InputBindings con thông qua UserInputService:GetImageForKeyCode(), nếu có sẵn. Các liên kết hợp thành với các bộ điều chỉnh sẽ hiển thị nhiều biểu tượng với các dấu + phân cách.

    3. Tên Tùy chỉnh — Thiếu hình ảnh có sẵn, nếu các InputBindings con có thuộc tính DisplayName được đặt, nhãn sẽ hiển thị văn bản đó bằng cách sử dụng các thuộc tính kiểu của nhãn.

    4. Chuỗi Phím Nền tảng — Thiếu tất cả các điều trên, nhãn sẽ hiển thị các chuỗi do nền tảng cung cấp thông qua UserInputService:GetStringForKeyCode().

    5. Nếu không có InputAction nào được gán hoặc không có InputBinding con nào tồn tại, nhãn sẽ hiển thị một biểu tượng giữ chỗ.

Trình quản lý Hành động Nhập liệu

Công cụ Trình quản lý Hành động Nhập liệu là một giao diện thống nhất, kiểu ma trận để thiết kế, kiểm tra và mở rộng kiến trúc nhập liệu của bạn.

Để truy cập nó, hãy điều hướng đến menu Cửa sổ trong Studio và chọn Nhập liệu ⟩ Trình quản lý Hành động Nhập liệu. Nếu trò chơi của bạn đã sử dụng các ngữ cảnh, hành động, hoặc các liên kết, trình quản lý sẽ tự động quét DataModel và trích xuất các thể hiện hiện có đó vào lưới chỉnh sửa. Bất kỳ thể hiện liên quan đến nhập liệu mới nào sẽ tự động được đưa vào một thư mục Inputs bên trong ReplicatedStorage.

Thư mục bên trong ReplicatedStorage có tên Inputs

Để cấu hình một thiết lập nhập liệu cho chạy nhân vật như đã nêu trong các phần trên:

  1. ĐƯỢC KHUYẾN NGHỊ
    Chọn đối tượng Workspace cấp cao nhất trong Explorer và sau đó, trong cửa sổ Thuộc tính, đặt thuộc tính PlayerScriptsUseInputActionSystem thành Enabled.

  2. Bên trong một container ScreenGui trong StarterGui, tạo một nút trên màn hình, đổi tên nó thành SprintButton, và định vị/thay đổi kích thước nó theo ý muốn.

  3. Trong Trình quản lý Hành động Nhập liệu, di chuột qua tiêu đề cột Ngữ cảnh và nhấp vào nút . Nhập một tên phù hợp cho ngữ cảnh mới như PlayContext và nhấn Enter. Một InputContext với tên tương ứng xuất hiện trong ReplicatedStorage.

    Thể hiện InputContext mới bên trong ReplicatedStorage có tên PlayContext
  4. Di chuột qua ngữ cảnh mới và nhấp vào nút . Từ menu bật lên, chọn Bool, nhập CharacterSprint cho tên hành động, và nhấn Enter. Một InputAction với tên tương ứng xuất hiện dưới ngữ cảnh.

    Thể hiện InputAction mới bên trong một InputContext có tên CharacterSprint
  5. Trong hàng CharacterSprint mới, gán các liên kết cho mỗi loại đầu vào:

    1. Bàn phím và Chuột — Nhấp vào nút mũi tên và chọn LeftShift từ menu chọn.
    2. Cảm ứng — Nhấp vào ô và sau đó, trong cấu trúc Explorer, nhấp vào đối tượng SprintButton mà bạn đã chèn trước đó vào ScreenGui.
    3. Tay cầm — Nhấp vào nút mũi tên và chọn ButtonY từ menu chọn.
  6. Chèn một Script mới vào cây CharacterSprint, bên cạnh các liên kết nhập liệu khác nhau. Sau đó, đặt RunContext của nó thành Client và đổi tên nó thành OnActivate.

  7. Dán mã sau vào script OnActivate. Lưu ý kết nối sự kiện Pressed ở các dòng 1315 mà gấp đôi tốc độ đi bộ của nhân vật khi một liên kết nhập liệu chạy được nhấn, và kết nối sự kiện Released tương ứng ở các dòng 1618 mà đặt lại tốc độ đi bộ về mặc định khi một liên kết nhập liệu chạy được thả.

    OnActivate (Client Script)
    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local character = player.Character
    if not character or character.Parent == nil then
    character = player.CharacterAdded:Wait()
    end
    local humanoid = character:WaitForChild("Humanoid")
    local defaultWalkSpeed = humanoid.WalkSpeed
    local inputAction = script.Parent
    inputAction.Pressed:Connect(function()
    humanoid.WalkSpeed = defaultWalkSpeed * 2
    end)
    inputAction.Released:Connect(function()
    humanoid.WalkSpeed = defaultWalkSpeed
    end)
©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.