การเชื่อมต่อการป้อนข้อมูลของผู้ใช้เข้ากับการกระทำทำให้ผู้ใช้มีการควบคุมที่ดีขึ้นและชัดเจนมากขึ้นต่อฟีเจอร์ในประสบการณ์ของคุณ ในบทเรียนนี้ คุณจะทำการผูกการกระทำการโหลดใหม่เข้ากับปุ่มเฉพาะ
เริ่มต้น
บทเรียนนี้ใช้เครื่องมือ Blaster ที่สร้างขึ้นใน สร้างเครื่องมือสำหรับผู้เล่น คุณสามารถทำตามคำแนะนำเหล่านั้นเพื่อสร้างเครื่องมือหรือดาวน์โหลดโมเดล Blaster และแทรกลงใน StarterPack
โมเดลสามารถเพิ่มลงใน Inventories ของคุณเพื่อใช้ระหว่างประสบการณ์ต่างๆ ได้ เพื่อเพิ่มโมเดลลงในประสบการณ์ของคุณ:
- ในเบราว์เซอร์ เปิดหน้ารายการ โมเดล คลิกปุ่ม Get เพื่อเพิ่มโมเดลลงใน Invenotry ของคุณ
- ตรวจสอบให้แน่ใจว่าตัวเลื่อนตั้งอยู่ที่ 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)ทดสอบการเล่นเพื่อยืนยันว่าทุกอย่างทำงานได้อย่างถูกต้อง คุณควรสามารถโหลดใหม่ได้เมื่อเครื่องมือถูกสวมใส่ แต่ไม่สามารถโหลดใหม่ได้เมื่อมันถูกถอดออก
การ์ตูนโหลดใหม่ของคุณเสร็จสมบูรณ์แล้ว - สำหรับความท้าทายเพิ่มเติม ลองนับจำนวนกระสุนทุกครั้งที่มีการยิง blaster คุณสามารถปิดการทำงานของฟังก์ชัน toolActivated เมื่อปืนไม่มีลูกกระสุน และเปิดใช้งานอีกครั้งเมื่อการ์ตูนนั้นเสร็จสิ้น