การเชื่อมต่อการใส่ข้อมูลผู้ใช้กับการดำเนินการทำให้ผู้ใช้ควบคุมคุณสมบัติของประสบการณ์ได้ดีขึ้นและเป็นธรรมชาติมากขึ้นในบทแนะนำนี้ คุณจะผูกการดำเนินการรีโหลดไปยังกุญแจเฉพาะ
เริ่มต้น
บทสอนนี้ใช้เครื่องมือ Blaster ที่สร้างขึ้นใน สร้างเครื่องมือผู้เล่นคุณสามารถทำตามคำแนะนำเหล่านั้นเพื่อสร้างเครื่องมือหรือคุณสามารถดาวน์โหลดรูปแบบ Blaster และใส่ลงใน StarterPack สามารถเพิ่มโมเดลลงในสินค้าคงคลังของคุณเพื่อใช้ระหว่างประสบการณ์ใดก็ได้ เพื่อเพิ่มโมเดลลงในประสบการณ์ของคุณ:
- ในเบราว์เซอร์เปิดหน้ารูปแบบ model คลิกปุ่ม รับ คลังไอเท็ม
- ใน Studio ไปที่แท็บ ดู และคลิกที่ กล่องเครื่องมือ 3. ในหน้าต่างกล่องเครื่องมือ คลิกที่ปุ่ม สินค้าคงคลัง จากนั้นตรวจสอบให้แน่ใจว่าการเลื่อนลงอยู่ใน รูปแบบของฉัน 4. เลือกโมเดล Blaster เพื่อเพิ่มลงในประสบการณ์
สร้างตัวจัดการการดำเนินการ
ก่อนอื่น คุณจะต้องมีฟังก์ชันที่จะจัดการเมื่อตรวจพบการใส่ข้อมูลของผู้ใช้
เปิด เครื่องควบคุมเครื่องมือ LocalScript
แอ็คชัน
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 เพื่อตรวจจับและเชื่อมโยงกับการดําเนินการ
รหัสกุญแจเป็นค่าที่แทนที่ปุ่มอินพุตที่แตกต่างกัน เช่น ปุ่มพิมพ์หรือปุ่มควบคุมรายการโค้ดเต็มมีอยู่ here
รับ 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 เมื่อปืนไม่มีกระสุนแล้วเปิดใช้งานใหม่เมื่อการรีโหลดแอนิเมชันเสร็จสิ้น