ไลบรารี ตัวควบคุมตัวละคร (CCL) เป็นโครงสร้างโมดูลาร์สำหรับสร้างการเคลื่อนไหวและพฤติกรรมของตัวละครผ่านแอตทริบิวต์และสคริปต์ Luau สถาปัตยกรรมนี้แทนที่เครื่องจักรสถานะ Humanoid ที่แข็งแกร่งด้วยระบบที่ยืดหยุ่นและขยายได้สำหรับกลไกของตัวละคร
เปิดใช้งาน CCL
CCL เป็น การเข้าร่วม ผ่านหน้าต่าง การตั้งค่าอวาตาร์ ของ Studio เพื่อเปิดใช้งาน:
เปิดใช้งาน CCL beta ผ่าน ไฟล์ ⟩ ฟีเจอร์เบต้า ⟩ ห้องสมุดตัวควบคุมตัวละคร AvatarAbilities.
จากแท็บ อวาตาร์ ให้เปิด การตั้งค่าอวาตาร์.

เลือกแท็บ การเคลื่อนไหว ที่ด้านซ้ายของหน้าต่าง และในส่วน ความสามารถ ให้เลือก ห้องสมุดตัวควบคุมตัวละคร.

ความสามารถมาตรฐานทั้งหมด เช่น การวิ่ง, การกระโดด, และ การปีน จะเปิดใช้งานโดยค่าเริ่มต้น หากต้องการปิดการใช้งานใด ๆ ในระหว่างการทำงาน ให้ยกเลิกการเลือกช่องที่เกี่ยวข้อง
ความสามารถ
ความสามารถจะประเมินว่าสิ่งที่ตัวละครสามารถทำได้ เช่น ความสามารถในการวิ่ง กระโดด ปีน และว่ายน้ำ แทนที่จะพึ่งพาชุดสถานะตัวละครที่กำหนดโดยเครื่องยนต์ที่ตายตัว เช่น ใน Enum.HumanoidStateType ความสามารถของ CCL จะกำหนดสิ่งที่ตัวละครสามารถทำได้และควรตอบสนองต่อการป้อนข้อมูลของผู้เล่นอย่างไรแบบไดนามิก
ในเชิงโครงสร้าง ความสามารถคือ ตาราง Luau ที่มีอยู่ในตัวเองซึ่งระบุสิ่งต่อไปนี้เป็นหลัก:
| ฟิลด์ในตาราง | วัตถุประสงค์ |
|---|---|
| Name | ชื่อที่จัดสรรให้กับบิต label เพื่อให้ conditions และ conflicts สามารถอ้างอิงถึงความสามารถได้ การกำหนดความสามารถหลายรายการสามารถใช้ชื่อเดียวกันได้ ชื่อ ModuleScript จะกำหนดคีย์การกำหนดค่าที่ไม่ซ้ำกัน |
| Labels, TimedLabels | บิตที่มีชื่อในหน้ากาก 64 บิตที่ใช้ร่วมกันซึ่งทำหน้าที่เป็นบัสการประสานระหว่างความสามารถ; ดู labels |
| StartsWhen, RunsWhile | เงื่อนไขที่กำหนดว่าเมื่อใดควรเริ่มความสามารถและเมื่อใดควรรักษาให้ทำงานอยู่; ดู conditions |
| Blocks, Stops, Suspends, ExclusiveGroup | วิธีจัดการกับ conflicts ระหว่างความสามารถที่ไม่สามารถทำงานพร้อมกันได้ |
| Input | การป้อนข้อมูลที่กระตุ้นความสามารถ CCL จะฉีดเข้าไปใน StartsWhen และเมื่อคุณละเว้น RunsWhile จะใช้เป็นเงื่อนไขการดำเนินการต่อเริ่มต้น; ดู inputs |
| Config, State | ค่าการกำหนดค่าเริ่มต้นและสถานะที่ทำซ้ำสำหรับการลงทะเบียนความสามารถแต่ละรายการ ฟังก์ชันย้อนกลับอ่านการกำหนดค่าจาก abilityCtx.Config และอ่านหรือเขียนสถานะที่ทำซ้ำผ่าน abilityCtx.State |
| OnSetup, OnStart, OnStop, OnUpdate, OnTeardown | ฟังก์ชันย้อนกลับในวงจรชีวิตที่พฤติกรรมจริงของความสามารถถูกเขียนสคริปต์; ดู callbacks |
Labels
label คือบิตที่มีชื่อในหน้ากาก 64 บิตที่ใช้ร่วมกันซึ่งทำหน้าที่เป็นบัสการประสานระหว่างความสามารถ โดยพื้นฐานแล้ว:
- ความสามารถที่ทำงานอยู่ ส่งสัญญาณ Labels และ TimedLabels ไปยังหน้ากากโลก
- conflicts ของความสามารถกำหนดว่าความสามารถ อื่นๆ ใดถูกบล็อก หยุด หรือระงับเมื่อเปิดใช้งาน
ในการตั้งค่าต่อไปนี้ เลเบล "CanFallDown" จะถูกส่งสัญญาณไปยังหน้ากากโลกเมื่อ Running ทำงานอยู่ ความสามารถ FallingDown ที่มี เงื่อนไข ของ StartsWhen = All( "CanFallDown", "Stunned" ) จะกลายเป็นผู้สมัครโดยอัตโนมัติ แต่ "Stunned" จะต้องถูกส่งสัญญาณไปยังหน้ากากโลกก่อนที่ FallingDown จะเกิดขึ้น
local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Ability = Identifiers.Ability
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Running: AvatarAbilities.AbilityDefinition = {
Name = Ability.Running,
Labels = { "CanFallDown" }, -- Labels ที่ส่งสัญญาณเมื่อความสามารถทำงานอยู่
StartsWhen = Sensor.Ground,
RunsWhile = Sensor.Ground,
}local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Ability = Identifiers.Ability
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local FallingDown: AvatarAbilities.AbilityDefinition = {
Name = Ability.FallingDown,
StartsWhen = All( "CanFallDown", "Stunned" ), -- Labels ที่จำเป็นสำหรับการเริ่มความสามารถ
Blocks = { Ability.Running }
}Labels ยังสามารถถูกส่งสัญญาณหรือใช้ในลักษณะ ตามเวลา โดยใช้พจนานุกรม TimedLabels
| คีย์ | คำอธิบาย |
|---|---|
| TimedLabels.OnStart | พจนานุกรมที่มีเลเบล (คีย์) และระยะเวลาที่เกี่ยวข้อง เลเบลจะถูกส่งสัญญาณเมื่อความสามารถเริ่มต้นและจะหมดอายุโดยอัตโนมัติเมื่อระยะเวลาของมันสิ้นสุดลง ตัวอย่างเช่น OnStart = { Dashing = 1 } จะส่งสัญญาณเลเบล Dashing เป็นเวลา 1 วินาทีเมื่อความสามารถเริ่มต้น |
| TimedLabels.OnStop | พจนานุกรมที่มีเลเบล (คีย์) และระยะเวลาที่เกี่ยวข้อง เลเบลจะถูกส่งสัญญาณเมื่อความสามารถหยุดและจะหมดอายุโดยอัตโนมัติเมื่อระยะเวลาของมันสิ้นสุดลง ตัวอย่างเช่น OnStop = { DashCooldown = 2 } จะส่งสัญญาณเลเบล DashCooldown เป็นเวลา 2 วินาทีเมื่อความสามารถหยุด |
| TimedLabels.Consumes | รายการของเลเบลที่จะลบ (ใช้) เมื่อความสามารถเปิดใช้งาน ตัวอย่างเช่น หากเกมต่อสู้อนุญาตให้ผู้เล่นตอบโต้หลังจากบล็อกการโจมตีของคู่ต่อสู้ ความสามารถ CounterAttack อาจมีทั้ง StartsWhen = "AfterBlock" และ TimedLabels = { Consumes = { "AfterBlock" } } เพื่อป้องกันการกระตุ้นซ้ำของความสามารถ CounterAttack |
local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Dash: AvatarAbilities.AbilityDefinition = {
Name = "Dash",
StartsWhen = All( Sensor.Ground, Not("DashCooldown") ),
RunsWhile = "Dashing",
TimedLabels = {
OnStart = { Dashing = 1 },
OnStop = { DashCooldown = 2 },
},
}เงื่อนไข
เงื่อนไข คือเลเบลหนึ่งหรือมากกว่าที่ใช้ labels, sensors หรือการอ้างอิงการป้อนข้อมูล ซึ่งใช้โดย StartsWhen และ RunsWhile เงื่อนไขจะถูกคอมไพล์เป็นการดำเนินการบิตมาสก์ในระหว่างการทำงานและการประเมินผลเป็นคณิตศาสตร์จำนวนเต็ม — ไม่มีการเดินตารางและไม่มีการเปรียบเทียบสตริง
| เป้าหมาย | ไวยากรณ์ | ตัวอย่าง |
|---|---|---|
| เงื่อนไขที่จำเป็นหนึ่งข้อ | StartsWhen = Sensor.Ground | |
| ตรรกะ AND สำหรับเมื่อเลเบล ทั้งหมด มีอยู่ในหน้ากากโลกและเซนเซอร์ ทั้งหมด ทำงานอยู่ | All() | StartsWhen = All( "CanFallDown", "Stunned" ) |
| ตรรกะ OR สำหรับเมื่อเลเบล ใดๆ มีอยู่ในหน้ากากโลกหรือเซนเซอร์ ใดๆ ทำงานอยู่ | Any() | StartsWhen = Any( "WallClimbing", "Climbing" ) |
| การปฏิเสธเพื่อให้เลเบลไม่สามารถ มีอยู่ ในหน้ากากโลกและเซนเซอร์ไม่สามารถ ทำงาน ได้ | Not() | RunsWhile = Not("Stunned") |
การประเมินเงื่อนไขสามารถรวมกันเพื่อสร้างตรรกะที่ซับซ้อนมากขึ้น เช่น การเชื่อมโยง All() พร้อมกับ Not() เพื่อระบุว่าเซนเซอร์ต้องทำงานอยู่ในขณะที่เลเบลต้องไม่มีอยู่:
local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Dive: AvatarAbilities.AbilityDefinition = {
Name = "Dive",
StartsWhen = All( Sensor.WaterSurface, Not("Recovering") ),
}ความขัดแย้ง
ความสามารถบางอย่างไม่สามารถทำงานได้เมื่อความสามารถอื่นทำงานอยู่ ตัวอย่างเช่น ตัวละครไม่สามารถกระโดดได้ในขณะที่ว่ายน้ำ และไม่สามารถวิ่งได้ในขณะที่ตก ความขัดแย้งเหล่านี้จะถูกแก้ไขโดยเครื่องยนต์ในลักษณะที่ประกาศภายในการกำหนดความสามารถ:
| คีย์ความขัดแย้ง | วัตถุประสงค์ |
|---|---|
| Blocks | ในขณะที่ความสามารถที่เป็นเจ้าของทำงานอยู่ ความสามารถอื่นที่ระบุไม่สามารถเริ่มต้นได้ ตัวอย่างเช่น ความสามารถ ScopeAim อาจมี Blocks = { Ability.Running, Ability.Jumping } เพื่อป้องกันไม่ให้ตัวละครวิ่งหรือกระโดดในขณะที่เล็งผ่านสโคปของอาวุธ |
| Stops | เมื่อความสามารถที่เป็นเจ้าของเริ่มต้น ความสามารถอื่นที่ระบุจะ หยุดทันที และต้องเริ่มใหม่ ตัวอย่างเช่น ความสามารถ Hover อาจมี Stops = { Ability.Running } เพื่อหยุดการเคลื่อนไหวของการวิ่งของตัวละครทันทีเมื่อพวกเขาเริ่มลอย |
| Suspends | เมื่อความสามารถที่เป็นเจ้าของเริ่มต้น ความสามารถอื่นที่ระบุจะ หยุดชั่วคราว และจะ กลับมาทำงานอัตโนมัติ เมื่อความสามารถที่เป็นเจ้าของหยุด ตัวอย่างเช่น ความสามารถการวิ่งที่กำหนดเองอาจมี Suspends = { Ability.Running } เพื่อให้การวิ่ง 🄐 หยุดชั่วคราวเมื่อเริ่มวิ่ง 🄑 ถูกบล็อกระหว่างการวิ่ง และ 🄒 กลับมาทำงานเมื่อหยุดวิ่ง |
คีย์ความขัดแย้งที่ไม่เหมือนใครอีกอย่างคือ ExclusiveGroup ซึ่งจัดกลุ่มความสามารถหลายรายการเข้าด้วยกัน โดยแต่ละรายการมีค่า Priority เพียงหนึ่งความสามารถต่อกลุ่มสามารถทำงานได้ และความสำคัญที่สูงกว่าจะชนะ อย่างไรก็ตาม หากผู้ท้าชิงประกาศ Stops ที่มุ่งเป้าไปที่ชื่อ/เลเบลของผู้ถือ มันจะชนะไม่ว่าจะมีความสำคัญมากแค่ไหน
ในการตั้งค่าต่อไปนี้ ความสามารถสามรายการ (Sprinting, Crouching, Stagger) ถูกเพิ่มเข้าไปในกลุ่มพิเศษ Locomotion โดย Sprinting มีความสำคัญสูงสุด (200) ดังนั้นจึงชนะ Crouching (100) และทั้งสองไม่เคยทำงานพร้อมกัน อย่างไรก็ตาม Stagger จะหยุดการวิ่งอย่างบังคับ (Stops = { Ability.Sprinting }) ดังนั้นจึงสามารถขัดจังหวะและเหนือกว่า Sprinting แม้ว่าความสำคัญของมันจะต่ำกว่า (150)
local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Ability = Identifiers.Ability
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Sprinting: AvatarAbilities.AbilityDefinition = {
Name = Ability.Sprinting,
ExclusiveGroup = { Name = "Locomotion", Priority = 200 },
}
local Crouching: AvatarAbilities.AbilityDefinition = {
Name = Ability.Crouching,
ExclusiveGroup = { Name = "Locomotion", Priority = 100 },
}
-- ความสามารถที่มีความสำคัญต่ำกว่าสามารถแทนที่ความสามารถที่มีความสำคัญสูงกว่าได้โดยการหยุดมัน
local Stagger: AvatarAbilities.AbilityDefinition = {
Name = "Stagger",
ExclusiveGroup = { Name = "Locomotion", Priority = 150 },
Stops = { Ability.Sprinting },
}การป้อนข้อมูล
การกำหนด Input ของความสามารถระบุการป้อนข้อมูลที่ใช้ในการพยายามเปิดใช้งานความสามารถ มันใช้คู่คีย์-ค่าเพื่อกำหนดพฤติกรรมการป้อนข้อมูล ช่องการกระทำ และไอคอนปุ่มสัมผัสที่เลือกได้
local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Dash: AvatarAbilities.AbilityDefinition = {
Name = "Dash",
Input = { InputName = "Dash", Mode = "Press", ActionSlot = 5 }
}InputName คือชื่อเชิงตรรกะ ไม่ใช่คีย์ CCL จะสร้างเซนเซอร์การป้อนข้อมูลและจะเพิ่มเข้าไปใน StartsWhen เสมอ อย่าเพิ่ม Rule.Input ลงใน StartsWhen เอง
Mode กำหนดว่าการป้อนข้อมูลนี้จะถูกตีความอย่างไร:
โหมด พฤติกรรม กรณีการใช้งาน Press การเปิดใช้งานความสามารถจะถูกพยายามเมื่อมีการกดป้อนข้อมูล จะถูกฉีดเข้าไปในเงื่อนไข StartsWhen โดยอัตโนมัติ การกระทำที่แยกออก เช่น การดิ่ง การโจมตี และการโยน Hold ความสามารถจะทำงานในขณะที่มีการกดป้อนข้อมูล การปล่อยจะหยุดมันเมื่อเซนเซอร์การป้อนข้อมูลที่สร้างขึ้นเป็นเงื่อนไข RunsWhile การกระทำที่ยั่งยืน เช่น การวิ่ง การเล็ง และการบล็อก Toggle การกดแต่ละครั้งจะเปลี่ยนความสามารถให้เปิดหรือปิดเมื่อเซนเซอร์การป้อนข้อมูลที่สร้างขึ้นเป็นเงื่อนไข RunsWhile ท่าทางหรือการเคลื่อนไหวที่เปิด/ปิด เช่น การนั่งยองหรือการลอย Repeat เหมือนกับ Hold แต่จะกระตุ้นใหม่ในแต่ละรอบ การกระทำที่หยุดตัวเองและสามารถยิงใหม่ได้ในขณะที่กด ActionSlot กำหนด ช่องการกระทำ ซึ่งเชื่อมโยงกับรายการของ InputActions และ InputBindings ภายใน Input Action System
หลายการผูกการป้อนข้อมูลช่องการกระทำถูกกำหนดไว้ล่วงหน้าโดย Roblox และในอนาคต Input Action Manager จะอนุญาตให้คุณปรับแต่งการผูกการป้อนข้อมูลเริ่มต้นสำหรับช่องการกระทำตามที่ต้องการ การตั้งค่า ActionSlot เป็น 0 จะเลือกช่องว่างถัดไปที่ว่างอยู่ ในอุปกรณ์เคลื่อนที่ ช่อง 1-7 จะถูกเติมด้วยปุ่มบนหน้าจอ (ดูภาพด้านล่าง)
ช่อง คีย์บอร์ด & เมาส์ เกมแพด สัมผัส การกำหนดค่าเริ่มต้น 1 Space ButtonA ① กระโดด 2 LeftShift ButtonL1 ② วิ่ง 3 LeftControl ButtonB ③ นั่งยอง 4 R ButtonX ④ 5 MouseLeftButton ButtonR2 ⑤ 6 Q ButtonY ⑥ 7 X ButtonR1 ⑦ 8 C ButtonL2 9 F DPadLeft 10 G DPadRight 11 V DPadDown 
CustomIcon, CustomIconActive, และ CustomIconInvalid ระบุ ID ของสินทรัพย์ Roblox สำหรับปุ่มสัมผัสเมื่อความสามารถอยู่ในสถานะว่าง สถานะทำงาน หรือไม่สามารถใช้งานได้
เมื่อคุณละเว้น RunsWhile CCL จะใช้เซนเซอร์การป้อนข้อมูลที่สร้างขึ้นเป็นเงื่อนไขการดำเนินการต่อ เมื่อคุณกำหนด RunsWhile มันจะแทนที่ค่าเริ่มต้นนั้น สำหรับความสามารถ Hold หรือ Toggle ที่ต้องหยุดเมื่อการป้อนข้อมูลของมันไม่ทำงาน ให้รวมสัญลักษณ์ Rule.Input ไว้ในเงื่อนไขที่กำหนดเองโดยตรง Rule.Input เป็นค่า ไม่ใช่ฟังก์ชัน:
local AvatarAbilities = require("@rbx/AvatarAbilities")
local Rule = AvatarAbilities.Rule
local Sensor = AvatarAbilities.Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Input = Rule.Input
local Glide: AvatarAbilities.AbilityDefinition = {
Name = "Glide",
Input = { InputName = "Glide", Mode = "Hold", ActionSlot = 6 },
StartsWhen = Not(Sensor.Ground),
RunsWhile = All(Not(Sensor.Ground), Input),
}เซนเซอร์
เซนเซอร์ คือค่าที่มีชื่อเกี่ยวกับโลกที่เครื่องยนต์อ่านให้คุณ โดยทั่วไปแล้วคุณจะอ่านเซนเซอร์มากกว่าที่จะเขียน สำหรับความสะดวก มีเซนเซอร์หลายตัวที่ลงทะเบียนล่วงหน้า:
| เซนเซอร์ | คำอธิบาย |
|---|---|
| Sensor.Ground | ยืนอยู่บนพื้นผิว |
| Sensor.IsMoving | มีการใช้การป้อนข้อมูลการเคลื่อนไหว |
| Sensor.MoveInput | เวกเตอร์การเคลื่อนไหวเอง |
| Sensor.Ceiling | มีบางอย่างอยู่เหนือศีรษะ |
| Sensor.Climb | มีพื้นผิวที่สามารถปีนได้อยู่ในระยะ |
| Sensor.Water / Sensor.WaterSurface | อยู่ในน้ำ / ที่ผิวน้ำ |
| Sensor.Sit | นั่งอยู่ |
| Sensor.Tipped | ล้มลง |
| Sensor.Tool | ถือ Tool |
| Sensor.LookDirectionInput | ทิศทางการมองที่สั่งการ |
| Sensor.RotateToLookDirectionInput | ว่าตัวละครควรหมุนไปยังทิศทางการมองที่สั่งการหรือไม่ |
ฟังก์ชันย้อนกลับ
ฟังก์ชัน ฟังก์ชันย้อนกลับ ของความสามารถช่วยให้คุณเขียนพฤติกรรมเฉพาะ:
แม้ว่าคุณจะลงทะเบียนความสามารถที่กำหนดเองบนเซิร์ฟเวอร์ แต่ฟังก์ชันย้อนกลับของพวกมันจะทำงานในทั้งการจำลองของลูกค้าที่คาดการณ์และการจำลองของเซิร์ฟเวอร์ที่มีอำนาจ ควรรักษาพฤติกรรมของฟังก์ชันย้อนกลับให้เป็นเชิงเส้นเพื่อให้การจำลองทั้งสองสร้างผลลัพธ์เดียวกัน
| ฟังก์ชันย้อนกลับ | ทำงาน | กรณีการใช้งาน |
|---|---|---|
| OnSetup(managerCtx, abilityCtx) | ครั้งเดียวเมื่อความสามารถถูกลงทะเบียน | เก็บข้อมูลอ้างอิง เริ่มต้นสถานะ ฯลฯ |
| OnStart(managerCtx, abilityCtx, hadLabel) | ทุกครั้งที่เปิดใช้งานความสามารถ | ใช้ผลกระทบ เช่น แรงกระตุ้น ฟังก์ชัน hadLabel() รายงานว่าเลเบลที่ระบุมีอยู่เมื่อการเปิดใช้งานเริ่มต้นขึ้นก่อนการแก้ไขความขัดแย้ง |
| OnUpdate(managerCtx, abilityCtx) | ทุกเฟรมที่ทำงานอยู่ | การทำงานต่อเนื่อง เช่น ตัวจับเวลา หรือแรงต่อเฟรม |
| OnStop(managerCtx, abilityCtx) | ทุกการหยุดทำงาน ไม่ว่าจะเป็นโดยสมัครใจหรือบังคับ | ย้อนกลับสิ่งที่ OnStart() ทำ |
| OnTeardown(managerCtx, abilityCtx) | เมื่อมีการลบความสามารถ | ตัดการเชื่อมต่อการเชื่อมต่อ ทำลายอินสแตนซ์ ฯลฯ |
พารามิเตอร์แรกของฟังก์ชันย้อนกลับแต่ละตัว managerCtx เป็นวัตถุ ManagerContext ที่มีคุณสมบัติร่วมของตัวละครและผู้จัดการ รวมถึง:
- managerCtx.AbilityManager — มุมมองที่ตัดทอนของผู้จัดการเพื่อให้ความสามารถสามารถเพิ่ม ลบ และสอบถามความสามารถจากภายในฟังก์ชันย้อนกลับของตนเอง
- managerCtx.BodyParts — ส่วนต่างๆ ของตัวละคร โดยมีตัวช่วยในการเปิดและปิดการชนต่อแต่ละแขน
- managerCtx.ControllerManager — ControllerManager ของตัวละครสำหรับการควบคุมฟิสิกส์ อาจเป็น nil เมื่อไม่มีความสามารถที่ลงทะเบียนใดๆ ที่ต้องการฟิสิกส์
- managerCtx.RootCFrame — CFrame ของส่วนหลัก ซึ่งถูกบันทึกไว้ครั้งเดียวเมื่อเริ่มต้นเฟรมเพื่อให้ฟังก์ชันย้อนกลับไม่ต้องไปดึงมันเอง
- managerCtx.RootLookVector — ทิศทางที่ส่วนหลักของตัวละครหันไป
- managerCtx.RootUpVectorY — ส่วน Y ของเวกเตอร์ขึ้นของส่วนหลัก
- managerCtx.TaskSynchronize() — ซิงโครไนซ์ฟังก์ชันย้อนกลับก่อนการเข้าถึง DataModel เมื่อการสนับสนุนฟังก์ชันย้อนกลับแบบขนานเปิดใช้งาน ขณะนี้ OnUpdate จะไม่ทำงานในบริบทขนาน ดังนั้นฟังก์ชันนี้จึงไม่มีผล การสนับสนุน Luau แบบขนานเต็มรูปแบบมีแผนจะเปิดตัวในอัปเดตในอนาคต
พารามิเตอร์ที่สอง abilityCtx เป็นวัตถุ AbilityContext ที่มีตารางที่จัดการโดยเครื่องยนต์สำหรับการลงทะเบียนความสามารถในปัจจุบัน:
- abilityCtx.Config — ค่าการกำหนดค่าแบบอ่านอย่างเดียวสำหรับการลงทะเบียนความสามารถนี้
- abilityCtx.State — สถานะที่สามารถเปลี่ยนแปลงได้ซึ่งทำซ้ำผ่าน DataModel Server Authority จะคืนค่าต่างๆ เหล่านี้ในระหว่างการย้อนกลับและการจำลองใหม่
- abilityCtx.Local — สถานะที่สามารถเปลี่ยนแปลงได้ซึ่งไม่ทำซ้ำหรือมีส่วนร่วมในการย้อนกลับ
เก็บข้อมูลฟังก์ชันย้อนกลับที่กำหนดเองใน abilityCtx.State หรือ abilityCtx.Local การเขียนฟิลด์ที่กำหนดเองโดยตรงไปยัง abilityCtx เป็นข้อผิดพลาด