ตัวแก้ไขกราฟอนิเมชัน เป็นเครื่องมือแบบมองเห็นได้ที่ใช้โหนด ซึ่งช่วยให้นักศิลปะทางเทคนิคและนักสร้างอนิเมชันสามารถสร้างตรรกะอนิเมชันที่ซับซ้อนได้โดยตรงภายใน Roblox Studio โดยให้อินเทอร์เฟซที่เรียบง่ายสำหรับการสร้างพฤติกรรมเช่นต้นไม้ผสม ช่วยให้สามารถลดการพึ่งพาการเขียนสคริปต์แบบแมนนวลสำหรับการเคลื่อนไหวของตัวละครได้
ระบบนี้ทำงานร่วมกับกระแสงานอนิเมชันที่มีอยู่ของคุณ:
- ตัวแก้ไขอนิเมชัน: ใช้ ตัวแก้ไขอนิเมชัน เป็นเครื่องมือหลักในการเขียนคลิปส่วนบุคคลและปรับแต่งคีย์เฟรมและเส้นโค้ง
- ตัวแก้ไขกราฟอนิเมชัน: ใช้พื้นที่ทำงานใหม่เพื่อใช้คลิปเหล่านั้นและจัดระเบียบลงในต้นไม้ตรรกะเพื่อขับเคลื่อนพฤติกรรมการเล่นเกมที่ซับซ้อน
ออกแบบมาเพื่อเพิ่มความร่วมมือ กราฟที่มองเห็นได้ช่วยให้นักพัฒนาตรวจสอบแก้ไขข้อบกพร่องและทำความเข้าใจตรรกะที่สร้างโดยนักสร้างอนิเมชันได้อย่างรวดเร็ว ขณะที่ศิลปินมุ่งเน้นไปที่การปรับแต่งการเคลื่อนไหวเชิงโต้ตอบ นักพัฒนาสามารถเข้าถึงโหนดกราฟอนิเมชันได้โดยตรงเพื่อควบคุมอนิเมชันที่ผสมผสานและสถานะต่างๆ
สร้างกราฟ
ในการเริ่มสร้างตรรกะสำหรับตัวละครที่สามารถอนิเมทได้ เข้าถึงตัวแก้ไขกราฟอนิเมชันผ่านแท็บ Avatar ในแถบเครื่องมือของ Studio ขั้นตอนต่อไปนี้แสดงวิธีการเริ่มต้นการตั้งค่าโครงกระดูกและสร้างเครือข่ายโหนดพื้นฐานโดยใช้อนิเมชันการเดินและการโบกมือเริ่มต้น
สำหรับการลงลึกในตัวอย่างการใช้งานที่เป็นจริง คุณสามารถสำรวจ ไฟล์อ้างอิงกราฟอนิเมชัน ซึ่งประกอบด้วยตัวอย่างการใช้งานที่มีทั้งพื้นฐานและซับซ้อน
ในการสร้างกราฟอนิเมชันของคุณเอง คล้ายกับตัวอย่างพื้นฐานที่ให้ในเอกสารอ้างอิง ใช้ขั้นตอนต่อไปนี้:
ใน Studio ให้เพิ่มโครงกระดูกที่สามารถอนิเมทได้ โดยการนำทางไปที่แท็บ Avatar และเลือก Character ⟩ My Avatar.

เปิดตัวแก้ไขกราฟอนิเมชันโดยการนำทางไปที่ Graph Editor ในแท็บ Avatar.

เลือกโครงกระดูกที่สามารถอนิเมทได้ในมุมมอง 3D แล้วเลือก Create Graph.
ในตัวแก้ไขกราฟ คลิกขวาแล้วเลือก Clip.

ในโหนด Clip ใหม่ตั้งค่า Animation ID.
เลือกเมนูดรอปดาวน์ Animation ID.
เพื่อส่ง ID ของสินทรัพย์อนิเมชันเฉพาะ ให้คลิก Import.

ในฟิลด์ Animation ID ให้เพิ่มอนิเมชันการเดินเริ่มต้น: 507777826.
เลือก Import.
เพิ่มโหนดคลิปอีกตัวโดยทำซ้ำขั้นตอน 4-5 โดยใช้อนิเมชันการโบกมือเริ่มต้น: 507770239.

ในตัวแก้ไขกราฟ คลิกขวาและเลือก Add.

เชื่อมต่อโหนด Clip กับโหนด Add โดยการลากตัวเชื่อมต่อผลลัพธ์มุมขวาสูงไปยังพอร์ตที่เหมาะสม:
- เชื่อมต่อโหนด Clip ที่มีอนิเมชันการเดินเข้ากับพอร์ต Base.
- เชื่อมต่อโหนด Clip ที่มีอนิเมชันการโบกมือเข้ากับพอร์ต Additive.

จากโหนด Add เชื่อมต่อตัวเชื่อมต่อผลลัพธ์มุมขวาสูงไปยังพอร์ต Pose ของกราฟ output.

(ไม่บังคับ) กำหนดพารามิเตอร์ให้กับตัวแปร Speed ของคุณ
คลิกและลากพอร์ต Speed สีเขียวไปยังพื้นที่ว่าง พารามิเตอร์โหนดใหม่จะแสดงขึ้น

ในมุมซ้ายบนของตัวแก้ไขกราฟ ใช้พาเนลพารามิเตอร์เพื่อปรับเปลี่ยนพารามิเตอร์ในโหนดของคุณได้อย่างรวดเร็ว คุณยังสามารถเข้าถึงได้ โปรแกรมmatically.

ทดสอบอนิเมชันโดยกด ปุ่มเล่น.

ลองทดสอบน้ำหนัก ความเร็ว โหมดเล่นและอนิเมชันอื่นๆ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโหนดแต่ละตัว ดูที่ เอกสารอ้างอิงโหนด.
การบูรณาการ API
การสร้างและใช้งานกราฟอนิเมชันตามมาตรฐานของท่ออนิเมชันของ Roblox หลังจากเลือกโครงกระดูกในตัวแก้ไขกราฟอนิเมชัน จะมีการสร้างสินทรัพย์ใหม่ชื่อ AnimationGraphDefinition สินทรัพย์นี้ทำหน้าที่เป็นที่เก็บสำหรับโหนด การเชื่อมต่อ และพารามิเตอร์ของคุณ เมื่อตรรกะของคุณเสร็จสิ้น คุณจะเผยแพร่กราฟเพื่อรับ Asset ID มาตรฐาน
ในสคริปต์ของคุณ คุณสามารถโต้ตอบกับกราฟเหล่านี้ได้โดยการโหลดไปยัง Animator เหมือนการใช้งานอนิเมชันทั่วไป เพื่อตอบสนองต่อตรรกะภายในของกราฟ ใช้ AnimationTrack:SetParameter() เพื่อส่งค่าแบบเรียลไทม์ เช่น ความเร็วในการเคลื่อนไหวหรือตัวแปรสถานะต่างๆ ไปยังตัวแปรของกราฟโดยตรง
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- ID ของกราฟที่คุณเผยแพร่
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- การอัปเดตพารามิเตอร์แบบไดนามิกผ่าน RunService
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)
เอกสารอ้างอิงโหนด
ทุกโหนดกราฟอนิเมชันทำหน้าที่เป็นเกตล็อกิกหรือแหล่งข้อมูลข้อมูลที่ประมวลผลข้อมูลอนิเมชันก่อนที่มันจะไปถึงโครงกระดูกของตัวละคร ส่วนนี้ให้การวิเคราะห์เชิงเทคนิคของบล็อกที่ใช้งานได้ภายในตัวแก้ไขกราฟอนิเมชัน โหนดทั้งหมดในปัจจุบันให้ผลลัพธ์เป็นท่าทางอนิเมชัน
แต่ละส่วนของโหนดจะรวมถึง:
- คำนิยาม – สรุปจุดประสงค์และบทบาทของโหนดภายในกราฟ
- ข้อมูลนำเข้า – กระแสข้อมูลที่เข้ามายังโหนด หลายการนำเข้าจะแสดงเป็น Input1, Input2, ..., InputN
- คุณสมบัติของข้อมูลนำเข้า – การตั้งค่าที่เชื่อมโยงกับข้อมูลนำเข้าที่เฉพาะเจาะจง (ตัวอย่างเช่น ข้อมูล Idle ที่กำหนดให้กับตำแหน่งของ 0.5 บนโหนด Blend1D)
- ข้อมูลเหตุการณ์ – เหตุการณ์ที่เกิดขึ้นหรือถูกบริโภคโดยโหนดเพื่อตอบสนองต่อตรรกะกราฟภายในหรือสคริปต์ Luau ภายนอก สิ่งนี้อาจเปลี่ยนแปลงไปในระหว่างการพัฒนาเบต้า
กฎเหตุการณ์ทั่วโลก
สำหรับโหนดทั้งหมดและ การเปลี่ยนผ่าน กฎด้านล่างจะใช้ตามค่าเริ่มต้น:
- เหตุการณ์จะเกิดขึ้นจากโหนดต้นทางขึ้นไปยังกราฟ ทุกเหตุการณ์จะมีน้ำหนักเป็นตัวแทนของอิทธิพลของต้นทางในผสมสุดท้าย หากน้ำหนักถึงศูนย์ที่จุดใดจุดหนึ่ง เหตุการณ์จะถูกปิดเสียง
- โหนดที่ไม่มีตรรกะเหตุการณ์ที่กำหนดเองจะส่งผ่านเหตุการณ์ทั้งหมดโดยไม่มีการเปลี่ยนแปลง; โหนดที่ผสมผสานหรือเลือกจากการนำเข้าต่างๆ อาจลดขนาดน้ำหนักหรือลบเหตุการณ์จากการนำเข้าที่ไม่ใช่หลัก (ดูส่วนเหตุการณ์ต่อโหนด)
- เหตุการณ์ Marker ที่ถึงยอดกราฟสามารถสังเกตได้ผ่าน AnimationTrack:GetMarkerReachedSignal()
Clip

อ้างอิงถึงสินทรัพย์ AnimationClip ซึ่งทำหน้าที่เป็นโหนดใบในกราฟ สร้างข้อมูลอนิเมชันดิบที่ป้อนเข้าไปยังโหนดอื่นสำหรับการผสม การเลือก หรือการแก้ไข
- ข้อมูลนำเข้า
- ไม่มี
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย Clip Asset ID สินทรัพย์อนิเมชันที่เล่น (เช่น rbxassetid://12345). PlayMode Enum.AnimationNodePlayMode กำหนดพฤติกรรมของคลิปเมื่อมันถึงจุดสิ้นสุดของระยะเวลา
- Loop (ค่าเริ่มต้น): เริ่มต้นใหม่อัตโนมัติจากจุดเริ่มต้นเมื่อคลิปเสร็จสิ้น
- PingPong: เล่นจากเริ่มต้นไปยังสิ้นสุด จากนั้นเล่นย้อนกลับจากสิ้นสุดไปยังเริ่มต้นทันที
- OnceAndHold: เล่นครั้งเดียวและรักษาท่าทางสุดท้ายไว้เมื่อเสร็จสิ้น
- OnceAndReset: เล่นครั้งเดียวและกลับไปยังท่าทางเริ่มต้นเมื่อเสร็จสิ้น
Reverse Boolean ควบคุมทิศทางของการเล่น Speed หมายเลข ตัวคูณสำหรับอัตราการเล่น 0.0 จะหยุดกราฟ 1.0 คือความเร็วปกติ และ 2.0 คือความเร็วสองเท่า Trim Boolean เปิด/ปิดว่าความยาวของคลิปจะถูกตัดหรือไม่ TrimStart หมายเลข เวลาแน่นอน (ในวินาที) ที่การเล่นควรเริ่มต้น TrimEnd หมายเลข เวลาแน่นอน (ในวินาที) ที่การเล่นควรสิ้นสุด - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: ไม่มี นี่คือโหนดใบที่ไม่มีลูก
- การปล่อยเหตุการณ์: อ่านมาร์กเกอร์ที่กำหนดเองที่ฝังอยู่ในคลิปอนิเมชัน (เช่น "การเหยียบเท้า", "การแกว่งอาวุธ") และปล่อยออกมาเป็นเหตุการณ์ที่ตั้งชื่อในเฟรมที่เกิดขึ้นอย่างแม่นยำ หากคลิปถูกตัด จะมีการปล่อยเฉพาะมาร์กเกอร์ที่อยู่ภายในช่วงที่กำหนด [TrimStart, TrimEnd] (รวม) เท่านั้น
Select

เลือกระหว่างการนำเข้าที่มีอยู่หลายๆ รายการผ่านคุณสมบัติ Selection ทุกครั้งที่การเลือก текущего หมายถึงการเปลี่ยนผ่านใหม่ transition.
- ข้อมูลนำเข้า
- Input1...InputN
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย Selection String ID เฉพาะของข้อมูลนำเข้าที่จะเลือก ซึ่งตรงกับชื่อของการเชื่อมต่อข้อมูลนำเข้า (เช่น "Walk") - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: เหตุการณ์จากการนำเข้าที่เลือกจะส่งผ่านไปโดยที่น้ำหนักไม่ถูกเปลี่ยนแปลง
- การปล่อยเหตุการณ์: จะผ่านเหตุการณ์ทั้งหมดจากการนำเข้าที่เลือก โดยในระหว่างการเปลี่ยนผ่าน การปล่อยเหตุการณ์ทำตาม กฎเหตุการณ์ทั่วโลก.
PrioritySelect

ประเมินรายการของการเชื่อมต่อเข้าจากบนลงล่างและเล่นครั้งแรกที่เงื่อนไขของมันประเมินเป็นจริง เงื่อนไขนี้ช่วยให้การเลือกอนิเมชันแบบลำดับชั้นขึ้นอยู่กับตรรกะเฉพาะ ทุกครั้งที่การเลือกในขณะนี้เปลี่ยน จะมีการเรียกใช้ Transition ใหม่
- ข้อมูลนำเข้า
- Input1...InputN
- Trigger (Boolean): เงื่อนไขเชิงตรรกะที่ต้องเป็นจริงเพื่อให้ข้อมูลนี้เปิดใช้งาน ในรุ่นปัจจุบัน เงื่อนไขนี้เชื่อมโยงกับพารามิเตอร์ boolean.
- Interruptible (Enum.AnimationNodeInterruptible): กำหนดกฎที่ระบุเมื่ออนิเมชันนี้สามารถถูกขัดจังหวะโดยการนำเข้าสูงกว่าได้
- Always (ค่าเริ่มต้น): สามารถขัดจังหวะการส่งข้อมูลนี้ได้ทุกเมื่อโดยตามเงื่อนไขที่สูงกว่า
- Finished: อนิเมชันทั้งหมดต้องเสร็จก่อนที่จะให้ข้อมูลที่มีลำดับสูงกว่า
- Trigger: เงื่อนไขนี้จะถูกขัดจังหวะได้เฉพาะเมื่อ InterruptibleTrigger ตั้งค่าเป็น true
- InterruptibleTrigger (Boolean): ใช้ได้เฉพาะเมื่อ Interruptible ตั้งค่าเป็น Trigger เงื่อนไขนี้สามารถขัดจังหวะได้เมื่อตรงตามการแสดงออกเฉพาะนี้
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย DefaultInterruptible Enum.AnimationNodeInterruptible กฎพื้นฐานในการขัดจังหวะที่ใช้กับการนำเข้าส่วนใหญ่ การนำเข้าสามารถแทนที่กฎนี้ด้วยคุณสมบัติ Interruptible ของตนเอง DefaultInterruptibleTrigger Boolean ค่าพื้นฐานที่ใช้เมื่อโหมด Interruptible ที่แก้ไขจะอยู่ใน Trigger การนำเข้าสามารถแทนที่ค่าตั้งต้นนี้ด้วยคุณสมบัติ InterruptibleTrigger ของตนเอง - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: เหตุการณ์จากการนำเข้าที่เลือกจะส่งผ่านไปโดยที่น้ำหนักไม่ถูกเปลี่ยนแปลง
- การปล่อยเหตุการณ์: จะผ่านเหตุการณ์ทั้งหมดจากการนำเข้าที่เลือก โดยในระหว่างการเปลี่ยนผ่าน การปล่อยเหตุการณ์ทำตาม กฎเหตุการณ์ทั่วโลก.
Sequence

ใช้งานการนำเข้าเชื่อมต่อในลำดับที่กำหนดบนพื้นฐานเงื่อนไขในการรอเพื่อเลื่อนไปยังการนำเข้าถัดไปทุกครั้งที่การเลือกก่อให้เกิด transition.
- ข้อมูลนำเข้า
- Input1...InputN
- WaitFor (Enum.AnimationNodeWaitFor): ระบุเงื่อนไขที่ต้องพบก่อนที่ลำดับจะไปยังการนำเข้าถัดไป
- Finished (ค่าเริ่มต้น): เลื่อนจุดไปการนำเข้าถัดไปเมื่อข้อมูลที่กำลังทำงานในปัจจุบันเสร็จสิ้นรอบ เราเรียนรู้พฤติกรรมการก้าวไปข้างหน้า
- Play-once clip: เลื่อนที่หลังจากคลิปสิ้นสุด.
- Looping clip: เลื่อนหลังจากคลิปเต็มรอบ.
- Sequence with infinite loops: เลื่อนหลังจากผ่านการรอบเต็มการเลือกรูปแบบที่ถูกจัดลำดับ.
- Sequence with finite loops: เลื่อนหลังจากรอบทั้งหมดเสร็จสิ้น.
- Trigger: เปิดใช้งานการนำเข้าถัดไปเมื่อการแสดงออกตรรกะเฉพาะประเมินเป็นจริง
- WaitForTrigger (Boolean): ใช้ได้เฉพาะเมื่อ WaitFor ตั้งค่าเป็น Trigger.
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย LoopCount หมายเลข จำนวนครั้งที่ลูปไปยังลำดับทั้งหมด (ค่าเริ่มต้นคือ 1) ค่าของ 0 ระบุว่าลูปไม่มีที่สิ้นสุด เมื่อถึงจำนวนที่กำหนด โหนดจะเคารพในการเคลื่อนตัวหรือการตั้งค่าการถือรับของการนำเข้าที่สุดท้าย DefaultWaitFor Enum.AnimationNodeWaitFor เงื่อนไขการรอพื้นฐานที่ใช้กับการนำเข้าส่วนใหญ่ การนำเข้าสามารถแทนที่กฎนี้ด้วยคุณสมบัติ WaitFor ของตนเอง - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: เหตุการณ์จากการนำเข้าที่กำลังทำงานจะผ่านไปด้วยน้ำหนักที่ไม่เปลี่ยนแปลง
- การปล่อยเหตุการณ์: จะผ่านเหตุการณ์ทั้งหมดจากการนำเข้าที่กำลังทำงานในลำดับนี้เท่านั้น ในระหว่างการเปลี่ยนผ่าน การปล่อยเหตุการณ์ทำตาม กฎเหตุการณ์ทั่วโลก.
RandomSequence

เลือกและเล่นการนำเข้าที่เชื่อมต่อหนึ่งในแบบสุ่ม เมื่ออนิเมชันปัจจุบันเสร็จสิ้น โหนดจะสุ่มเลือกการนำเข้าอื่นเพื่อเล่น กำหนดน้ำหนักเฉพาะให้กับการนำเข้าแต่ละรายการเพื่อลดโอกาสของการถูกเลือกทุกครั้งที่การเลือกในขณะนี้เปลี่ยน จะมีการเรียกใช้ การเปลี่ยนผ่าน ใหม่
- ข้อมูลนำเข้า
- Input1...InputN
- Weight (หมายเลข): กำหนดความแค่หลักของการถูกเลือกของการนำเข้าที่ระบุ; น้ำหนักที่สูงขึ้นจะเพิ่มโอกาสในการถูกเลือก
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย PlayCount หมายเลข จำนวนรายการที่โหนดจะเล่นก่อนที่จะหยุด เมื่อถึงจำนวนที่กำหนด โหนดจะเคารพการเคลื่อนตัวหรือการตั้งค่าการถือรับของการนำเข้าที่สุดท้าย ค่าเริ่มต้นคือ 0 สำหรับลูปไม่มีที่สิ้นสุด Seed หมายเลข ค่าที่ใช้ในการเริ่มต้นมาตรฐานสำหรับการสุ่ม (RNG) เพื่อให้ลำดับมีความสอดคล้องกันในลูกค้าต่างๆ ค่าเริ่มต้นคือ -1 สำหรับการสุ่มเมล็ด - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: เหตุการณ์จากการนำเข้าที่กำลังทำงานจะผ่านไปด้วยน้ำหนักที่ไม่เปลี่ยนแปลง
- การปล่อยเหตุการณ์: จะผ่านเหตุการณ์ทั้งหมดจากการนำเข้าที่กำลังทำงานในลำดับนี้เท่านั้น ในระหว่างการเปลี่ยนผ่าน การปล่อยเหตุการณ์ทำตาม กฎเหตุการณ์ทั่วโลก.
Over

เลเยอร์ท่าทาง Over ทับท่าทางพื้นฐาน เมื่อต้องรวมกับโหนด Mask ข้อต่อที่ถูกมาสก์ในท่าทาง Over จะเปิดเผยท่าทาง Base อย่างสมบูรณ์ ทำให้เกิดเอฟเฟกต์ overlay ที่โปร่งใส
- ข้อมูลนำเข้า
- Base: ชั้นพื้นหลังหรือล่าง โดยปกติจะเป็นอนิเมชันเต็มตัวเช่นการเคลื่อนที่หรือสถานะนิ่ง
- Over: ชั้นนำหน้าหรือบนที่จะนำไปใช้เหนือพื้นฐานเช่น อนิเมชันการทำท่าทางด้วยมือหรือการใช้เครื่องมือ
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย Weight หมายเลข น้ำหนักการผสมที่ใช้เพื่อลดท่าทาง Over ค่าเริ่มต้นคือ 1.0 (การแทนที่เต็มรูปแบบ) และไม่มีการจำกัด - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์:
- โหนดจะฟังเหตุการณ์จากทั้งข้อมูลนำเข้า Base และ Over
- การปล่อยเหตุการณ์:
- เหตุการณ์พื้นฐาน: เหตุการณ์ทั้งหมดจากข้อมูลนำเข้า Base จะถูกส่งผ่านโดยไม่มีการเปลี่ยนแปลง
- เหตุการณ์ Over: เหตุการณ์จากข้อมูลนำเข้า Over จะถูกปรับขนาดตามคุณสมบัติ Weight
- เมื่อ Weight เท่ากับ 0.5 เหตุการณ์ Over จะถูกส่งผ่านที่ครึ่งน้ำหนัก
- เมื่อ Weight เท่ากับ 0 เหตุการณ์จะถูกปิดเสียง
Add

เพิ่มท่าทาง Additive เข้ากับท่าทาง Base ที่ลดทอนด้วย Weight เฉพาะ (ไม่มีการจำกัด)
- ข้อมูลนำเข้า
- Base: ท่าทางอนิเมชันหลัก
- Additive: ท่าทางที่จะถูกสำหรับในท่าทางพื้นฐาน
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย Weight หมายเลข กำหนดความแข็งแกร่งของท่าทางที่เพิ่มขึ้นที่นำไปใช้กับพื้นฐาน - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: โหนดจะฟังเหตุการณ์จากทั้งข้อมูลนำเข้า Base และ Additive
- การปล่อยเหตุการณ์: เหตุการณ์ทั้งหมดจากทั้งข้อมูลนำเข้า Base และ Additive จะถูกส่งผ่านโดยไม่มีการเปลี่ยนแปลง
Subtract

เปลี่ยนอนิเมชันให้เป็นท่าทางที่เพิ่มขึ้นโดยการลบท่าทางพื้นฐานที่สัมพันธ์จากท่าทางเป้าหมาย (). ผลลัพธ์จะลดขนาดด้วย Weight เฉพาะ (ไม่มีการจำกัด)
- ข้อมูลนำเข้า
- A: ท่าทางอนิเมชันเป้าหมาย
- B: ท่าทางพื้นฐานที่สัมพันธ์ที่จะถูกหักออก
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย Weight หมายเลข กำหนดความแข็งแกร่งของผลกระทบการหักออกที่นำไปใช้กับผลลัพธ์ - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: โหนดจะฟังเหตุการณ์จากทั้ง Input A และ Input B
- การปล่อยเหตุการณ์: เหตุการณ์ทั้งหมดจากทั้ง Input A และ Input B จะถูกส่งผ่านโดยไม่มีการเปลี่ยนแปลง
Blend1D

การเข้าสัมพันธ์ระหว่างท่าทางอนิเมชันสองท่าที่ใกล้เคียงที่สุดตามการนำเข้าตำแหน่งปัจจุบันบนแกนเดียว
- ข้อมูลนำเข้า
- Input1...InputN
- Position (หมายเลข): พิกัดเฉพาะสำหรับการนำเข้ามากมายบนแกนผสม
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย Position หมายเลข ค่าปัจจุบันที่ใช้งานบนแกนผสมที่ใช้เพื่อรวบรวมอนิเมชัน หาก Position อยู่ภายนอกช่วงของตำแหน่งดังกล่าว โหนดจะเก็บไว้โดยการประมาณใช้สองค่าใกล้เคียงที่สุด PhaseSync Enum.AnimationNodePhaseSync กำหนดให้เวลาในการทำงานของโหนดลูกถูกซิงค์หรือไม่
- Synced (ค่าเริ่มต้น): การซิงโครไนซ์ที่เป็นมาตรฐาน โหนดจะคำนวณ "ระยะเวลาที่เสมือนจริง" ตามค่าเฉลี่ยที่มีน้ำหนักของการใช้งานอยู่ ขนาดที่ทำงานของโหนดแต่ละตัวจะถูกปรับเพื่อให้ลูกทั้งหมดไปถึงช่วงเวลาเดียวกัน ทำให้อนิเมชันที่มีความยาวแตกต่างกันทำงานตามกันอย่างละเอียด
- Unsynced: การผสมมาตรฐานที่แสดงว่าแต่คลิปนั้นสามารถก้าวล้ำได้ตามอัตราการเล่น
- ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: โหนดจะฟังเหตุการณ์จากโหนดลูกที่ทำงานอยู่ทั้งหมด
- การปล่อยเหตุการณ์: เฉพาะเหตุการณ์จากการนำเข้าแรกที่มีน้ำหนักสูงสุดจะถูกส่งผ่าน จะถูกปรับตามน้ำหนักผสม ของเหตุการณ์จากการนำเข้าสำรองจะถูกปิดเสียง
Blend2D

ผสมระหว่างท่าทางอนิเมชันหลายท่าจากสองพารามิเตอร์ภายในพื้นที่พิกัด 2D มันช่วยให้สามารถสร้างกราฟที่ซับซ้อนจากการเคลื่อนไหวที่เกิดขึ้นได้
- ข้อมูลนำเข้า
- Input1...InputN
- X (หมายเลข): พิกัด X สำหรับการนำเข้าสุดท้าย ทั้งหมด
- Y (หมายเลข): พิกัด Y สำหรับการนำเข้าสุดท้าย ทั้งหมด
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย InputMode Enum.AnimationNodeBlend2DInputMode กำหนดระบบพิกัดที่ใช้ในการประเมินพื้นที่ผสม:
- Cartesian (ค่าเริ่มต้น): ใช้พิกัดกริด 2D มาตรฐาน X และ Y แสดงถึงตำแหน่งปัจจุบันในพื้นที่ผสม
- Polar: ใช้ค่ามุมและขนาด X แสดงถึงทิศทางในเรเดียน ขณะที่ Y แสดงถึงขนาดหรือความเข้มของการเคลื่อนไหว ทิศทางมีน้ำหนักมากกว่าขนาด การรวมกันจึงพิจารณาทิศทางมากกว่าความเข้ม ทำให้การเข้าใกล้ที่มีมุมใกล้เคียงกันแต่มีขนาดต่างกันผสมกันได้อย่างราบรื่นกว่าทิศทางที่แตกต่างกัน
X หมายเลข ค่าปัจจุบันของพิกัด X (Cartesian) หรือทิศทางในเรเดียน (Polar) Y หมายเลข ค่าปัจจุบันของพิกัด Y (Cartesian) หรือขนาด (Polar) PhaseSync Enum.AnimationNodePhaseSync กำหนดเวลาในการทำงานของโหนดลูกว่าสามารถซิงค์หรือไม่
- Synced (ค่าเริ่มต้น): การซิงโครไนซ์ที่เป็นมาตรฐาน โหนดจะคำนวณ "ระยะเวลาที่เสมือนจริง" ตามค่าเฉลี่ยที่มีน้ำหนักของการใช้งานอยู่ ขนาดที่ทำงานของโหนดแต่ละตัวจะถูกปรับเพื่อให้ลูกทั้งหมดไปถึงช่วงเวลาเดียวกัน ทำให้อนิเมชันที่มีความยาวแตกต่างกันทำงานตามกันอย่างละเอียด
- Unsynced: การผสมมาตรฐานที่แสดงว่าแต่คลิปนั้นสามารถก้าวล้ำได้ตามอัตราการเล่น
- ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: โหนดจะฟังเหตุการณ์จากโหนดลูกที่ทำงานอยู่ทั้งหมด
- การปล่อยเหตุการณ์: เฉพาะเหตุการณ์จากการนำเข้าแรกที่มีน้ำหนักสูงสุดจะถูกส่งผ่าน จะถูกปรับตามน้ำหนักผสม ของเหตุการณ์จากการนำเข้าสำรองจะถูกปิดเสียง
Mask

นำมาสก์ที่กำหนดล่วงหน้ามาใช้กับอนิเมชั่น Pose การทำมาสก์จะถูกกำหนดโดยน้ำหนักที่กำหนดให้กับวัตถุ (เช่น ข้อต่อ) ในลำดับของโครงกระดูกเพื่อให้ควบคุมหรือทำให้อนิเมชันมีขอบที่เฉพาะเจาะจงได้
- ข้อมูลนำเข้า
- Pose: รุ่นอนิเมชันที่จะทำมาสก์
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย Mask ObjectValue ObjectValue (สร้างขึ้นเป็นลูกโดยตรงของ Mask AnimationNodeDefinition) ที่กำหนดน้ำหนักมาสก์ ซึ่งอาจทำงานในหนึ่งในสองวิธี:
- โดยตรง: ObjectValue เองมีแอตทริบิวต์ที่แผนที่ชื่อวัตถุโครงกระดูกไปยังค่าน้ำหนักเฉพาะ.
- ตามการอ้างอิง: ObjectValue อ้างอิงไปยัง Instance อื่นซึ่งมีคุณสมบัติการแผนที่นี้ ทำให้สามารถใช้มาสก์ที่ร่วมกันในโหนดต่างๆ ได้
เมื่อต้องสร้างมาสก์ คุณสามารถเลือกโครงสร้างโครงกระดูก (HumanoidRigDescription หรือ Picker) เพื่อเติมเต็มลำดับ
- HumanoidRigDescription: มาตรฐานเพลงมาสก์สำหรับตัวละครมาสก์
- Picker: อนุญาตให้ผู้ใช้เลือกโครงกระดูกรายการใดรายการหนึ่งในงานเพื่อเติมเต็มมาสก์
Invert Boolean เมื่อเป็นจริงจะนำค่าน้ำหนักในรูปแบบ 1 - น้ำหนักสิ่งนี้จะช่วยให้เมื่อมาสก์กลับมาใช้ซ้ำโดยไม่สร้างสินทรัพย์ใหม่ได้ - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: โหนดจะฟังเหตุการณ์ทั้งหมดจากข้อมูล Pose
- การปล่อยเหตุการณ์: เหตุการณ์ทั้งหมดจากข้อมูล Pose จะถูกส่งผ่านโดยไม่มีการเปลี่ยนแปลง
Speed

ปรับอัตราการเล่นของอนิเมชันที่เข้ามา
- ข้อมูลนำเข้า
- Pose: ท่าทางอนิเมชันหรือซับกราฟที่ความเร็วในการเล่นจะถูกปรับ
- คุณสมบัติ
คุณสมบัติ ประเภท คำอธิบาย Speed หมายเลข คูณที่นำไปใช้กับเวลาที่เปลี่ยนแปลง () 0.0 จะหยุดกราฟ 1.0 คือความเร็วปกติ และ 2.0 คือความเร็วสองเท่า - ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: โหนดจะฟังเหตุการณ์จากข้อมูล Pose
- การปล่อยเหตุการณ์: เหตุการณ์ทั้งหมดจากข้อมูล Pose จะถูกส่งผ่านโดยไม่มีการเปลี่ยนแปลง โปรดทราบว่าขณะที่ความเร็วในการเล่นของภาพที่มองเห็นจะเปลี่ยนแปลงไป แต่เวลาที่ปล่อยเหตุการณ์ (เช่น มาร์กเกอร์) จะมีการปรับค่าอย่างเหมาะสมตามอัตราการเล่นที่เปลี่ยนแปลง
GraphOutput

แทนค่าท่าทางที่ประเมินได้สุดท้ายของกราฟ โหนดนี้จะรวมอยู่โดยอัตโนมัติในกราฟใหม่ทั้งหมดในตัวแก้ไขกราฟอนิเมชัน การมีอยู่ของมันช่วยให้มั่นใจได้ว่ากราฟถูกต้องและผลิตท่าทางอนิเมชันอย่างสม่ำเสมอ
- ข้อมูลนำเข้า
- Pose: ข้อมูลอนิเมชันสุดท้ายที่จะถูกนำไปใช้กับโครงกระดูก
- คุณสมบัติ
- ไม่มี
- ข้อมูลเหตุการณ์
- การจัดการเหตุการณ์: โหนดจะฟังเหตุการณ์ทั้งหมดที่ถูกส่งผ่านจากการนำเข้าสุดท้ายที่เชื่อมต่อ
- การปล่อยเหตุการณ์: โหนดนี้ทำหน้าที่เป็นจุดออกสำหรับท่ออนิเมชันและไม่ได้ปล่อยสัญญาณกลับเข้าไปในกราฟ
การเปลี่ยนผ่าน
โหนดหลายตัวในกราฟอนิเมชัน (เช่น Select, Priority Select, Sequence, และ Random Sequence) จัดการว่าอนิเมชันผสมกันเมื่อเปลี่ยนระหว่างการนำเข้าสำหรับการป้องกันการซ้ำซ้อนในอ้างอิงโหนด พฤติกรรมเหล่านี้จะถูกกำหนดโดยการตั้งค่ากลุ่มคุณสมบัติการเปลี่ยนผ่านที่มีมาตรฐาน
การเปลี่ยนผ่านเริ่มต้น

พฤติกรรมการผสมมาตรฐานที่นำไปใช้กับโหนดเมื่อใดก็ตามที่มันเปลี่ยนไปยังการนำเข้าที่ใช้งานใหม่
- DefaultTransitionDuration (หมายเลข): เวลา (ในวินาที) ที่ใช้ในการปรับผสมให้สมบูรณ์ในท่าทางใหม่
- DefaultTransitionCurve (Enum.PoseEasingStyle): ฟังก์ชันการผ่อนคลายที่ใช้ในระหว่างการเปลี่ยนผ่าน ในปัจจุบันรองรับเฉพาะ Enum.PoseEasingStyle.Linear และ Enum.PoseEasingStyle.CubicV2
การบังคับเปลี่ยนผ่าน

ลิงค์คุณสมบัติเฉพาะของการนำเข้าที่มีลำดับสูงกว่าจะมีลำดับในลำดับที่กำหนด สำหรับการเปลี่ยนผ่านจากโหนดที่เปลี่ยนไปยังข้อมูลการนำเข้าเฉพาะ
- TransitionOverrideDuration (หมายเลข): ช่วงการเปลี่ยนผ่านที่ปรับเปลี่ยน
- TransitionOverrideCurve (Enum.PoseEasingStyle): ปรับเปลี่ยนฟังก์ชันการผ่อนคลายในการเปลี่ยนผ่าน ค่าใช้ได้จะรองรับเฉพาะ Enum.PoseEasingStyle.Linear และ Enum.PoseEasingStyle.CubicV2
การจำลอง
พารามิเตอร์กราฟอนิเมชันจะมีเฉพาะใน AnimationTrack และไม่ได้มีการจำลองโดยอัตโนมัติ อาจมีการเปลี่ยนแปลงในอนาคต แต่อาจแนะนำวิธีที่ใช้กันอย่างแพร่หลาย:
- Client → Server: การตั้งเวลา RemoteEvent เพื่อส่งพารามิเตอร์จากลูกค้าผู้ถือไปยังเซิร์ฟเวอร์ที่อัตราตฏิการที่คงที่
- Server → ลูกค้าอื่นๆ: คุณสมบัติ Instance ที่จำลองอัตโนมัติไปยังลูกค้าทุกคน
ตัวละครผู้เล่น
สคริปต์ลูกค้าจะจัดการตัวละครผู้เล่น เนื่องจากเฉพาะลูกค้าที่เป็นเจ้าของเท่านั้นที่รู้สถานะการเล่นเกมปัจจุบัน (ข้อมูลการเคลื่อนไหว สถานะ Humanoid ฯลฯ) พารามิเตอร์จะต้องไหลจากลูกค้าที่เป็นเจ้าของไปยังเซิร์ฟเวอร์ และจากนั้นไปยังลูกค้าทุกคน
การตั้งค่า
ภายใต้ StarterCharacterScripts ให้สร้าง:
- LocalScript สำหรับการขับอนิเมชันและพารามิเตอร์บนฝั่งลูกค้า
- Script สำหรับการจำลองในฝั่งเซิร์ฟเวอร์
- RemoteEvent สำหรับการสื่อสารจากลูกค้าถึงเซิร์ฟเวอร์
สคริปต์ลูกค้า
ลูกค้าที่เป็นเจ้าของจะขับเคลื่อนพารามิเตอร์จากเหตุการณ์การเล่นเกมและส่งไปยังเซิร์ฟเวอร์เป็นระยะเวลา ขณะที่ลูกค้าอื่นๆ อ่านคุณสมบัติที่จำลองจากสคริปต์เซิร์ฟเวอร์แทน
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- โหลดกราฟอนิเมชัน
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- แทนที่ด้วย ID ของกราฟที่เผยแพร่
local track = animator:LoadAnimation(animation)
track:Play()
local isLocalCharacter = Players:GetPlayerFromCharacter(character) == Players.LocalPlayer
if not isLocalCharacter then
-- อ่านพารามิเตอร์ที่จำลองจากสคริปต์เซิร์ฟเวอร์
local animateServer = script.Parent:WaitForChild("AnimateServer")
for attribute, value in animateServer:GetAttributes() do
track:SetParameter(attribute, value)
end
animateServer.AttributeChanged:Connect(function(attribute)
track:SetParameter(attribute, animateServer:GetAttribute(attribute))
end)
return
end
-- ผู้เล่นท้องถิ่น: ขับพารามิเตอร์จากการเล่นเกม
local params = {}
local function setParam(key, value)
track:SetParameter(key, value)
params[key] = value
end
-- ตัวอย่าง: ขับพารามิเตอร์จากสถานะ Humanoid
humanoid.Running:Connect(function(speed)
setParam("Speed", speed)
setParam("State", if speed < 0.1 then "Idle" else "Moving")
end)
-- ส่งพารามิเตอร์ไปยังเซิร์ฟเวอร์ในอัตราที่คงที่
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
local TICK_RATE = 1 / 20
local lastSendTime = 0
RunService.Stepped:Connect(function(gameTime)
if gameTime - lastSendTime > TICK_RATE then
lastSendTime = gameTime
replicateEvent:FireServer(params)
end
end)
สคริปต์เซิร์ฟเวอร์
รับพารามิเตอร์จากลูกค้าที่เป็นเจ้าของขับเคลื่อนกราฟอนิเมชันฝั่งเซิร์ฟเวอร์ และส่งค่าผ่านคุณสมบัติเพื่อจำลองไปยังลูกค้าผู้อื่น
local Players = game:GetService("Players")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- โหลดกราฟอนิเมชันเดียวกันบนเซิร์ฟเวอร์
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- ID ของกราฟเดียวกับลูกค้า
animation.Parent = script
local track = animator:LoadAnimation(animation)
track:Play()
-- รับพารามิเตอร์จากลูกค้าที่เป็นเจ้าของและจำลองผ่านคุณสมบัติ
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
replicateEvent.OnServerEvent:Connect(function(player, params)
if Players:GetPlayerFromCharacter(character) ~= player then
return
end
for key, value in params do
track:SetParameter(key, value)
script:SetAttribute(key, value)
end
end)
NPCs
เนื่องจากเซิร์ฟเวอร์เป็นเจ้าของอนิเมชัน NPC จึงไม่จำเป็นต้องมีการจำลองจากเซิร์ฟเวอร์ไปยังลูกค้า ดำเนินการกราฟอนิเมชันบนเซิร์ฟเวอร์เขียนพารามิเตอร์เป็นคุณสมบัติในสคริปต์เซิร์ฟเวอร์และอ่านพวกเขาบนลูกค้าโดยใช้รูปแบบเดียวกัน Instance.AttributeChanged
ความล่าช้า
ลูกค้าอื่นๆ จะเห็นอนิเมชันด้วยความล่าช้าที่เล็กน้อยซึ่งเท่ากับช่วงเวลาของตั๋ว (มากถึง 50 มิลลิวินาทีที่ 20 Hz) บวกกับความล่าช้าในเครือข่าย คุณสามารถลดช่วงเวลาตั๋วโดยการเพิ่มความถี่ (เช่น 1/30) แม้จะเพิ่มปริมาณข้อมูลในเครือข่าย แต่ 20 Hz ก็เป็นตัวเลือกที่เหมาะสม และการผสมอนิเมชันมีความยืดหยุ่นมากพอที่ความล่าช้าที่เล็กน้อยจะยากที่จะสังเกต