ไลบรารีตัวควบคุมตัวละคร

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

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

เปิดใช้งาน CCL

CCL เป็น การเข้าร่วม ผ่านหน้าต่าง การตั้งค่าอวาตาร์ ของ Studio เพื่อเปิดใช้งาน:

  1. เปิดใช้งาน CCL beta ผ่าน ไฟล์ ⟩ ฟีเจอร์เบต้า ⟩ ห้องสมุดตัวควบคุมตัวละคร AvatarAbilities.

  2. จากแท็บ อวาตาร์ ให้เปิด การตั้งค่าอวาตาร์.

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

    การเปิด/ปิดห้องสมุดตัวควบคุมตัวละครในหน้าต่างการตั้งค่าอวาตาร์
  4. ความสามารถมาตรฐานทั้งหมด เช่น การวิ่ง, การกระโดด, และ การปีน จะเปิดใช้งานโดยค่าเริ่มต้น หากต้องการปิดการใช้งานใด ๆ ในระหว่างการทำงาน ให้ยกเลิกการเลือกช่องที่เกี่ยวข้อง

ความสามารถ

ความสามารถจะประเมินว่าสิ่งที่ตัวละครสามารถทำได้ เช่น ความสามารถในการวิ่ง กระโดด ปีน และว่ายน้ำ แทนที่จะพึ่งพาชุดสถานะตัวละครที่กำหนดโดยเครื่องยนต์ที่ตายตัว เช่น ใน 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 ไปยังหน้ากากโลก
  • เงื่อนไข ของความสามารถ (StartsWhen, RunsWhile) ทดสอบ หน้ากากโลกและตอบสนอง
  • 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
Timed Labels
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 จะถูกเติมด้วยปุ่มบนหน้าจอ (ดูภาพด้านล่าง)

    ช่องคีย์บอร์ด & เมาส์เกมแพดสัมผัสการกำหนดค่าเริ่มต้น
    1SpaceButtonA①กระโดด
    2LeftShiftButtonL1②วิ่ง
    3LeftControlButtonB③นั่งยอง
    4RButtonX④
    5MouseLeftButtonButtonR2⑤
    6QButtonY⑥
    7XButtonR1⑦
    8CButtonL2
    9FDPadLeft
    10GDPadRight
    11VDPadDown
  • 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.AbilityOwner — ตัวละคร Model ซึ่ง managerCtx.AbilityOwner.PrimaryPart คือส่วนหลัก
  • 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 เป็นข้อผิดพลาด

©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ