ระบบ Input Action System ข้ามแพลตฟอร์มช่วยให้คุณเชื่อมต่อ การดำเนินการ และจัดเรียง การผูกโยง ข้ามอุปกรณ์ฮาร์ดแวร์ที่หลากหลายได้ในขณะที่ทำการแก้ไข โดยการรวมกับ บริบท คุณสามารถกำหนดค่าและแก้ไขระบบนำเข้าที่โมดูลาร์ซึ่งทำงานได้บนอุปกรณ์ใด ๆ ในทุกช่วงของการเล่น โดยมีกรณีการใช้งานดังนี้:
- ระบบการยิงบุคคลที่หนึ่งซึ่งการดำเนินการจะเปลี่ยนกันอย่างไดนามิกขึ้นอยู่กับว่าผู้เล่นอยู่ในโหมดต่อสู้หรือโหมดผู้ชม
- ระบบการขับขี่แบบรวบยอดพร้อมด้วย การเร่ง/ลดความเร็ว ตัวช่วยในการขับรถ และสถานีเติมน้ำมัน
- การใช้คีย์ลัดสำหรับระบบความสามารถในเกมต่อสู้เพื่อสลับการเคลื่อนไหวได้อย่างราบรื่นโดยไม่ทำให้ผู้เล่นพลาดหมัด
บริบทนำเข้า
InputContext เป็นการรวบรวมของการดำเนินการซึ่งเก็บ การดำเนินการนำเข้า ที่เกี่ยวข้อง เช่น PlayContext สำหรับการควบคุมตัวละครในเกม และ NavContext สำหรับการควบคุมเพื่อการนำทางรอบเมนู UI คุณสามารถ เปิด/ปิดบริบท (และการดำเนินการที่เกี่ยวข้อง) ผ่านพารามิเตอร์ Enabled ของพวกเขา เช่น การเปิด NavContext เมื่อเมนูสารบัญเปิดอยู่ และเปลี่ยนเป็น PlayContext เมื่อผู้เล่นปิดเมนูและกลับสู่การเล่นหลัก
แม้ว่าเกมจะไม่ใช้หลายบริบทของการนำเข้าในตอนแรก แต่แนะนำให้สร้างบริบทหลักที่ระดับสูงสุดของระบบนำเข้าทุกระบบ ตัวอย่างเช่น อินสแตนซ์ PlayContext สำหรับการนำเข้าที่เกิดขึ้นในระหว่างการเล่นเกม
แทรก InputContext ใหม่ลงในโฟลเดอร์และเปลี่ยนชื่อเป็น PlayContext

ในหน้าต่าง Properties ให้ตั้งค่าคุณลักษณะ Priority เป็น 2000 และเปิดใช้งาน Sink บริบทที่เปิดใช้งาน Sink จะบริโภคเหตุการณ์การป้อนข้อมูลสำหรับ KeyCodes ที่มีการผูกไว้ตามระดับลำดับความสำคัญของมัน ขัดขวางการป้อนข้อมูลเหล่านั้นไม่ให้ไปถึงบริบทที่มีลำดับความสำคัญต่ำกว่า นี่เป็นการใช้งานที่มีประโยชน์ในกรณีเช่นหน้าจอสถานะสินค้าที่ควรจะกดการป้อนข้อมูลการเล่นเกมเฉพาะขณะที่เปิดอยู่ ในตัวอย่างนี้ PlayContext เป็นการตั้งค่าที่สูงพอสำหรับ Priority เพื่อซึมซับการป้อนข้อมูลที่เชื่อมโยงไว้ก่อนที่บริบท PlayerScripts จะประมวลผล
การดำเนินการนำเข้า
InputAction กำหนดกลไกการดำเนินการในการเล่นเกม เช่น "กระโดด," "วิ่ง," หรือ "ยิง" การดำเนินการเหล่านี้จะถูกแมปไปยังการป้อนข้อมูลฮาร์ดแวร์โดยใช้ การผูกโยงการป้อนข้อมูล
InputAction สามารถมีหลายรูปแบบขึ้นอยู่กับคุณลักษณะ Type (Enum.InputActionType) โดยค่าเริ่มต้นคือ Bool ที่ออกแบบมาเพื่อรับค่า true/false จากการกด/ปล่อยของการป้อนข้อมูล เช่น ButtonA, E, หรือ MouseLeftButton
| ประเภท การดำเนินการ นำเข้า | ตัวอย่างการใช้งาน |
|---|---|
| Bool | การดำเนินการที่ถูกกระตุ้น เช่น การกระโดด การยิง การวิ่ง ฯลฯ โดยสนับสนุนเกณฑ์การกด/ปล่อยในการป้อนข้อมูลอนาล็อก |
| Direction1D | การดำเนินการแบบเปลี่ยนแปลงได้จากศูนย์ถึงเต็ม เช่น ปีกกระตุ้นในรถยนต์หรือระดับการซูมของสโคปมุมมอง |
| Direction2D | การเคลื่อนไหวตามทิศทาง 2D เช่น การหมุนกล้อง หรือการเคลื่อนไหวของตัวละคร Roblox แบบมาตรฐาน |
| Direction3D | การเคลื่อนไหวตามทิศทาง 3D เช่น ยานพาหนะที่อยู่ในอากาศซึ่งสามารถลอยขึ้น/ลง เร่ง/ลดความเร็ว และดริฟท์ไปทางซ้าย/ขวา |
| ViewportPosition | พิกัดแผนที่ 2D เช่น การป้อนข้อมูลเมาส์ เช่น สำหรับตัวชี้แบบกำหนดเองหรือการเรย์แคสเพื่อลงเลือกวัตถุในโลก |
เพื่อทดสอบ InputAction สำหรับการวิ่งของตัวละครง่ายๆ:
สร้าง InputAction ใหม่ภายใต้บริบท PlayContext ภายใน ReplicatedStorage เปลี่ยนชื่อเป็น CharacterSprint เพื่อบ่งบอกถึงการดำเนินการที่เฉพาะเจาะจงของมัน

ในหน้าต่าง Properties สังเกตว่าคุณลักษณะ Type ของการดำเนินการคือ Bool (ค่าปริยาย) นี่เป็นประเภทที่เหมาะสมสำหรับการวิ่งตัวละครง่าย ๆ เป็นกระบวนการแบบ boolean true/false (ตัวละครกำลังวิ่งอยู่หรือไม่)

การผูกโยงนำเข้า
InputBinding กำหนดว่าในการผูกฮาร์ดแวร์ใดที่ควรกระตุ้น InputAction ของพ่อแม่ เช่น การกดปุ่ม กดปุ่มจอยสติ๊ก หรือการแตะบนอุปกรณ์ที่รองรับการสัมผัส สำหรับความเข้ากันได้แบบ ข้ามแพลตฟอร์ม InputAction แต่ละตัวควรมี InputBinding สำหรับ จอยสติ๊ก, คีย์บอร์ด/เมาส์, และ สัมผัส ดังที่แสดงในที่นี้

ประเภท Type ที่กำหนดให้กับ InputAction พ่อแม่โดยตรงส่งผลต่อประเภทการป้อนข้อมูลทั่วไป (คีย์/ปุ่ม/แตะ ตัวกระตุ้นอนาล็อก แท่งเลื่อน ฯลฯ) ที่เหมาะสมสำหรับอินสแตนซ์ InputBinding เด็ก และในทางกลับกัน ค่าที่ส่งไปยังเหตุการณ์ที่เชื่อมต่อนั้นขึ้นอยู่กับประเภทการป้อนข้อมูลที่เลือกของการผูกโยง ดู เหตุการณ์การป้อนข้อมูล เพื่อดูรายละเอียดเกี่ยวกับความสัมพันธ์ระหว่างประเภทการดำเนินการ การผูก และค่าเริ่มต้นที่ส่งคืน
เพื่อเชื่อมโยงการผูกสำหรับการวิ่งของตัวละครง่ายๆ:
แทรก InputBinding ใหม่ลงในการดำเนินการ CharacterSprint และเปลี่ยนชื่อเป็น KeyboardBinding จากนั้นตั้งค่าคุณลักษณะ KeyCode ของการผูกให้เป็น LeftShift


เพื่อให้แน่ใจว่าการล็อค Shift ของเมาส์จะไม่รบกวนกับการผูกของปุ่ม ให้เลือก StarterPlayer ใน Explorer และปิดการเปิดใช้งาน EnableMouseLockOption ในหน้าต่าง Properties


แทรก InputBinding ที่สองลงในการดำเนินการ CharacterSprint และเปลี่ยนชื่อเป็น GamepadBinding จากนั้นตั้งค่าคุณลักษณะ KeyCode ของการผูกให้เป็น ButtonY


ใน ScreenGui container ภายใน StarterGui สร้าง ปุ่มบนหน้าจอ, เปลี่ยนชื่อเป็น SprintButton และทำการ ปรับตำแหน่ง/ขนาด ตามต้องการ


แทรก InputBinding ที่สามลงในการดำเนินการ CharacterSprint และเปลี่ยนชื่อเป็น TouchBinding จากนั้น ในหน้าต่าง Properties เชื่อมโยงคุณลักษณะ UIButton ของการผูกเข้ากับปุ่ม SprintButton ซึ่งคุณสร้างไว้ก่อนหน้านี้ใน StarterGui


เหตุการณ์การนำเข้า
อินสแตนซ์ InputAction มี เหตุการณ์ ในตัวสามเหตุการณ์ เพื่อจัดการป้อนข้อมูลผู้เล่นที่มาจาก InputBindings
- StateChanged — เหตุการณ์นี้จะถูกกระตุ้นสำหรับทุกประเภทของการดำเนินการนำเข้าเมื่อใดก็ตามที่สถานะมีการเปลี่ยนแปลง ยกเว้นเมื่อสถานะพยายามที่จะเปลี่ยนไปยังสถานะเดียวกัน
ขึ้นอยู่กับประเภทของการดำเนินการนำเข้าของ Type (Bool, Direction1D, Direction2D, Direction3D, หรือ ViewportPosition) และประเภทการป้อนข้อมูลทั่วไปที่มาจาก InputBinding เด็ก (คีย์/ปุ่ม/แตะ ตัวกระตุ้นอนาล็อก แท่งเลื่อน ฯลฯ), ค่าต่าง ๆ จะถูกส่งกลับไปยังเหตุการณ์ Pressed, Released, และ StateChanged บทบาทของเหตุการณ์ ตรวจสอบตารางต่อไปนี้เพื่อเข้าใจความสัมพันธ์
ประเภท Bool เหมาะสำหรับการกระทำที่ถูกกระตุ้นเช่นการกระโดด การยิง การวิ่ง ฯลฯ โดยสนับสนุนเกณฑ์การกด/ปล่อยในป้อนข้อมูลอนาล็อก
| ประเภทการป้อนข้อมูลที่ถูกต้องสำหรับ InputBindings | ค่าที่ส่งคืนไปยังเหตุการณ์ InputAction |
|---|---|
| การป้อนข้อมูล boolean จากกุญแจคีย์บอร์ดหรือปุ่มเมาส์พื้นฐาน/จอยสติ๊ก ซึ่งผ่านทางคุณลักษณะ KeyCode ของการผูก หรือการกด/ปล่อยของ GuiButton ผ่านทางคุณลักษณะ UIButton ของการผูก |
|
| การป้อนข้อมูลปริมาณแปรที่มาจากการป้อนข้อมูลอนาล็อก เช่น ตัวกระตุ้นของจอยสติ๊ก (ButtonL2/ButtonR2) ผ่านทางคุณลักษณะ KeyCode ของการผูก |
|
เพื่อเชื่อมโยงเหตุการณ์สำหรับการวิ่งของตัวละครง่ายๆ:
แทรก Script ใหม่ลงในต้นไม้ CharacterSprint ควบคู่กับการผูกต่างๆ จากนั้นตั้งค่า RunContext เป็น Client และเปลี่ยนชื่อเป็น OnActivate

วางโค้ดต่อไปนี้ในสคริป OnActivate โปรดทราบการเชื่อมต่อเหตุการณ์ Pressed ที่บรรทัด 13‑15 ซึ่งจะทำให้ความเร็วการเดินของตัวละครเพิ่มเป็นสองเท่าหากมีการกดการผูกการนำเข้าสำหรับการวิ่ง และการเชื่อมต่อเหตุการณ์ Released ที่บรรทัด 16‑18 ซึ่งจะตั้งค่าความเร็วในการเดินกลับเป็นค่าเริ่มต้นเมื่อมีการปล่อยการผูกการนำเข้าสำหรับการวิ่ง
OnActivate (Client Script)local Players = game:GetService("Players")local player = Players.LocalPlayerlocal character = player.Characterif not character or character.Parent == nil thencharacter = player.CharacterAdded:Wait()endlocal humanoid = character:WaitForChild("Humanoid")local defaultWalkSpeed = humanoid.WalkSpeedlocal inputAction = script.ParentinputAction.Pressed:Connect(function()humanoid.WalkSpeed = defaultWalkSpeed * 2end)inputAction.Released:Connect(function()humanoid.WalkSpeed = defaultWalkSpeedend)ทดสอบเกมของคุณและทดสอบการดำเนินการวิ่งของตัวละครกับ การผูก ที่คุณเลือกก่อนหน้านี้: LeftShift สำหรับคีย์บอร์ด, ButtonY สำหรับจอยสติ๊ก, และปุ่มบนหน้าจอ SprintButton สำหรับอุปกรณ์ที่รองรับการสัมผัส โปรดทราบว่าคุณสามารถใช้ Controller Emulator เพื่อทดสอบการป้อนข้อมูลจอยสติ๊กตรงใน Roblox Studio
การเปลี่ยนบริบท
เมื่อคุณมี บริบทการนำเข้า เช่น PlayContext คุณสามารถเปิด/ปิดบริบทในระหว่างการเล่นเกมผ่านทางการเขียนโค้ด เปลี่ยน Priority ของมันเพื่อกำหนดว่าการดำเนินการใดควรมีลำดับความสำคัญเหนือกว่า และ Sink เพื่อป้องกันการประมวลผลข้อมูลภายในบริบทที่มีลำดับความสำคัญต่ำกว่า
เพื่อให้การเปลี่ยนบริบทจากสคริปอื่น ๆ ง่ายขึ้น แทรก BindableEvent ใหม่ลงในโฟลเดอร์นำเข้าของคุณภายใน ReplicatedStorage และเปลี่ยนชื่อเป็น ContextEvent

สร้าง Script ใหม่ในระดับเดียวกัน ตั้งค่า RunContext เป็น Client และเปลี่ยนชื่อเป็น UpdateContext

ภายในสคริป UpdateContext ให้วางโค้ดต่อไปนี้
UpdateContext (Client Script)local ReplicatedStorage = game:GetService("ReplicatedStorage")local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")local contextEvent = inputsFolder:WaitForChild("ContextEvent")-- เชื่อมต่อเหตุการณ์ที่สามารถผูกได้contextEvent.Event:Connect(function(targetContext, enabled)local context = inputsFolder:FindFirstChild(targetContext)if context thencontext.Enabled = enabledprint(context.Name .. ": " .. tostring(context.Enabled))elsewarn("ไม่พบ InputContext!")endend)เมื่อมีสคริป UpdateContext อยู่ในที่แล้ว คุณสามารถอัปเดต InputContext ที่ชื่อได้โดยการปล่อยเหตุการณ์ที่สามารถผูกได้ เช่นจาก LocalScript ที่ขับเคลื่อน GuiButton ภายใน ScreenGui container
Button Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")local contextEvent = inputsFolder:WaitForChild("ContextEvent")local button = script.Parentbutton.Activated:Connect(function()-- ปล่อยเหตุการณ์ที่สามารถผูกได้โดยมีเป้าหมายการนำเข้าสถานะและสถานะที่เปิดอยู่contextEvent:Fire("PlayContext", true)end)
การผูกค่าเริ่มต้น
Roblox มีการควบคุมการป้อนข้อมูลเริ่มต้นสำหรับการเคลื่อนไหว การควบคุมกล้อง และการโต้ตอบกับสภาพแวดล้อมพื้นฐาน — ผู้เล่น Roblox คุ้นเคยกับการควบคุมเหล่านี้ ดังนั้นคุณควรเปลี่ยนแปลงเฉพาะในกรณีเฉพาะ นอกจากนี้ โปรดทราบว่าการป้อนข้อมูล ที่จองไว้ ไม่สามารถเปลี่ยนแปลงได้และจะทำงานตามวัตถุประสงค์ที่ตั้งใจไว้เสมอ
| การกระทำ | เมาส์/คีย์บอร์ด | เกมแพด | สัมผัส |
|---|---|---|---|
| เปิดเมนู Roblox | Esc | ปุ่มเริ่ม (ButtonStart) | ไม่สามารถใช้ได้ |
| คอนโซลนักพัฒนา | F9 | ไม่สามารถใช้ได้ | ไม่สามารถใช้ได้ |
| โหมดเต็มหน้าจอ (Windows) แสดงเดสก์ท็อป (Mac) | F11 | ไม่สามารถใช้ได้ | ไม่สามารถใช้ได้ |
| บันทึกวิดีโอ (Windows) | F12 | ไม่สามารถใช้ได้ | ไม่สามารถใช้ได้ |
| ถ่ายภาพหน้าจอ | PrintScreen | ไม่สามารถใช้ได้ | ไม่สามารถใช้ได้ |
