การเชื่อมต่อการป้อนข้อมูลของผู้ใช้กับการกระทำช่วยให้ผู้ใช้ควบคุมฟีเจอร์ของเกมได้ดีขึ้นและเป็นธรรมชาติมากขึ้น ในบทเรียนนี้ คุณจะผูกการกระทำการรีโหลดเข้ากับปุ่มเฉพาะ
เริ่มต้น
บทเรียนนี้ใช้เครื่องมือ Blaster ที่สร้างขึ้นใน สร้างเครื่องมือผู้เล่น คุณสามารถทำตามคำแนะนำเหล่านั้นเพื่อสร้างเครื่องมือ หรือคุณสามารถดาวน์โหลดโมเดล Blaster และแทรกมันลงใน StarterPack
โมเดลสามารถเพิ่มลงในคลังของคุณเพื่อใช้ระหว่างเกมใดก็ได้ เพื่อเพิ่มโมเดลลงในเกมของคุณ:
- ในเบราว์เซอร์ เปิดหน้า โมเดล คลิกปุ่ม Get ซึ่งจะเพิ่มโมเดลลงในคลังของคุณ
- ตรวจสอบให้แน่ใจว่าดรอปดาวน์อยู่ที่ My Models
- เลือกโมเดล Blaster เพื่อเพิ่มมันลงในเกม
สร้างตัวจัดการการกระทำ
ก่อนอื่น คุณจะต้องมีฟังก์ชันเพื่อจัดการเมื่อมีการตรวจจับการป้อนข้อมูลของผู้ใช้
เปิด LocalScript ของ ToolController ภายใน Blaster

สร้างตัวแปรเพื่อเก็บชื่อสำหรับการกระทำ
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)สร้างฟังก์ชันชื่อ onAction ที่รับสามอาร์กิวเมนต์: actionName, inputState, และ inputObject นี่จะเป็นฟังก์ชันที่ทำงานเมื่อมีการตรวจจับการป้อนข้อมูลของผู้ใช้
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)endlocal function toolEquipped()tool.Handle.Equip:Play()endภายในฟังก์ชัน ตรวจสอบว่า actionName ที่กำหนดตรงกับชื่อการกระทำการรีโหลดและตรวจสอบให้แน่ใจว่า inputState เป็น UserInputState.Begin (สถานะเริ่มต้น) สิ่งนี้สำคัญเพราะฟังก์ชันจะทำงานทุกครั้งที่ inputState เปลี่ยน แต่การรีโหลดต้องเกิดขึ้นเพียงครั้งเดียว
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thenendendเพื่อให้เห็นได้ชัดเมื่อผู้ใช้รีโหลด เปลี่ยน TextureId ของเครื่องมือเป็น "rbxassetid://6593020923" ชั่วขณะหนึ่ง และจากนั้นเปลี่ยนกลับไปเป็นค่าต้นฉบับของ "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
ผูกการกระทำ
ContextActionService สามารถใช้เพื่อ ผูก ฟังก์ชันกับการป้อนข้อมูลเฉพาะโดยใช้ฟังก์ชัน BindAction ซึ่งรับอาร์กิวเมนต์หลายตัว:
- ชื่อของการกระทำ
- ฟังก์ชันเพื่อจัดการการกระทำ (เรียกอีกอย่างว่า "callback")
- ว่าควรแสดงปุ่มหน้าจอสัมผัสหรือไม่
- จำนวน Enum.KeyCodes ใด ๆ เพื่อตรวจจับและเชื่อมโยงกับการกระทำ
KeyCodes เป็นค่าที่แทนปุ่มการป้อนข้อมูลที่แตกต่างกัน เช่น ปุ่มคีย์บอร์ดหรือปุ่มควบคุม รายการรหัสทั้งหมดมีอยู่ที่ ที่นี่
รับ ContextActionService ที่ด้านบนของสคริปต์
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"ภายในฟังก์ชัน toolEquipped ให้เรียก BindAction และส่งผ่านอาร์กิวเมนต์ต่อไปนี้:
- ชื่อของการกระทำ (RELOAD_ACTION)
- ตัวจัดการการกระทำ (onAction)
- ค่าที่สร้างปุ่มสัมผัส (true)
- การกดปุ่มเพื่อตรวจจับ (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()endทดสอบการเล่นโดยการสวมใส่เครื่องมือและกดปุ่ม R บนคีย์บอร์ดของคุณ ไอคอนกระเป๋าเป้ควรเปลี่ยนเป็นสัญลักษณ์รอชั่วขณะเพื่อสัญญาณว่าปืนกำลังรีโหลด:
ยกเลิกการผูกการกระทำ
เมื่อผู้ใช้ถอดเครื่องมือออก การกระทำจะต้อง ยกเลิกการผูก เพื่อที่พวกเขาจะไม่สามารถรีโหลดได้โดยไม่มีเครื่องมือที่สวมใส่
สร้างฟังก์ชันใหม่ชื่อ toolUnequipped และเรียก UnbindAction โดยส่งผ่านชื่อการกระทำ
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)เชื่อมต่อฟังก์ชัน toolUnequipped กับเหตุการณ์ Unequipped เพื่อให้ฟังก์ชันทำงานเมื่อเหตุการณ์เกิดขึ้น
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)ทดสอบการเล่นเพื่อยืนยันว่าทุกอย่างทำงานได้อย่างถูกต้อง คุณควรสามารถรีโหลดได้เมื่อเครื่องมือถูกสวมใส่ แต่ไม่สามารถรีโหลดได้เมื่อมันถูกถอดออก
การทำงานของการรีโหลดของคุณเสร็จสมบูรณ์แล้ว - สำหรับความท้าทายเพิ่มเติม ลองนับถอยหลังจำนวนกระสุนทุกครั้งที่ปืนบลาสเตอร์ถูกยิง คุณสามารถปิดฟังก์ชัน toolActivated เมื่อปืนไม่มีลูกกระสุน จากนั้นเปิดใช้งานอีกครั้งเมื่อการรีโหลดเสร็จสิ้น