การเล่นอนิเมชันตัวละคร เป็นส่วนสำคัญที่ทำให้ตัวละครและตัวละครที่ไม่สามารถเล่นได้ (NPCs) มีความแสดงออก สมจริง และน่าสนใจต่อผู้ชมของคุณ นอกจากการให้ภาพที่ดื่มด่ำแล้ว อนิเมชันตัวละครยังให้ข้อเสนอแนะแก่ผู้เล่นจากการกระทำของพวกเขา คำแนะนำเกี่ยวกับวิธีการนำทางในสภาพแวดล้อม และข้อมูลสำคัญเกี่ยวกับตัวละครของพวกเขาและตัวละครอื่น ๆ
โดยใช้ไฟล์ Hazardous Space Station .rbxl เป็นข้อมูลอ้างอิง บทช่วยสอนนี้จะแสดงให้คุณเห็นวิธีการเล่นอนิเมชันตัวละครโดยใช้เทคนิคที่แตกต่างกันสองวิธี รวมถึงคำแนะนำเกี่ยวกับ:
- การเปลี่ยน ID ของสินทรัพย์อนิเมชันตัวละครเริ่มต้นด้วยอนิเมชันที่กำหนดเองของคุณ
- การเรียกใช้อนิเมชันเพื่อตอบสนองต่อการกระทำของตัวละครภายในพื้นที่ 3D
หลังจากที่คุณทำบทช่วยสอนนี้เสร็จสิ้น คุณจะมีทักษะในการปรับแต่งอนิเมชันสำหรับสถานการณ์การเล่นเกมที่หลากหลาย
เปลี่ยนอนิเมชันเริ่มต้น
ตัวละครทุกตัวที่มีวัตถุ Humanoid เริ่มต้น ไม่ว่าจะเป็นอวตารที่ควบคุมโดยผู้เล่นหรือตัวละครที่ไม่ใช่ผู้เล่น (NPC) จะมีชุดของ อนิเมชันเริ่มต้น ที่เล่นเมื่อใดก็ตามที่ตัวละครทำการกระทำเฉพาะในเกม เช่น การวิ่ง การปีน และการกระโดด Roblox ให้อนิเมชันเหล่านี้โดยไม่ต้องใช้การเขียนสคริปต์เพิ่มเติมสำหรับทุกเกม
อย่างไรก็ตาม หากอนิเมชันเริ่มต้นเหล่านี้ไม่ตรงตามข้อกำหนดการออกแบบสำหรับสภาพแวดล้อม ความสวยงาม หรือเรื่องราวโดยรวมของโลกของคุณ คุณสามารถเปลี่ยนมันด้วยอนิเมชันที่กำหนดเองซึ่งใช้ได้กับผู้เล่นทุกคนที่เข้าร่วมเกมของคุณ
เพื่อแสดงให้เห็น ส่วนถัดไปจะแสดงวิธีการเปลี่ยนอนิเมชันการเดินเริ่มต้นด้วยอนิเมชันการเดินที่กำหนดเองจาก Create Character Animations โดยใช้กระบวนการเดียวกันนี้ คุณสามารถเปลี่ยนอนิเมชันเริ่มต้นใด ๆ ด้วย ID สินทรัพย์อนิเมชันของคุณเอง
สร้างสคริปต์
วัตถุ Humanoid ของตัวละครแต่ละตัวจะมีวัตถุ Animator ที่เก็บอนิเมชันเริ่มต้นทั้งหมดของตัวละคร เพื่อที่จะตั้งค่าอนิเมชันเริ่มต้นใด ๆ เหล่านี้ให้เป็น ID สินทรัพย์ใหม่ คุณต้องสร้างสคริปต์ใน ServerScriptService เพื่อให้สามารถอ้างอิงและเขียนทับค่าดีฟอลต์ของวัตถุ Animator ได้ทันทีที่ผู้เล่นโหลดเข้าสู่เกม
ในการสร้างสคริปต์ที่จะอ้างอิง ID สินทรัพย์อนิเมชันเริ่มต้น:
ในหน้าต่าง Explorer ให้เพิ่มสคริปต์ใหม่ไปที่ ServerScriptService
- เลื่อนเมาส์ไปที่ ServerScriptService และคลิกที่ปุ่ม ⊕
- จากเมนูบริบท ให้แทรก Script
ในสคริปต์ใหม่ ให้วางโค้ดต่อไปนี้:
local Players = game:GetService("Players")local function onCharacterAdded(character)local humanoid = character:WaitForChild("Humanoid")local animator = humanoid:WaitForChild("Animator")print("พบ Animator!")endlocal function onPlayerAdded(player)player.CharacterAdded:Connect(onCharacterAdded)endPlayers.PlayerAdded:Connect(onPlayerAdded)
สคริปต์ ResetDefaultAnimations เริ่มต้นด้วยการดึงบริการ Players ซึ่งประกอบด้วยวัตถุ Player ทั้งหมดสำหรับผู้เล่นเมื่อพวกเขาเชื่อมต่อกับเซิร์ฟเวอร์ เมื่อแต่ละตัวละครของผู้เล่นโหลดเข้าสู่เกม ฟังก์ชัน onCharacterAdded จะรอจนกว่าจะตรวจพบวัตถุ Humanoid และ Animator ของตัวละคร
เมื่อมันตรวจพบวัตถุ Animator เป็นครั้งแรก สคริปต์จะพิมพ์ "พบ Animator!" เพื่อแจ้งให้คุณทราบว่าสคริปต์ทำงานตามที่ตั้งใจไว้
เปลี่ยน ID สินทรัพย์
ตอนนี้คุณรู้ว่าสคริปต์ของคุณสามารถตรวจจับเมื่อผู้เล่นโหลดและเชื่อมต่อกับเซิร์ฟเวอร์ได้แล้ว คุณสามารถปรับเปลี่ยนสคริปต์ของคุณเพื่ออ้างอิง ID อนิเมชันที่คุณต้องการเปลี่ยนด้วยอนิเมชันที่กำหนดเองของคุณ
ตารางต่อไปนี้ประกอบด้วยอนิเมชันตัวละครเริ่มต้นทั้งหมดที่คุณสามารถเรียกใช้และเปลี่ยนภายในวัตถุ Animator โปรดทราบว่า Idle มีสองรูปแบบที่คุณสามารถตั้งโปรแกรมให้เล่นบ่อยขึ้นหรือน้อยลงได้
| การกระทำของตัวละคร | การอ้างอิงสคริปต์อนิเมชัน |
| วิ่ง | animateScript.run.RunAnim.AnimationId |
| เดิน | animateScript.walk.WalkAnim.AnimationId |
| กระโดด | animateScript.jump.JumpAnim.AnimationId |
| Idle | animateScript.idle.Animation1.AnimationId |
| ตก | animateScript.fall.FallAnim.AnimationId |
| ว่ายน้ำ | animateScript.swim.Swim.AnimationId |
| ว่ายน้ำ (Idle) | animateScript.swimidle.SwimIdle.AnimationId |
| ปีน | animateScript.climb.ClimbAnim.AnimationId |
เพื่อเปลี่ยน ID สินทรัพย์อนิเมชันการเดินเริ่มต้น:
เรียกใช้การอ้างอิงสคริปต์อนิเมชันการเดินเริ่มต้น จากนั้นเปลี่ยน ID สินทรัพย์ด้วย ID สินทรัพย์อนิเมชันที่กำหนดเองของคุณ ตัวอย่างเช่น โค้ดตัวอย่างต่อไปนี้อ้างอิงถึงอนิเมชันการเดินจาก Create Character Animations.
local Players = game:GetService("Players")local function onCharacterAdded(character)local humanoid = character:WaitForChild("Humanoid")local animator = humanoid:WaitForChild("Animator")print("พบ Animator!")local animateScript = character:WaitForChild("Animate")animateScript.walk.WalkAnim.AnimationId = "rbxassetid://122652394532816"endlocal function onPlayerAdded(player)player.CharacterAdded:Connect(onCharacterAdded)endPlayers.PlayerAdded:Connect(onPlayerAdded)ทดสอบเกมของคุณเพื่อให้แน่ใจว่าอนิเมชันการเดินที่กำหนดเองของคุณเขียนทับอนิเมชันเริ่มต้น
เลือก Test จากเมนูแบบเลื่อนลงและคลิกที่ปุ่ม Play ที่อยู่ข้างๆ เพื่อเริ่มการทดสอบการเล่น

เดินไปรอบ ๆ สถานีอวกาศด้วยอวตารของคุณ
เรียกใช้อนิเมชัน
ในขณะที่เทคนิคก่อนหน้านี้มุ่งเน้นไปที่การเปลี่ยนอนิเมชันเริ่มต้นที่เล่นโดยอัตโนมัติเมื่อใดก็ตามที่ตัวละครทำการกระทำเฉพาะในเกม คุณสามารถเรียกใช้อนิเมชันเพื่อเล่นเพื่อตอบสนองต่อ การกระทำ ของตัวละครใด ๆ ภายในพื้นที่ 3D เช่น การหยิบของหรือการได้รับความเสียหายจากอันตราย
วิธีการเล่นอนิเมชันนี้มีประโยชน์เพราะมันให้ข้อเสนอแนะแก่ผู้เล่นทันทีเกี่ยวกับวิธีที่พวกเขาควรมีปฏิสัมพันธ์กับวัตถุในสภาพแวดล้อมของพวกเขา เพื่อแสดงให้เห็น ส่วนถัดไปจะแสดงวิธีการเรียกใช้อนิเมชันเมื่อใดก็ตามที่ตัวละครอยู่ใกล้กับการรั่วไหลของไอน้ำที่เป็นอันตรายเพื่อสอนผู้เล่นให้หลีกเลี่ยงการเดินเข้าใกล้ผนัง
แทรกปริมาตร
หนึ่งในวิธีที่พบบ่อยที่สุดในการเรียกใช้อินเทอร์เฟซการเล่นเกมที่ไม่ซ้ำกันคือการใช้ ปริมาตร หรือพื้นที่ที่มองไม่เห็นภายในพื้นที่ 3D เพื่อตรวจจับเมื่อใดก็ตามที่ตัวละครหรือวัตถุมีปฏิสัมพันธ์กับพื้นที่เฉพาะของสภาพแวดล้อม เมื่อคุณจับคู่ปริมาตรกับสคริปต์ คุณสามารถใช้ข้อเสนอแนะแบบชนกันเพื่อเรียกใช้งานโปรแกรม เช่น การลดสุขภาพของผู้เล่นหรือเล่นอนิเมชัน

เมื่อเพิ่มปริมาตรลงในเกมของคุณ สิ่งสำคัญคือต้องปรับขนาดให้ครอบคลุมเฉพาะพื้นที่ที่คุณต้องการเรียกใช้อนิเมชันของคุณ หากคุณทำให้ปริมาตรของคุณเล็กเกินไป ผู้เล่นอาจไม่ชนกับพื้นที่เพื่อเล่นอนิเมชัน; ในทางกลับกัน หากคุณทำให้ปริมาตรของคุณใหญ่เกินไป อนิเมชันจะเล่นก่อนที่ผู้เล่นจะไปถึงวัตถุหรือพื้นที่ที่น่าสนใจ และพวกเขาอาจไม่เข้าใจว่าพวกเขาทำอะไรเพื่อเรียกใช้อนิเมชัน
ในการแทรกปริมาตรรอบการรั่วไหลของไอน้ำที่จะเรียกใช้อนิเมชัน:
- ในหน้าต่าง Explorer ให้เพิ่มบล็อกพาร์ทใหม่
- วางตำแหน่งและปรับขนาดบล็อกจนกว่าจะครอบคลุมพื้นที่ที่คุณต้องการเรียกใช้อนิเมชัน
- ในหน้าต่าง Properties,
ตั้งค่า Name เป็น AnimationDetector
ตั้งค่า Transparency เป็น 1 เพื่อทำให้บล็อกมองไม่เห็น

สร้างสคริปต์
ตอนนี้คุณมีพื้นที่ที่กำหนดไว้สำหรับเรียกใช้อนิเมชันของคุณแล้ว ถึงเวลาสร้างสคริปต์ที่ตรวจจับโปรแกรมเมื่อใดก็ตามที่ผู้เล่นชนกับปริมาตร คุณสามารถฟังเหตุการณ์การชนเพื่อเรียกใช้อนิเมชันใด ๆ ที่เหมาะสมกับความต้องการการเล่นเกมของคุณ
ตัวอย่างเช่น เทคนิคอนิเมชันนี้ใช้ LocalScript แทนที่จะเป็น Script เพื่อให้ผู้เล่นได้รับข้อเสนอแน่ทันทีเมื่อพวกเขาชนกับปริมาตร หากเซิร์ฟเวอร์ฟังการชนและเล่นอนิเมชัน อาจมีความล่าช้าระหว่างที่ผู้เล่นสัมผัสปริมาตรในไคลเอนต์ของพวกเขาและเห็นอนิเมชันเล่นเนื่องจากเวลาการทำซ้ำจากเซิร์ฟเวอร์ไปยังไคลเอนต์
ในการสร้างสคริปต์ท้องถิ่นที่จะตรวจจับเมื่อใดก็ตามที่ตัวละครของผู้เล่นท้องถิ่นสัมผัสปริมาตร:
ในหน้าต่าง Explorer ให้เพิ่มสคริปต์ใหม่ไปที่ StarterCharacterScripts การวางตำแหน่งนี้ทำให้แน่ใจว่าสคริปต์และลูกของมันจะถูกโคลนไปยังตัวละครของผู้เล่นเมื่อเข้าร่วม และ เมื่อพวกเขาฟื้นคืนชีพกลับเข้าสู่เกม
- ขยาย StarterPlayer จากนั้นเลื่อนเมาส์ไปที่ลูก StarterCharacterScripts และคลิกที่ปุ่ม ⊕
- จากเมนูบริบท ให้แทรก LocalScript และเปลี่ยนชื่อเป็น TriggerAnimation
ในสคริปต์ใหม่ ให้วางโค้ดต่อไปนี้:
local Workspace = game:GetService("Workspace")local animation = script:WaitForChild("Animation")local humanoid = script.Parent:WaitForChild("Humanoid")local animator = humanoid:WaitForChild("Animator")local animationTrack = animator:LoadAnimation(animation)local animationDetector = Workspace:WaitForChild("AnimationDetector")local debounce = falseanimationDetector.Touched:Connect(function(hit)if debounce thenreturnendlocal hitCharacter = hit:FindFirstAncestorWhichIsA("Model")if hitCharacter ~= localCharacter thenreturnenddebounce = trueanimationTrack:Play()animationTrack.Ended:Wait()debounce = falseend)
สคริปต์ TriggerAnimation เริ่มต้นด้วยการดึงบริการ Workspace ซึ่งประกอบด้วยวัตถุทั้งหมดที่มีอยู่ในโลก 3D สิ่งนี้สำคัญเพราะสคริปต์ต้องอ้างอิงถึงวัตถุ Part ที่ทำหน้าที่เป็นปริมาตรของคุณ
สำหรับตัวละครผู้เล่นแต่ละตัวที่โหลดหรือฟื้นคืนชีพกลับเข้าสู่เกม สคริปต์จะรอ:
- วัตถุ Animation ของมัน ซึ่งคุณจะเพิ่มในส่วนถัดไป
- วัตถุปริมาตรในพื้นที่ทำงานที่ชื่อว่า AnimationDetector
เมื่อใดก็ตามที่มีการชนกับปริมาตร ฟังก์ชันจัดการเหตุการณ์ Touched จะได้รับอนุญาตให้เข้าถึงบรรพบุรุษแรกที่เป็น Model ซึ่งควรจะเป็นตัวละครหาก BasePart ที่ชนกับปริมาตรเป็นลูกหลานของโมเดลตัวละคร หากเป็นเช่นนั้น ฟังก์ชันจะตรวจสอบว่ามันเป็นตัวละครของผู้เล่น ท้องถิ่น หรือไม่ หากเป็นเช่นนั้น ฟังก์ชันจะ:
- ตั้งค่า debounce เป็น true
- เล่นและรอให้อนิเมชันสิ้นสุด
- ตั้งค่า debounce กลับเป็น false
การตั้งค่า debounce จาก false เป็น true และกลับไปเป็น false อีกครั้งหลังจากอนิเมชันเล่นจบเป็นรูปแบบ debounce ที่ป้องกันไม่ให้อนิเมชันถูกเรียกใช้อย่างต่อเนื่องเมื่อผู้เล่นชนกับปริมาตรอย่างต่อเนื่อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ debounce นี้ โปรดดูที่ Detect collisions.
เพิ่มอนิเมชัน
หากคุณทดสอบเกมของคุณในตอนนี้ สคริปต์ TriggerAnimation ของคุณยังไม่สามารถเล่นอนิเมชันเพื่อตอบสนองต่อการชนระหว่างผู้เล่นท้องถิ่นกับปริมาตรได้ นี่เป็นเพราะมันรอวัตถุ Animation ลูกที่มี ID สินทรัพย์อนิเมชันที่สามารถอ้างอิงได้ และวัตถุ Animation นั้นยังไม่มีอยู่ในขณะนี้
ในการเพิ่มอนิเมชันสำหรับสคริปต์ท้องถิ่นเพื่ออ้างอิงเมื่อผู้เล่นชนกับปริมาตร:
ในหน้าต่าง Explorer ให้เพิ่มอนิเมชันใหม่ไปที่ TriggerAnimation
- เลื่อนเมาส์ไปที่ TriggerAnimation และคลิกที่ปุ่ม ⊕
- จากเมนูบริบท ให้แทรก Animation
เลือกวัตถุอนิเมชันใหม่ จากนั้นในหน้าต่าง Properties ตั้งค่า AnimationID เป็น ID สินทรัพย์อนิเมชันที่คุณต้องการเรียกใช้เมื่อผู้เล่นสัมผัสปริมาตร ตัวอย่างเช่น ตัวอย่าง Hazardous Space Station อ้างอิงถึง rbxassetid://3716468774 เพื่อเล่นอนิเมชันของตัวละครที่ตกลงไปข้างหลัง
ทดสอบเกมของคุณเพื่อให้แน่ใจว่าอนิเมชันของคุณเล่นเมื่อผู้เล่นอยู่ใกล้การรั่วไหลของไอน้ำครั้งแรก