การเล่นอนิเมชั่นตัวละคร เป็นส่วนสำคัญของสิ่งที่ทำให้ตัวละครและตัวละครที่ไม่สามารถเล่นได้ (NPCs) แสดงออกมาได้อย่างมีสีสัน สมจริง และดึงดูดกลุ่มผู้ชมของคุณ นอกจากจะให้ภาพลักษณ์ที่สมจริงแล้ว อนิเมชั่นตัวละครยังให้ข้อมูลย้อนกลับแก่ผู้เล่นจากการกระทำของพวกเขา, คำแนะนำเกี่ยวกับวิธีการนำทางในสภาพแวดล้อม และข้อมูลที่สำคัญเกี่ยวกับตัวละครของพวกเขาและคนอื่น ๆ
โดยใช้ไฟล์ Hazardous Space Station .rbxl เป็นข้อมูลอ้างอิง บทเรียนนี้จะแสดงให้คุณเห็นวิธีการเล่นอนิเมชั่นตัวละครโดยใช้เทคนิคที่แตกต่างกันสองเทคนิค รวมถึงคำแนะนำเกี่ยวกับ:
- การสลับ ID สินทรัพย์อนิเมชั่นเริ่มต้นของตัวละครด้วยอนิเมชั่นที่กำหนดเองของคุณ
- การเรียกใช้อนิเมชั่นเพื่อตอบสนองต่อการกระทำของตัวละครในพื้นที่ 3D
หลังจากที่คุณจบบทเรียนนี้ คุณจะมีทักษะในการปรับแต่งอนิเมชั่นสำหรับสถานการณ์การเล่นเกมที่หลากหลาย
เปลี่ยนอนิเมชั่นเริ่มต้น
ตัวละครทุกตัวที่มีวัตถุ Humanoid เริ่มต้น ไม่ว่าจะเป็นอวาตาร์ที่ผู้เล่นควบคุมหรือ NPC จะมีชุด อนิเมชั่นเริ่มต้น ที่เล่นเมื่อใดก็ตามที่ตัวละครทำการกระทำเฉพาะในประสบการณ์ เช่น การวิ่ง ปีนป่าย และการกระโดด โรบล็อกซ์ให้อนิเมชั่นเหล่านี้มาใช้งานได้ในทุกประสบการณ์โดยไม่ต้องมีการเขียนสคริปต์เพิ่มเติม
อย่างไรก็ตาม หากอนิเมชั่นเริ่มต้นเหล่านี้ไม่ตรงตามข้อกำหนดในการออกแบบสำหรับสภาพแวดล้อม ความสวยงาม หรือเรื่องราวทั้งหมดของโลกของคุณ คุณสามารถสลับมันออกด้วยอนิเมชั่นที่กำหนดเองซึ่งจะนำไปใช้กับผู้เล่นทุกคนที่เข้าร่วมประสบการณ์ของคุณ
เพื่อแสดงให้เห็น ส่วนถัดไปจะสอนคุณวิธีการสลับอนิเมชั่นเดินเริ่มต้นด้วยอนิเมชั่นการเดินวนที่กำหนดเองจาก สร้างอนิเมชั่นตัวละคร โดยใช้กระบวนการเดียวกันนี้ คุณสามารถสลับอนิเมชั่นเริ่มต้นใด ๆ ด้วย 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 สินทรัพย์อนิเมชั่นที่กำหนดเองของคุณ ตัวอย่างเช่น โค้ดตัวอย่างต่อไปนี้อ้างอิงไปยังอนิเมชั่นการเดินวนจาก สร้างอนิเมชั่นตัวละคร.
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 นี้ ดูที่ ตรวจจับการชน.
เพิ่มอนิเมชั่น
หากคุณทดสอบการเล่นเกมของคุณในตอนนี้ สคริปต์ TriggerAnimation ของคุณยังคงไม่สามารถเล่นอนิเมชั่นเพื่อตอบสนองต่อการชนของผู้เล่นในท้องถิ่นกับโวลุ่มได้ นี่คือเหตุผลที่มันรอวัตถุ Animation ลูกที่มี ID สินทรัพย์อนิเมชั่นที่มันสามารถอ้างอิง และวัตถุ Animation นั้นยังไม่เคยมีอยู่ในขณะนี้
เพื่อเพิ่มอนิเมชั่นสำหรับสคริปต์ท้องถิ่นที่จะอ้างอิงเมื่อผู้เล่นชนกับโวลุ่ม:
ในหน้าต่าง Explorer ให้เพิ่มอนิเมชั่นใหม่ลงใน TriggerAnimation.
- เลื่อนเมาส์ไปที่ TriggerAnimation และคลิกปุ่ม ⊕
- จากเมนูบริบท ให้เลือก Animation.
เลือกวัตถุอนิเมชั่นใหม่ จากนั้นในหน้าต่าง Properties ตั้งค่า AnimationID เป็น ID สินทรัพย์อนิเมชั่นที่คุณต้องการเรียกใช้เมื่อผู้เล่นสัมผัสโวลุ่ม สำหรับตัวอย่าง Hazardous Space Station อ้างอิง rbxassetid://3716468774 เพื่อเล่นอนิเมชั่นของตัวละครล้มหลัง
ทดสอบการเล่นเกมของคุณเพื่อให้แน่ใจว่าอนิเมชั่นของคุณเล่นเมื่อผู้เล่นอยู่ใกล้กับไอน้ำรั่วครั้งแรก