คุณสามารถนำเข้าข้อมูลเมชที่กำหนดเองเพื่อสร้างทุกอย่างตั้งแต่ NPC ไปจนถึงผ้าของเรือใบที่เคลื่อนไหวได้ เราใช้การตั้งค่าที่กำหนดเองของ Importer เพื่อนำเข้าตัวละครที่กำหนดเองที่แปลกใหม่มากขึ้น เช่น สัตว์ประหลาดจากหลุมดำที่ลึกลับและหุ่นยนต์บริการที่เป็นมิตร (แม้จะไม่รู้ตัวก็ตาม)
ส่วนถัดไปจะพูดถึงวิธีที่เราใช้ rigging และ skinning, PBR (ลักษณะพื้นผิว) และ VFX เพื่อสร้างหนึ่งในตัวละครที่ซับซ้อนกว่าที่เราตั้งชื่อว่า "Creature" เราต้องการให้มันเรืองแสง ปล่อยแสงบางอย่าง มีเส้นทางของควันอนุภาค และการเคลื่อนไหวที่ลื่นไหลซึ่งเกี่ยวข้องกับการทำ skinning ของ rig ที่มีข้อต่อเพียงพอเพื่อสร้างคลื่นที่น่าเชื่อถือของหนวดของมัน

Rig
เมื่อเราทำการ rig ตัว Creature เราพบว่าการโมเดลตัวละครในท่าทางที่เป็นกลางนั้นดีที่สุด เพราะท่าทางนั้นเหมาะสมที่สุดสำหรับการงอในหลายทิศทาง หากเราโมเดล Creature ด้วยหนวดที่ม้วนอยู่แล้ว มันจะนำไปสู่การยืดเมื่อเราอนิเมทหนวดให้งอในทิศทางตรงกันข้าม สกรีนช็อตต่อไปนี้แสดงให้เห็นถึง Creature ในสภาพธรรมชาติของมัน:


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

เราพบว่าคำแนะนำต่อไปนี้มีประโยชน์ เพื่อให้เมชของตัวละครนำเข้าถูกต้องใน Studio:
- ข้อต่อและกระดูกแต่ละตัวต้องมีชื่อที่ไม่ซ้ำกัน
- เมชต้องไม่มีชื่อเดียวกับข้อต่อและกระดูก
- เมชควรไม่มีการเปลี่ยนแปลงก่อนการทำ skinning/binding; กล่าวอีกนัยหนึ่ง การเปลี่ยนแปลงควรเป็น 0 และสเกลควรเป็น 1
- นอร์มอลของเมชควรหันออกด้านนอก (โมเดลไม่ควรมองเข้าไปข้างใน)
- โครงกระดูกไม่ควรมีปัจจัยการขยาย; ข้อต่อทั้งหมดควรเป็น [1, 1, 1].
Skin
เมื่อเราทำโครงกระดูกของ Creature เสร็จแล้ว ขั้นตอนถัดไปคือการทำ skin เมช การทำ skin อาจเป็นงานที่ยากลำบาก ดังนั้นเพื่อให้ง่ายขึ้น ควรคุ้นเคยกับการตั้งค่าการทำ skin เริ่มต้นที่แตกต่างกันของแอปพลิเคชัน DCC ของคุณเพื่อค้นหาสิ่งที่คุณชอบ เนื่องจากนี่คือตัวละครที่มีลักษณะออร์แกนิก เราจึงทำ skin ด้วยการลดการกระจายที่แต่ละข้อต่อและการทับซ้อนกันระหว่างพวกมัน ด้วยวิธีนี้ การงอจะรู้สึกเรียบเนียนและไม่แหลมคม สกรีนช็อตต่อไปนี้แสดงการทำ skin ที่ไม่ดีและการทำ skin ที่เรียบเนียนตามลำดับ:


เราพบว่าคำแนะนำต่อไปนี้ให้ผลลัพธ์ที่ดีที่สุดสำหรับการทำ skin:
- การกระจายของการทำ skin (หมายถึงพวกมันมีผลต่อส่วนหนึ่งของโมเดลเมื่อเคลื่อนที่) ควรมีสูงสุด 4 การกระจายต่อเวอร์เท็กซ์
- ชื่อของข้อต่อและเมชต้องไม่ซ้ำกัน ทั้งภายในและระหว่างกัน
- ข้อต่อใด ๆ ที่คุณต้องการนำเข้าไปยัง Studio ต้องมีอิทธิพลต่อการทำ skin ของโมเดล มิฉะนั้นเอนจินจะไม่ทำการนำเข้า เมื่อเป็นไปได้ ให้ทำ skin โมเดลของคุณในท่าทางเดิมหรือ "bind" ของมัน
นำเข้าเมชไปยัง Studio
การนำเข้าตัวละครที่กำหนดเองของคุณไปยัง Studio เป็นหนึ่งในส่วนที่น่าตื่นเต้นที่สุดของกระบวนการ เพราะคุณจะได้เห็นการสร้างสรรค์ของคุณในเกมที่คุณกำลังสร้าง!
ในการนำเข้าเมชไปยัง Studio:
ส่งออกตัวละครจากแอปพลิเคชัน DCC และตรวจสอบให้แน่ใจว่าต่อไปนี้:
- นอร์มอลทั้งหมด สเกล และชื่อถูกต้อง
- ตัวละครมีโครงสร้างข้อต่อและกระดูกทั้งหมดและเมชทั้งหมด
- เมชทั้งหมดต้องมีจำนวนสามเหลี่ยมไม่เกิน 10,000 สำหรับแต่ละส่วนของเมช
- ขนาดรวมของเมชไม่เกิน 2000 หน่วยในแกนใด ๆ
- ดู ข้อกำหนดเมช สำหรับรายการข้อกำหนดของโมเดลทั้งหมด

ใน Importer ให้นำเข้าไฟล์ .fbx หรือ .obj ที่กำหนดเอง

ทำให้ Creature เรืองแสง
เมื่อโมเดลของ Creature มีความเสถียรและไม่ต้องการการนำเข้าเพิ่มเติมใน Studio เราเริ่มจัดเตรียววัตถุ SurfaceAppearance, แสง, และเอฟเฟกต์ภาพ เราทำเช่นนี้เพื่อให้แน่ใจว่าคุณภาพของโมเดลดีพอที่จะดำเนินการวางและแก้ไขแง่มุมใด ๆ ของมัน

เรารู้ว่าเราต้องการให้ Creature มืด และจุดโฟกัสคือดวงตาและหนวด "จับ" ของมัน จุดที่มีความแตกต่างสูงมักดึงดูดความสนใจ ดังนั้นการมีจุดที่แข็งแกร่งบางจุดจะทำให้ผู้ชมรู้ว่าควรให้ความสนใจกับอะไร Studio รองรับวัสดุเนออนที่เรืองแสงด้วยตัวเอง ดังนั้นในช่วงแรกเราจึงแยกดวงตาออกเพื่อให้พวกมันเป็นวัสดุของตัวเองจากส่วนที่เหลือของตัวละคร เราทำสิ่งที่คล้ายกันสำหรับหนวด เพื่อให้พวกมันเรืองแสงที่ปลายเท่านั้น

วัสดุเนออนไม่ปล่อยแสงจริง ดังนั้นหลังจากการทดสอบบางอย่าง เราเพิ่มส่วนแยกเพื่อควบคุมการวางและทิศทางของการปล่อยแสง สิ่งนี้ทำให้แน่ใจว่าแสงถูกกำหนดในลักษณะที่ช่วยเพิ่มการเรืองแสงของดวงตาและยังฉายแหล่งแสงของตัวเอง

สังเกตว่า SpotLights เพิ่มความน่าสนใจให้กับ Creature ใกล้กับพื้นผิวอื่น ๆ หรือผู้เล่น

นอกจากนี้ เราต้องการให้หนวดของ Creature ปล่อยอนุภาคบางอย่าง เพื่อให้มันทิ้งรอยควันเมื่อมันเคลื่อนที่ เนื่องจากหนวดมีความยาวมาก การเพิ่ม ParticleEmitter ไปยังหนวดทั้งหมดจะทำให้อนุภาคปล่อยออกมาจากหนวดทั้งหมดแทนที่จะเป็นปลาย เพื่อแก้ไขปัญหานี้ เราใช้ส่วนเล็ก ๆ ที่ตั้งอยู่ใกล้ปลายของหนวด เพื่อให้เราสามารถควบคุมขนาดการปล่อย การวาง และทิศทางของอนุภาค

ทำให้ VFX ตามตัวละคร
ตำแหน่งของเมชที่ทำ skin ของตัวละครจะไม่ได้รับการอัปเดตเมื่อ Creature อนิเมท ดังนั้นเราจึงต้องการวิธีการเพื่อให้แน่ใจว่า VFX, SFX และแสงทั้งหมดติดตาม Creature อย่างถูกต้อง เพื่อให้บรรลุเป้าหมายนี้ เราได้สร้างสคริปต์ควบคุม VFX และใช้ CollectionService เพื่อแจ้งส่วนที่มี VFX ว่ากระดูกของ Creature อยู่ที่ไหนและให้ติดตามพวกมัน
เราได้วาง LocalScript ต่อไปนี้ใน StarterPlayer → StarterPlayerScripts ซึ่งจะทำให้ฟังก์ชันอัปเดต VFX ทำงาน
Local Script-- เพิ่มโค้ดนี้ลงในสคริปต์ท้องถิ่นที่มีการเชื่อมต่อ PreSimulationlocal RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)Module Script-- โมดูลนี้เชื่อมต่อส่วนต่าง ๆ กับอนิเมชันเพื่อให้พวกมันได้รับการอัปเดตเมื่ออนิเมชันเล่น มันเป็นวิธีการแก้ไขปัญหาสำหรับข้อจำกัดปัจจุบัน-- กับ Joints และ Bones และจะไม่จำเป็นเสมอไป---- ข้อกำหนดเบื้องต้น:-- เพื่อให้รวมอยู่ โมเดลต้องมีแท็ก "AnimatedVfxModel" และโฟลเดอร์-- ของส่วนทั้งหมดที่คุณต้องการซิงค์กับอนิเมชัน ส่วนแต่ละส่วนต้องมี-- แอตทริบิวต์ที่เรียกว่า "AttachedBoneName" ที่อ้างถึงชื่อของ-- กระดูกที่คุณต้องการเชื่อมต่อด้วย ส่วนต้องอยู่ในตำแหน่งที่ถูกต้อง-- เทียบกับกระดูกที่ต้องการ---- การใช้งาน:-- สคริปต์ท้องถิ่นควรเรียกใช้โมดูลนี้ จากนั้นเชื่อมต่อ-- VfxUpdateModule.updateVfx กับเหตุการณ์ RunService.PreSimulationlocal VfxUpdateModule = {}local CollectionService = game:GetService("CollectionService")-- การตั้งค่า - สิ่งนี้ควรทำงานเพียงครั้งเดียวในทุกไคลเอนต์-- รวบรวมโมเดลทั้งหมดที่มีแท็กlocal vfxModels = CollectionService:GetTagged("AnimatedVfxModel")local vfxTable = {} -- ที่เราจะเก็บส่วนทั้งหมดและออฟเซ็ต-- กำหนดตารางให้กับแต่ละโมเดลที่จะเก็บส่วน vfx ทั้งหมดและออฟเซ็ตfor _, model in vfxModels dovfxTable[model] = {}local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- ค้นหาโฟลเดอร์ VFX-- ค้นหากระดูกผ่านแอตทริบิวต์และคำนวณออฟเซ็ตสำหรับแต่ละส่วนfor _,part in vfxParts dolocal name = part:GetAttribute("AttachedBoneName")local bone = model:FindFirstChild(name, true)if bone thenlocal offset = (bone.TransformedWorldCFrame:inverse() * part.CFrame)vfxTable[model][part] = {bone, offset}elsewarn("Vfx part refers to bone that could not be found.")endendendprint(vfxTable)-- อัปเดต - สิ่งนี้ควรเชื่อมโยงกับ RunService.PreSimulation ของไคลเอนต์แต่ละตัว-- ไปที่โมเดลทั้งหมด จากนั้นอัปเดตส่วนทั้งหมดในโมเดลให้ตรงกับ bonecframefunction VfxUpdateModule.updateVfx()for model, vfxParts in vfxTable dofor part, bone in vfxParts dopart.CFrame = bone[1].TransformedWorldCFrame * bone[2]endendendreturn VfxUpdateModuleเราสร้าง VFXUpdateModule ModuleScript เพื่อบอกวัตถุใด ๆ ที่มีแท็กอย่างเหมาะสมด้วย AnimatedVfxModel ให้ทำการอัปเดตในเหตุการณ์เล่น
เราแท็กกลุ่มโมเดลที่จำเป็นด้วย AnimatedVfxModel โดยใช้ส่วน Tags ของคุณสมบัติของมัน การใช้แท็กช่วยให้ VFXUpdateModule รู้ว่าวัตถุใดควรมองหาเป็นลูก VFX ตัวแรกและนำไปใช้การอัปเดต

สุดท้าย เราเพิ่มแอตทริบิวต์ที่กำหนดเอง AttachedBoneName ให้กับส่วนที่เราต้องการอนิเมทและเพิ่มชื่อที่แน่นอนของข้อต่อที่เราต้องการให้มันติดตาม
ทำให้ Creature มีพื้นผิว
ถัดไป เราได้ตั้งค่าผลิตภัณฑ์ PBR (Physically Based Rendered) แผนที่พื้นผิว แผนที่บิตแมพที่ทรงพลังเหล่านี้ทำให้ Creature มีความเงาและความแตกต่างของพื้นผิวที่หลากหลายเพื่อให้ดูเหมือนว่ามีปุ่มเล็ก ๆ และข้อบกพร่องมากมาย เอฟเฟกต์ภาพนี้ช่วยขายลักษณะของ Creature เมื่อมันอยู่ใกล้ผู้เล่น

นี่คือวิธีที่เราสร้างแผนที่พื้นผิว:
แผนที่พื้นผิวสำหรับตัวละครนี้ทั้งหมดอยู่ใน "แผ่น" หนึ่งแผ่นต่อแผนที่ สิ่งนี้ทำให้ Creature มีประสิทธิภาพมากขึ้นและหมายความว่าเราต้องจัดการกับแผนที่พื้นผิวหรือวัตถุ SurfaceAppearance น้อยลง




สำหรับพื้นที่ที่ต้องการเรืองแสงหรือมีการเรืองแสงด้วยตัวเอง เช่น "หนวดจับ" เราใช้ความโปร่งใสบน SurfaceAppearance เพื่อผสมผสานกับส่วนเหล่านั้น

เราพบว่ามันมีประโยชน์ที่จะปฏิบัติตามคำแนะนำเหล่านี้เมื่อสร้างแผนที่พื้นผิว:
- ตรวจสอบให้แน่ใจว่าแผนที่ของคุณไม่ใหญ่กว่า 1024×1024
- ช่องสีเขียวของคุณอาจต้องพลิกขึ้นอยู่กับแอปพลิเคชันที่คุณทำงานอยู่
อนิเมท Creature
การอนิเมทเป็นเรื่องที่มีความเป็นส่วนตัวและมีสไตล์ส่วนตัว ตัวเลือกต่าง ๆ รวมถึงการจับการเคลื่อนไหว การอนิเมทด้วยมือ "key frame" ในแอปพลิเคชัน DCC ของคุณ หรือใช้ Animation Editor ที่ทรงพลังของ Studio
ตามที่เราได้กล่าวไว้ก่อนหน้านี้ เราต้องการให้แน่ใจว่าเรามีข้อต่อเพียงพอสำหรับการเคลื่อนไหวที่ลื่นไหลรวมถึงแขนขาเพียงพอ เพื่อให้การอนิเมทของ Creature รู้สึกเป็นธรรมชาติและ "ซ้อนกัน" การซ้อนกัน ซึ่งเรียกอีกอย่างว่าการเคลื่อนไหวรอง เป็นสิ่งที่คุณเห็นในชีวิตประจำวัน — เมื่อคุณโยนแขนออกไป ข้อต่อทุกข้อต่อจะตอบสนองต่อแรงกระตุ้นเริ่มต้นจากแขนส่วนบนของคุณ และข้อต่อทุกข้อต่อในร่างกายของคุณจะไม่เคลื่อนที่หรือหยุดในเวลาเดียวกัน
เราใช้เทคนิคนี้ในการอนิเมท Creature ให้รู้สึกเหมือนกับว่าแขนขากำลังตอบสนองต่อการเคลื่อนไหวที่ขับเคลื่อนโดยร่างกายของมัน ดังที่แสดงไว้ที่นี่:

หากใช้แอปพลิเคชัน DCC ภายนอกสำหรับการอนิเมท เราพบว่าคำแนะนำต่อไปนี้ทำงานได้ดีที่สุด:
- ตั้งอัตราเฟรมอย่างน้อย 30 FPS
- สร้างอนิเมชันของคุณด้วยตัวละครเดียวกันที่คุณกำลังนำไปใช้
- ส่งออกข้อมูลอนิเมชันของคุณเป็นไฟล์ .fbx แยกต่างหาก
เนื่องจากเราอนิเมทตัวละครภายนอก Studio เราจึงต้องใช้ Animation Editor เพื่อนำเข้าไฟล์อนิเมชัน .fbx ตัวแก้ไขช่วยให้คุณเลือกอวตารที่มีข้อต่อหรือมอเตอร์และขับเคลื่อนพวกเขาผ่านจุดในไทม์ไลน์
ในการนำเข้าอนิเมชัน:
ในแท็บ Avatar ของแถบเครื่องมือ ให้คลิก Clip Editor
เลือกตัวละครที่มีการ rig ที่คุณต้องการอนิเมทใน Roblox ตัวละครควรเป็นตัวเดียวกันที่คุณกำลัง rig ในแอปพลิเคชัน DCC ภายนอกของคุณ
คลิกปุ่ม ⋯ ในส่วนด้านซ้ายบนของหน้าต่างแก้ไข เลือก Import From FBX Animation และค้นหาไฟล์อนิเมชัน .fbx ที่คุณส่งออก

เมื่อคุณพอใจกับอนิเมชันของคุณแล้ว คุณสามารถส่งออกเพื่อค้นหา ID ของอนิเมชัน ซึ่งคุณสามารถใช้ในสคริปต์ Roblox เพื่อเรียกใช้งานได้ ตัวอย่างเช่น คุณสามารถเพิ่ม Script ไปยังกลุ่มโมเดลของตัวละครที่นำเข้าและใช้โค้ดต่อไปนี้เพื่อเรียกใช้งานอนิเมชัน:
local animationId = "YOUR_ANIMATION_ID"local char = script.Parentlocal animController = char:FindFirstChildWhichIsA("Humanoid") or char:FindFirstChildOfClass("AnimationController")local animation = Instance.new("Animation")animation.AnimationId = "rbxassetid://" .. tostring(animationId)local animTrack = animController:LoadAnimation(animation)animTrack:Play(0, 1, 1)
ผลลัพธ์สุดท้าย
หลังจากปรับแต่งสี ความสว่างของแสง และเอฟเฟกต์อนุภาคเพิ่มเติมเพื่อให้มีเอฟเฟกต์ฮาโลที่แข็งแกร่งขึ้นที่หน้าต่าง นี่คือผลลัพธ์สุดท้ายในสถานีอวกาศ!
