ผ่านข้อความตัวชี้และสคีมาที่กำหนดไว้ล่วงหน้า คุณ (และผู้เล่นในเกม) สามารถสร้างทั้งทรัพย์สิน 3D แบบสแตติกและโมเดลที่ ทำงานได้เต็มรูปแบบ เช่น ยานพาหนะที่ขับได้ เครื่องบินที่บินได้ และอาวุธที่ยิงได้ คู่มือนี้จะแสดงวิธีการใช้ GenerateModelAsync() เป็นส่วนหนึ่งของประสบการณ์ที่สร้างสรรค์โดยผู้เล่นอย่างไดนามิก
ภาพรวม
GenerateModelAsync() ช่วยให้สามารถสร้างเรขาคณิตแบบมัลติเกลได้โดยมีข้อดีดังนี้:
- สคีมา ที่กำหนดไว้นั้นอธิบายว่าเรขาคณิตที่สร้างขึ้นจะถูกแบ่งออกเป็นส่วนอย่างไร
- วัตถุใด ๆ ที่สร้างขึ้นในเกมจะถูกจำลองและมองเห็นได้โดยผู้เล่นทุกคน ทำให้พวกเขาสามารถสร้างร่วมกันได้แบบเรียลไทม์
- เรขาคณิตที่สร้างขึ้นมีความละเอียดสูงกว่า รูปร่างโดยรวมที่ดีขึ้น ซิลลูเอตที่มีรายละเอียดมากขึ้น และมีข้อบกพร่องน้อยลง ข้อความที่สร้างขึ้นมีความสอดคล้องและมีรายละเอียดมากขึ้น โดยมีความหยาบกร้านน้อยลงและแสงที่ถูกกลั่นกรองน้อยลง
- เวลาในการสร้างมีความหน่วงต่ำกว่า ทำให้การสร้างในเกมเร็วและตอบสนองได้ดีขึ้น
- คุณและแม้กระทั่งผู้เล่นในระหว่างเกมสามารถกำหนดกล่องขอบเขตเพื่อแนะนำขนาดและสัดส่วนของโมเดลที่สร้างขึ้น
- จำนวนสามเหลี่ยมสูงสุดที่เลือกได้ช่วยให้วัตถุที่สร้างขึ้นทำงานได้ดีในเกมของคุณ
การสร้างตามสคีมา
เพื่อสร้างวัตถุที่มีการเคลื่อนไหวและทำงานได้ เรขาคณิตที่สร้างขึ้นจะต้องถูกแยกออกเป็น MeshParts หลายส่วน ตัวอย่างเช่น เพื่อสร้างรถยนต์ที่ขับได้ โดยมีล้อที่หมุนและเลี้ยว จะต้องมี MeshParts อย่างน้อยห้าชิ้น: หนึ่งชิ้นสำหรับตัวรถและสี่ชิ้นสำหรับล้อทั้งสี่ของรถ GenerateModelAsync() บรรลุสิ่งนี้ผ่าน สคีมา ที่ระบุรายชื่อส่วนที่ต้องสร้าง แสดงในโค้ดตัวอย่างดังต่อไปนี้:
สคริปต์ใน ServerScriptService
local GenerationService = game:GetService("GenerationService")
local Workspace = game:GetService("Workspace")
-- ตั้งค่าข้อมูลนำเข้าสำหรับเรขาคณิตที่สร้างขึ้น
local inputs = {
TextPrompt = "รถมังกรสีเขียวที่มีล้อ 4 อัน"
}
-- ตั้งค่าสคีมาให้เป็นตัวถังรถห้านำที่กำหนดไว้ล่วงหน้า
local schema = {
PredefinedSchema = "Car5"
}
-- ทำการเรียกเพื่อสร้างโมเดล
local success, result, metadata = pcall(function()
return GenerationService:GenerateModelAsync(inputs, schema)
end)
if success then
-- ปรับขนาดโมเดลให้มีขนาดตามที่ต้องการและจัดตำแหน่งใกล้กับจุดศูนย์กลางของโลก
local targetSize = 16
local modelSize = result:GetExtentsSize()
local scaleFactor = targetSize / math.max(modelSize.X, modelSize.Y, modelSize.Z)
result:ScaleTo(scaleFactor)
result:PivotTo(CFrame.new(0, result:GetExtentsSize().Y / 2, -40))
-- ยึดชิ้นส่วนทั้งหมดเพื่อไม่ให้เรขาคณิตหลุดออก
for _, descendant in result:GetDescendants() do
if descendant:IsA("BasePart") then
descendant.Anchored = true
end
end
-- ตั้งชื่อโมเดลและทำให้มันเป็นบุตรใน workspace
result.Name = "การสร้างรถมังกรพื้นฐาน"
result.Parent = Workspace
else
warn(result)
end
ภาพต่อไปนี้แสดงผลลัพธ์ที่คาดหวังและการก่อสร้างของมันตามที่ปรากฏในลำดับชั้นของ Explorer:


สคริปต์ที่ปรับเปลี่ยนได้
ใน Roblox, พฤติกรรม มักจะครอบคลุมถึงสคริปต์ แattachments, ข้อกำหนด และประเภทของอินสแตนซ์อื่น ๆ ที่เชื่อมต่อกับเรขาคณิตที่มีลวดลายแบบสแตติกเพื่อทำให้มันทำงานได้ เนื่องจาก GenerateModelAsync() สร้างเรขาคณิตได้หลากหลายแบบแบบเรียลไทม์, สคริปต์ที่ปรับเปลี่ยนได้ ต้องถูกแนบเพื่อตอบสนองพฤติกรรมให้เข้ากับฟังก์ชันที่คาดหวัง
ตัวอย่างเช่น พิจารณาเกมที่ผู้เล่นสามารถทำรถยนต์ที่ขับได้ของตนเองได้ GenerateModelAsync() จะใช้ข้อความตัวชี้ของผู้เล่นและสร้างเรขาคณิตที่แตกต่างกันห้าชิ้น (ตัวถังและล้อสี่ล้อ) ผ่าน Car5 สคีมา จากนั้น สคริปต์ที่ปรับเปลี่ยนได้ล่วงหน้าจะปรับพฤติกรรมการขับรถให้เข้ากับขนาดและรูปทรงของโมเดลเพื่อให้แน่ใจว่ารถยนต์สามารถขับได้และล้อหมุนอย่างสมจริง
ในการทดสอบสคริปต์ที่ปรับเปลี่ยนได้:
ดาวน์โหลดไฟล์ Behaviors.rbxm
ในลำดับชั้นของ Explorer ของ Studio คลิกขวาที่ ReplicatedStorage เลือก Insert ⟩ Import Roblox Model, และเลือกไฟล์ที่ดาวน์โหลดมา โมเดลจะแยกออกเป็นหลายโฟลเดอร์

คัดลอกและวางหนึ่งในโค้ดตัวอย่างด้านล่างนี้ลงใน Script ที่อยู่ใน ServerScriptService ขึ้นอยู่กับประเภทของวัตถุที่คุณต้องการสร้าง
ตัวอย่างนี้สร้างรถยนต์ที่ทำงานได้พร้อมด้วยเบรก การเร่งความเร็วด้วยไนตรัส เสียงและเอฟเฟกต์ภาพ และหน้าจอ UI สำหรับวัดความเร็ว
สคริปต์ใน ServerScriptServicelocal GenerationService = game:GetService("GenerationService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local Workspace = game:GetService("Workspace")-- ตั้งค่าข้อมูลนำเข้าสำหรับเรขาคณิตที่สร้างขึ้นlocal inputs = {TextPrompt = "รถมังกรสีเขียวที่มีล้อ 4 อัน"}-- ตั้งค่าสคีมาให้เป็นตัวถังรถห้านำที่กำหนดไว้ล่วงหน้าlocal schema = {PredefinedSchema = "Car5"}-- ทำการเรียกเพื่อสร้างโมเดลlocal success, result, metadata = pcall(function()return GenerationService:GenerateModelAsync(inputs, schema)end)if success then-- ปรับขนาดโมเดลให้มีขนาดตามที่ต้องการlocal targetSize = 16local modelSize = result:GetExtentsSize()local scaleFactor = targetSize / math.max(modelSize.X, modelSize.Y, modelSize.Z)result:ScaleTo(scaleFactor)-- โหลดโมดูล "makeFunctional" สำหรับ "CarBehavior"local makeFunctional = require(ReplicatedStorage.Behaviors.CarBehavior.makeFunctional)-- อ้างอิงชิ้นส่วนรถตามชื่อที่ถูกันไว้ผ่าน "Car5" schemalocal body = result:FindFirstChild("body")local frontLeftWheel = result:FindFirstChild("front left wheel")local frontRightWheel = result:FindFirstChild("front right wheel")local rearLeftWheel = result:FindFirstChild("rear left wheel")local rearRightWheel = result:FindFirstChild("rear right wheel")-- ตั้งค่าพารามิเตอร์การกำหนดค่าพฤติกรรมlocal config = {seatPosition = "inside",invisibleWhenSeated = false}-- แนบพฤติกรรมผ่านสคริปต์ "makeFunctional"local functionalModel = makeFunctional(result, frontLeftWheel, frontRightWheel, rearLeftWheel, rearRightWheel, body, config)-- จัดตำแหน่งโมเดลใกล้กับจุดศูนย์กลางของโลกfunctionalModel:PivotTo(CFrame.new(0, functionalModel:GetExtentsSize().Y / 2, -40))functionalModel.Name = "การสร้างรถมังกรพื้นฐาน"functionalModel.Parent = Workspaceelsewarn(result)end