Kết nối đầu vào của người dùng với các hành động mang lại cho người dùng khả năng kiểm soát tốt hơn và trực quan hơn đối với các tính năng của trò chơi của bạn. Trong hướng dẫn này, bạn sẽ liên kết một hành động nạp lại với một phím cụ thể.
Bắt đầu
Hướng dẫn này sử dụng công cụ Blaster được tạo ra trong Tạo Công Cụ Người Chơi. Bạn có thể làm theo các hướng dẫn đó để tạo công cụ hoặc bạn có thể tải xuống mô hình Blaster và chèn nó vào StarterPack.
Các mô hình có thể được thêm vào Kho của bạn để sử dụng giữa bất kỳ trò chơi nào. Để thêm một mô hình vào trò chơi của bạn:
- Trong trình duyệt, mở trang mô hình, nhấp vào nút Lấy. Điều này sẽ thêm mô hình vào kho của bạn.
- Đảm bảo rằng menu thả xuống đang ở Mô hình của tôi.
- Chọn mô hình Blaster để thêm nó vào trò chơi.
Tạo một trình xử lý hành động
Đầu tiên, bạn sẽ cần một hàm để xử lý khi đầu vào của người dùng được phát hiện.
Mở LocalScript ToolController bên trong Blaster.

Tạo một biến để lưu trữ tên cho hành động.
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function toolEquipped()tool.Handle.Equip:Play()endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)Tạo một hàm có tên onAction nhận ba đối số: actionName, inputState, và inputObject. Đây sẽ là hàm chạy khi đầu vào của người dùng được phát hiện.
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)endlocal function toolEquipped()tool.Handle.Equip:Play()endBên trong hàm, kiểm tra rằng actionName cho trước khớp với tên hành động nạp lại và đảm bảo rằng inputState là UserInputState.Begin (trạng thái bắt đầu). Điều này rất quan trọng vì hàm sẽ chạy mỗi khi inputState thay đổi, nhưng việc nạp lại chỉ cần xảy ra một lần.
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thenendendĐể làm cho việc nạp lại của người dùng trở nên rõ ràng, hãy thay đổi TextureId của công cụ thành "rbxassetid://6593020923" trong một khoảnh khắc, và sau đó thay đổi lại thành giá trị ban đầu của nó là "rbxassetid://92628145".
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endend
Liên kết hành động
ContextActionService có thể được sử dụng để liên kết một hàm với một đầu vào cụ thể bằng cách sử dụng hàm BindAction, hàm này chấp nhận một số đối số:
- Tên của hành động.
- Hàm để xử lý hành động (còn được gọi là "callback").
- Có nên hiển thị một nút cảm ứng hay không.
- Bất kỳ số lượng Enum.KeyCodes nào để phát hiện và liên kết với hành động.
KeyCodes là các giá trị đại diện cho các nút đầu vào khác nhau, chẳng hạn như phím bàn phím hoặc nút điều khiển. Một danh sách đầy đủ các mã có sẵn tại đây.
Lấy ContextActionService ở đầu script.
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"Bên trong hàm toolEquipped, gọi BindAction và truyền qua các đối số sau:
- Tên của hành động (RELOAD_ACTION)
- Trình xử lý hành động (onAction)
- Một giá trị để tạo một nút cảm ứng (true)
- Một lần nhấn phím để phát hiện (Enum.KeyCode.R)
local RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endChơi thử bằng cách trang bị công cụ và nhấn phím R trên bàn phím của bạn. Biểu tượng ba lô nên thay đổi tạm thời thành một biểu tượng chờ để báo hiệu rằng vũ khí đang nạp lại:
Hủy liên kết hành động
Khi người dùng bỏ trang bị công cụ, hành động cần được hủy liên kết để họ không thể nạp lại mà không có công cụ được trang bị.
Tạo một hàm mới có tên toolUnequipped và gọi UnbindAction, truyền qua tên hành động.
local function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)Kết nối hàm toolUnequipped với sự kiện Unequipped để hàm sẽ chạy khi sự kiện được kích hoạt.
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Unequipped:Connect(toolUnequipped)tool.Activated:Connect(toolActivated)Chơi thử để xác nhận rằng mọi thứ hoạt động đúng cách. Bạn nên có thể nạp lại khi công cụ được trang bị, nhưng không khi nó không được trang bị.
Hoạt hình nạp lại của bạn giờ đã hoàn thành - để có một thử thách thêm, hãy thử đếm ngược một bộ đếm đạn mỗi khi blaster được bắn. Sau đó, bạn có thể vô hiệu hóa hàm toolActivated khi súng không còn đạn, sau đó kích hoạt lại nó khi hoạt hình nạp lại hoàn tất.