Model

แสดงที่เลิกใช้งานแล้ว

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

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

โมเดลมีจุดมุ่งหมายเพื่อแทนที่กลุ่ม ทางภูมิศาสตร์ หากการจัดกลุ่มของคุณไม่มีการตีความทางภูมิศาสตร์, ตัวอย่างเช่นคอลเลกชันของ Scripts , ใช้ Folder แทน

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

รูปแบบมีขอบเขตการใช้งานที่กว้างขวาง รวมถึงตัวละครผู้เล่น Robloxพวกเขายังมีหลายพฤติกรรมที่ไม่ซ้ำกันที่สำคัญที่ต้องจำไว้:

  • เมื่อ Humanoid และ Part ที่ชื่อ หัว ถูกผูกใต้โมเดล อินเทอร์เฟซชื่อ/สุขภาพจะปรากฏบนโมเดล; ดู ชื่อตัวละคร/การแสดงสุขภาพ สำหรับรายละเอียด
  • หากตำแหน่งส่วนบนแกน Y สัมผัสกับค่า Workspace.FallenPartsDestroyHeight และมันเป็นวัตถุสุดท้ายภายใน Model โมเดลจะถูกทําลายเช่นกัน
  • เมื่อใช้ในสถานที่ที่ตั้งค่า Workspace.StreamingEnabled เป็นจริง ค่าของ ModelStreamingMode ควบคุมพฤติกรรมต่างๆ รอบวิธีที่โมเดลและบุตรหลานใดๆ จะถูกสําเนาและ/หรือลบออกจากไคลเอนต์นอกจากนี้มูลค่าของ LevelOfDetail มีผลต่อการเรนเดอร์ของโมเดล

เช่นเดียวกับทุกประเภท Instance ที่มีอยู่ ความจริงที่ว่าพ่อแม่ Model ถูกสําเนาไปยังไคลเอนต์ไม่รับประกันว่าลูกๆ ทั้งหมดจะถูกสําเนาไปเป็นสิ่งสำคัญเป็นพิเศษหากตัวอย่างเหล่านี้ถูกเข้าถึงโดยโค้ดที่ทำงานบนไคลเอนต์ เช่นใน LocalScriptการใช้ ModelStreamingMode ด้วยค่าเช่น Atomic สามารถรับประกันได้ว่ารูปแบบทั้งหมดและบรรดาลูกหลานทั้งหมดจะปรากฏหากรูปแบบบิดามีอยู่บนไคลเอนต์หรือคุณสามารถใช้ WaitForChild() เมื่อความถูกต้องไม่เป็นที่ต้องการ

ตัวอย่างโค้ด

The following sample includes a basic function that takes a table of objects and parents them into a new Model, returning that Model.

Basic Model Instantiation

local function groupObjects(objectTable)
local model = Instance.new("Model")
for _, object in pairs(objectTable) do
object.Parent = model
end
return model
end
local objects = {
Instance.new("Part"),
Instance.new("Part"),
}
groupObjects(objects)

สรุป

คุณสมบัติ

  • การรักษาความปลอดภัยของปลั๊กอิน
    อ่านพร้อมๆ กัน

    ตั้งระดับรายละเอียดบนโมเดลสำหรับประสบการณ์ที่มีการสตรีมตัวอย่างเปิดใช้งาน

  • อ่านพร้อมๆ กัน

    ควบคุมพฤติกรรมการสตรีมรูปแบบบน Models เมื่อการสตรีมตัวอย่างถูกเปิดใช้งาน

  • อ่านพร้อมๆ กัน

    ส่วนหลักของ Model หรือ nil ตั้งค่า

  • ไม่ซ้ำ
    ไม่สามารถเขียนสคริปต์
    อ่านพร้อมๆ กัน

    คุณสมบัติสำหรับเอดิเตอร์เท่านั้นที่ใช้เพื่อขยายโมเดลรอบจุดศูนย์กลางของมัน การตั้งค่าคุณสมบัตินี้จะเคลื่อนย้ายเครื่องชั่งเหมือนว่า Model/ScaleTo ถูกเรียกใช้บนมัน

  • ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    กำหนดตำแหน่งที่ศูนย์กลางของ ซึ่งไม่ได้มีชุด ตั้งอยู่

คุณสมบัติรับทอดมาจากPVInstance
  • ไม่ซ้ำ
    ไม่สามารถเขียนสคริปต์
    อ่านพร้อมๆ กัน
  • ไม่ซ้ำ
    ไม่สามารถเขียนสคริปต์
    อ่านพร้อมๆ กัน

วิธีการ

  • AddPersistentPlayer(playerInstance : Player):()

    ตั้งค่าโมเดลนี้ให้เป็นถาวรสำหรับผู้เล่นที่ระบุModel.ModelStreamingMode ต้องตั้งค่าเป็น PersistentPerPlayer เพื่อให้พฤติกรรมเปลี่ยนแปลงเนื่องจากการเพิ่ม

  • คืนคำอธิบายของระดับที่มีส่วนประกอบทั้งหมดของโมเดล

  • คืนขนาดของกล่องล้อมรอบขนาดเล็กที่มีทั้งหมด BaseParts ใน Model สอดคล้องกับ Model.PrimaryPart หากกำหนดไว้

  • คืนวัตถุทั้งหมด Player ที่วัตถุรูปแบบนี้มีอยู่อย่างถาวรพฤติกรรมแตกต่างกันขึ้นอยู่กับว่าวิธีนี้ถูกเรียกจาก Script หรือ LocalScript หรือไม่

  • ส่งคืนเครื่องชั่งหลักของโมเดลซึ่งเริ่มต้นที่ 1 สำหรับโมเดลที่สร้างขึ้นใหม่และจะเปลี่ยนเมื่อมันถูกขยายผ่าน Model/ScaleTo

  • MoveTo(position : Vector3):()

    ย้าย PrimaryPart ไปยังตำแหน่งที่กำหนด หากส่วนหลักไม่ได้ระบุไว้ ส่วนรากของโมเดลจะถูกใช้

  • RemovePersistentPlayer(playerInstance : Player):()

    ทำให้โมเดลนี้ไม่ยังคงอยู่สำหรับผู้เล่นที่ระบุแล้วModel.ModelStreamingMode ต้องตั้งค่าเป็น PersistentPerPlayer เพื่อให้พฤติกรรมเปลี่ยนแปลงเนื่องจากการลบ

  • ScaleTo(newScaleFactor : number):()

    ตั้งตัวคูณขนาดของโมเดลโดยปรับขนาดและตำแหน่งของโอนุการทั้งหมดเพื่อให้มีตัวคูณขนาดเท่ากับขนาดและตำแหน่งเดิมเมื่อตัวคูณขนาดอยู่ที่ 1

  • TranslateBy(delta : Vector3):()

    เปลี่ยน Model โดยออฟเซ็ตที่กำหนด Vector3 เพื่อรักษาการจัดตำแหน่งของรูปแบบหากอีก BasePart หรือ Terrain มีอยู่แล้วในตำแหน่งใหม่แล้ว ตัว Model จะซ้อนบนวัตถุที่กล่าวถึง

วิธีการรับทอดมาจากPVInstance
  • เขียนพร้อมๆ กัน

    รับจุดศูนย์กลางของ PVInstance .

  • PivotTo(targetCFrame : CFrame):()

    เปลี่ยน PVInstance พร้อมกับบรรดาลูกหลานทั้งหมดของมัน PVInstances ทำให้จุดศูนย์กลางอยู่ที่ตําแหน่งที่ระบุแล้ว CFrame

คุณสมบัติ

การรักษาความปลอดภัยของปลั๊กอิน
อ่านพร้อมๆ กัน

ตั้งระดับรายละเอียดบนโมเดลสำหรับประสบการณ์ที่มีการสตรีมตัวอย่าง streaming เปิดใช้งาน

เมื่อตั้งค่าเป็น StreamingMesh รูปแบบ "imposter" ความละเอียดต่ำ (รูปแบบที่มีสีและหยาบที่ห่อรอบทุกส่วนย่อยของโมเดล) จะแสดงออกนอกรัศมีการสตรีม

เมื่อตั้งค่าเป็น Disabled หรือ Automatic เมชที่มีความละเอียดต่ำจะไม่แสดงผล

ModelStreamingMode

อ่านพร้อมๆ กัน

ควบคุมวิธีที่ Models จะถูกสตรีมเข้าและออกเมื่อเปิดใช้งานตัวอย่าง การสตรีมพฤติกรรมขึ้นอยู่กับ enum ที่เลือกไม่มีผลเมื่อการสตรีมไม่ได้เปิดใช้งาน

คุณสมบัตินี้ควรเปลี่ยนเฉพาะในสตูดิโอผ่านหน้าต่าง คุณสมบัติ เมื่อเปิดใช้งานการสตรีมหรือใน Scripts แต่ไม่เคยใน LocalScripts (การทำเช่นนี้อาจทำให้เกิดพฤติกรรมที่ไม่ชัดเจน)

PrimaryPart

อ่านพร้อมๆ กัน

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

โปรดทราบว่า Models ไม่มี PrimaryPart ตั้งค่าโดยค่าเริ่มต้นหากคุณกําลังสร้างโมเดลที่ต้องการให้ดําเนินการตามทางกายภาพคุณควรตั้งค่าคุณสมบัตินี้ด้วยตนเองใน Studio หรือภายในสคริปต์หากส่วนหลักไม่ได้ ไม่ ตั้งค่า แปดเหลี่ยมจะยังคงอยู่ในตําแหน่งเดียวกันในพื้นที่โลกแม้ว่าส่วนภายในของโมเดลจะถูกย้าย

โปรดทราบว่าเมื่อตั้งค่าคุณสมบัตินี้ ต้องเป็น BasePart ที่เป็นลูกหลานของโมเดลหากคุณพยายามตั้ง ให้เป็น ที่ไม่ใช่ลูกหลานของโมเดล จะถูกตั้งให้เป็นส่วนนั้น แต่รีเซ็ตในระหว่างขั้นตอนจำลองถัดไป — นี่คือพฤติกรรมเก่าที่จะสนับสนุนสคริปต์ที่คาดว่าพวกเขาสามารถตั้งส่วนหลักเป็น ได้ชั่วคราวได้ ซึ่งไม่ใช่ลูกหลานของโมเดล ในระหว่างขั้นตอนจำลองถัดไป

กฎทั่วไปสำหรับรูปแบบคือ:

  • โมเดลที่ส่วนประกอบของมันถูกรวมกันผ่านจุดเชื่อมต่อทางกายภาพเช่น WeldConstraints หรือ Motor6Ds ควรมีส่วนหลักที่กำหนดไว้ตัวอย่างเช่น โมเดลตัวละครของ Roblox มีการตั้งค่า Model.PrimaryPart ไว้ที่ HumanoidRootPart โดยค่าเริ่มต้น
  • โมเดลคงที่ (โดยปกติ Anchored ) ซึ่งอยู่ในสถานที่เดียวยกเว้นสคริปต์จะย้ายพวกเขาโดยเฉพาะไม่ต้องใช้ Model.PrimaryPart ตั้งค่า

ตัวอย่างโค้ด

This code sample creates and throws a dice model, then outputs whether it landed with the blue side facing up. If Model.PrimaryPart was not set, the pivot / bounding box of the dice would rotate, as the parts inside of it are physically simulated during the roll.

Throwing Dice

-- Create a dice model with two halves and attach them together
local diceModel = Instance.new("Model")
diceModel.Name = "ChanceCube"
local diceTop = Instance.new("Part")
diceTop.Size = Vector3.new(4, 2, 4)
diceTop.Position = Vector3.new(0, 1, 0)
diceTop.Color = Color3.new(0, 0, 1)
diceTop.Parent = diceModel
local diceBottom = diceTop:Clone()
diceBottom.Position = Vector3.new(0, -1, 0)
diceBottom.Color = Color3.new(1, 0, 0)
diceBottom.Parent = diceModel
local weld = Instance.new("WeldConstraint")
weld.Part0 = diceTop
weld.Part1 = diceBottom
weld.Parent = diceModel
-- Put the dice up in the air above the workspace origin (does not require a primary part)
diceModel.Parent = workspace
diceModel:PivotTo(CFrame.new(0, 10, 0))
-- Assign the primary part before physical simulation
-- Without this line, the script will always output the same thing and the bounding box of the model will not change orientation
diceModel.PrimaryPart = diceTop
-- Wait a bit before rolling the dice (let it settle onto the floor)
for i = 5, 1, -1 do
print("Rolling dice in...", i)
task.wait(1)
end
diceTop:ApplyAngularImpulse(Vector3.new(15000, 1000, 5000))
diceTop:ApplyImpulse(Vector3.new(0, 3000, 0))
task.wait(1)
-- Wait for the roll to complete
while diceTop.AssemblyLinearVelocity.Magnitude > 0.1 or diceTop.AssemblyAngularVelocity.Magnitude > 0.1 do
task.wait()
end
-- Get the dice orientation, impacted by the primary part
local orientation = diceModel:GetBoundingBox()
if orientation.YVector.Y > 0.5 then
print("It's the boy!")
else
print("It's his mother!")
end

Scale

ไม่ซ้ำ
ไม่สามารถเขียนสคริปต์
อ่านพร้อมๆ กัน

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

คุณสมบัตินี้มีอยู่เฉพาะในสตูดิโอและจะโยนข้อผิดพลาดหากใช้ใน Script หรือ LocalScript``Model/ScaleTo และ Model/GetScale ควรใช้จากสคริปต์

WorldPivot

ไม่ซ้ำ
อ่านพร้อมๆ กัน

คุณสมบัตินี้กำหนดตำแหน่งที่ศูนย์กลางของ ซึ่งไม่ได้มีชุด ตั้งค่าอยู่หาก Model ทำ มี PrimaryPart , แกนหมุนของ Model จะเท่ากับแกนหมุนของส่วนหลักนั้นแทน, และคุณสมบัตินี้ WorldPivot จะถูกเพิกเฉย

สำหรับการสร้างใหม่ Model จะได้รับการปฏิบัติเป็นศูนย์กลางของกล่องผูกของเนื้อหาจนกว่า ครั้งแรก คุณสมบัติ Model.WorldPivot จะถูกตั้งค่าเมื่อส่วนหมุนของโลกถูกตั้งค่าเป็นครั้งแรกแล้ว จะไม่สามารถฟื้นฟูพฤติกรรมเริ่มต้นนี้ได้

โดยทั่วไปแล้วการย้ายโมเดลด้วยเครื่องมือ Studio หรือด้วยฟังก์ชันการเคลื่อนที่โมเดลเช่น PVInstance:PivotTo() และ Model:MoveTo() จะตั้งจุดศูนย์กลางของโลกและจบพฤติกรรมโมเดลใหม่นี้

วัตถุประสงค์ของพฤติกรรมนี้คือเพื่อให้โค้ด Luau สามารถหมุนได้อย่างมีเหตุผลเพียงโดยการสร้างโมเดลใหม่และปลูกฝังวัตถุให้กับมันเพื่อหลีกเลี่ยงความจำเป็นในการตั้งค่า Model.WorldPivot ทุกครั้งที่คุณสร้างโมเดลในรหัส


local Workspace = game:GetService("Workspace")
local model = Instance.new("Model")
Workspace.BluePart.Parent = model
Workspace.RedPart.Parent = model
model.Parent = Workspace
print(model:GetPivot()) -- Currently equal to the center of the bounding box containing "BluePart" and "RedPart"
model:PivotTo(CFrame.new(0, 10, 0)) -- This works without needing to explicitly set "model.WorldPivot"

ตัวอย่างโค้ด

This code sample shows a custom function for resetting the pivot of a model back to the center of that model's bounding box.

Reset Pivot

local function resetPivot(model)
local boundsCFrame = model:GetBoundingBox()
if model.PrimaryPart then
model.PrimaryPart.PivotOffset = model.PrimaryPart.CFrame:ToObjectSpace(boundsCFrame)
else
model.WorldPivot = boundsCFrame
end
end
resetPivot(script.Parent)

วิธีการ

AddPersistentPlayer

()

พารามิเตอร์

playerInstance: Player
ค่าเริ่มต้น: "nil"

ส่งค่ากลับ

()

GetBoundingBox

ฟังก์ชันนี้ส่งคืนคำอธิบายของระดับที่มีลูกทั้งหมด BasePart ภายใน Modelทิศทางของระดับเสียงขึ้นอยู่กับทิศทางของ PrimaryPart และตรงกับกล่องเลือกที่เรนเดอร์ใน Studio เมื่อเลือกโมเดลการสะท้อนพฤติกรรมของ Terrain:FillBlock() มันจะส่งคืน CFrame ที่แทนที่ศูนย์กลางของกล่องผูกและ Vector3 ที่แทนที่ขนาดของมัน

หากไม่มี PrimaryPart สำหรับโมเดล กล่องผูกจะถูกจัดให้สอดคล้องกับแกนโลก


local Workspace = game:GetService("Workspace")
local model = Workspace.Model
local part = Workspace.Part
local orientation, size = model:GetBoundingBox()
-- ปรับขนาดและตำแหน่งส่วนให้เท่ากับกล่องจับขอบของโมเดล
part.Size = size
part.CFrame = orientation

ส่งค่ากลับ

A CFrame ที่แทนที่ทิศทางของระดับเสียงตามด้วย A Vector3 ที่แทนที่ขนาดของระดับเสียง

GetExtentsSize

คืนขนาดของกล่องผูกขั้นต่ำที่มีทั้งหมดของ BaseParts ใน Modelหาก Model.PrimaryPart มีอยู่แล้วกล่องผูกจะถูกจัดให้สอดคล้องกับส่วนนั้นหากส่วนหลักยังไม่ได้ตั้งค่าไว้ ฟังก์ชันจะเลือกส่วนในโมเดลเพื่อจัดเรียงกล่องผูกไว้เนื่องจากการเลือกส่วนนี้ไม่ได้เป็นการตัดสินใจที่เฉพาะเจาะจงจึงแนะนำให้ตั้ง Model.PrimaryPart เพื่อให้ได้ผลลัพธ์ที่สอดคล้องกับฟังก์ชันนี้

โปรดทราบว่าฟังก์ชันนี้จะคืนขนาดของกล่องจับคู่เล็กที่สุดเท่านั้น และนักพัฒนาต้องใช้วิธีการของตนเองเพื่อรับตำแหน่งของกล่องจับคู่


ส่งค่ากลับ

ขนาดส่วนขยาย Vector3 ของ Model

ตัวอย่างโค้ด

The code sample below demonstrates how Model.GetExtentsSize can be used to get the size of the bounding box containing the parts.

Model GetExtentsSize

local model = Instance.new("Model")
model.Parent = workspace
local RNG = Random.new()
for _ = 1, 5 do
local part = Instance.new("Part")
part.Anchored = true
part.Size = Vector3.new(RNG:NextNumber(0.05, 5), RNG:NextNumber(0.05, 5), RNG:NextNumber(0.05, 5))
part.Parent = model
end
print(model:GetExtentsSize())

GetPersistentPlayers

Instances

เมื่อวิธีนี้ถูกเรียกจาก Script จะส่งคืนวัตถุทั้งหมด Player ที่โมเดลนี้ยังคงอยู่เมื่อเรียกจาก LocalScript วิธีนี้จะตรวจสอบเฉพาะว่าโมเดลนี้ยังคงอยู่สำหรับ LocalPlayer


ส่งค่ากลับ

Instances

ตารางที่มีวัตถุทั้งหมด Player ที่วัตถุรูปแบบนี้จะยังคงอยู่

GetScale

โมเดลมีตัวเลขระดับความเทียบเท่าถาวรที่เริ่มต้นที่ 1 สำหรับโมเดลที่สร้างขึ้นใหม่และเปลี่ยนตามที่โมเดลถูกขยายโดยการเรียก Model/ScaleToฟังก์ชันนี้จะคืนตัวเลขสเกลปัจจุบันของรูปแบบ

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

ภายในเซสชั่นที่กำหนด โมเดลจะบันทึกข้อมูลขนาดเดิมที่แม่นยําของตัวแทนลูกหลานหลังจากการโทรครั้งแรก Model/ScaleToซึ่งหมายความว่าการโทร ScaleTo(x) ตามด้วย ScaleTo(1) จะทำให้คุณกลับไปที่ การกำหนดค่าเดิมของโมเดลโดยไม่มีการลอยตัวจุดทศนิยมการหลีกเลี่ยงการลอยตัวของจุดทศนิยมเป็นแรงจูงใจสําหรับการมีฟังก์ชัน Scale ไปยัง แทนฟังก์ชัน Scale โดย ฟังก์ชัน

ตัวคูณเครื่องยนต์มีผลต่อพฤติกรรมของเครื่องยนต์ในทางหนึ่ง: ตัวคูณของโมเดลจะถูกนำไปใช้กับการชดเชยข้อผิดพลาดของ animations ที่เล่นบน AnimationController ภายใต้โมเดลนั้น เพื่อให้แอนิเมชั่นเคลื่อนไหวอย่างถูกต้องแม้ว่าจะถูกขยายก็ตาม


ส่งค่ากลับ

ตัวเลขสเกลปัจจุบันของโมเดล

ตัวอย่างโค้ด

This code sample demonstrates substituting in a replacement for all the copies of a tree model using PivotTo and ScaleTo. The pivot and scale of the models are used as a reference ensuring that the relative sizes and locations of the replacement models match those of the originals.

Substituting in a replacement model using PivotTo and ScaleTo

local CollectionService = game:GetService("CollectionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Find all the models with the tag we want to replace
local items = CollectionService:GetTagged("Tree")
local newModel = ReplicatedStorage.FancyTreeReplacementModel
for _, item in items do
-- Make the new item and scale / position it where the old one was
local newItem = newModel:Clone()
newItem:ScaleTo(item:GetScale())
newItem:PivotTo(item:GetPivot())
-- Add the same tag to the replacement
CollectionService:AddTag(newItem, "Tree")
-- Delete the old item and parent the new one
newItem.Parent = item.Parent
item:Destroy()
end

MoveTo

()

ย้าย PrimaryPart ไปยังตำแหน่งที่กำหนดหากไม่ได้ระบุส่วนหลัก ส่วนรากของโมเดลจะถูกใช้ แต่ส่วนรากไม่ได้เป็นการตัดสินใจและขอแนะนำให้คุณตั้งส่วนหลักเสมอเมื่อใช้ MoveTo()

หากมีอุปสรรคใด ๆ ที่โมเดลจะต้องย้าย เช่น Terrain หรืออื่น ๆ BaseParts โมเดลจะถูกย้ายขึ้นไปในแนวตั้งจนกว่าจะไม่มีอะไรขวางทางหากพฤติกรรมนี้ไม่ต้องการ PVInstance:PivotTo() ควรใช้แทน

โปรดทราบว่าการหมุนจะไม่ถูกเก็บไว้เมื่อย้ายโมเดลด้วย MoveTo()ขอแนะนำให้ใช้ TranslateBy() หรือ PVInstance:PivotTo() หากต้องการรักษาการหมุนปัจจุบันของโมเดล

พารามิเตอร์

position: Vector3

The Vector3 ที่ Model ถูกย้ายไป

ค่าเริ่มต้น: ""

ส่งค่ากลับ

()

ตัวอย่างโค้ด

This sample demonstrates how Model:MoveTo avoids collisions.

A simple two part Model is created, and its PrimaryPart is set. An large obstruction part is placed next to it.

After 5 seconds Model:MoveTo is used to direct the model to move inside the obstruction part. However, as MoveTo will not move a model inside of an obstruction the Model is moved up on the Y axis and placed above the obstruction.

Model MoveTo

local START_POSITION = Vector3.new(-20, 10, 0)
local END_POSITION = Vector3.new(0, 10, 0)
local model = Instance.new("Model")
model.Parent = workspace
local part1 = Instance.new("Part")
part1.Size = Vector3.new(4, 4, 4)
part1.Position = START_POSITION
part1.Anchored = true
part1.BrickColor = BrickColor.new("Bright yellow")
part1.Parent = model
local part2 = Instance.new("Part")
part2.Size = Vector3.new(2, 2, 2)
part2.Position = START_POSITION + Vector3.new(0, 3, 0)
part2.Anchored = true
part2.BrickColor = BrickColor.new("Bright blue")
part2.Parent = model
model.PrimaryPart = part1
model.Parent = workspace
local obstruction = Instance.new("Part")
obstruction.Name = "Obstruction"
obstruction.Size = Vector3.new(10, 10, 10)
obstruction.Position = Vector3.new(0, 10, 0)
obstruction.Anchored = true
obstruction.BrickColor = BrickColor.new("Bright green")
obstruction.Parent = workspace
task.wait(3)
model:MoveTo(END_POSITION)

RemovePersistentPlayer

()

พารามิเตอร์

playerInstance: Player
ค่าเริ่มต้น: "nil"

ส่งค่ากลับ

()

ScaleTo

()

โมเดลมีตัวเลขระดับความเทียบเท่าถาวรที่เริ่มต้นที่ 1 สำหรับโมเดลที่สร้างขึ้นใหม่ฟังก์ชันนี้ปรับขนาดโมเดลรอบตำแหน่งหมุน เมื่อเทียบกับวิธีที่จะมองหาปัจจัยสเกล 1 เท่าเพื่อที่จะบรรลุเป้าหมายนี้มันทำสองสิ่ง:

  • ตั้งตัวเลขสเกลปัจจุบันของโมเดลเป็นค่าที่กำหนด
  • ปรับขนาดและตำแหน่งของตัวละเอียดทั้งหมดตามลำดับตามลำดับ

การขยายตำแหน่งทำรอบตำแหน่งหมุนศูนย์กลาง

คุณสมบัติ "ทรงเรขาคณิต" ทั้งหมดของตัวละครสืบทอดจะถูกปรับขนาดซึ่งชัดเจนว่ารวมถึงขนาดของชิ้นส่วน แต่นี่คือตัวอย่างบางส่วนของคุณสมบัติที่สเกลล์:

  • ความยาวของข้อต่อเช่น WeldConstraints และ Class.Rope|Ropes
  • ความเร็วและแรงทางกายภาพเช่น Hinge.MaxServoTorque
  • คุณสมบัติทางสายตาเช่นขนาดของตัวปล่อยอนุภาค
  • คุณสมบัติความยาวอื่นๆ เช่น Sound.RollOffMinDistance

พารามิเตอร์

newScaleFactor: number
ค่าเริ่มต้น: ""

ส่งค่ากลับ

()

TranslateBy

()

เปลี่ยน Model โดยออฟเซ็ตที่กำหนด Vector3 เพื่อรักษาการจัดตำแหน่งของรูปแบบหากอีก BasePart หรือ Terrain มีอยู่แล้วในตำแหน่งใหม่แล้ว ตัว Model จะซ้อนบนวัตถุที่กล่าวถึง

การแปลถูกใช้ในพื้นที่โลกแทนที่จะเป็นพื้นที่วัตถุ ซึ่งหมายความว่าแม้ว่าส่วนต่างๆ ของโมเดลจะมีทิศทางแตกต่างกันก็ตาม ก็ยังคงเคลื่อนไปตามแกนมาตรฐาน

พารามิเตอร์

delta: Vector3

The Vector3 เพื่อแปล Model โดย

ค่าเริ่มต้น: ""

ส่งค่ากลับ

()

ตัวอย่างโค้ด

This sample demonstrates how Model:TranslateBy ignores collisions and respects the orientation of the model.

A simple two part Model is created, rotated 45 degrees on the Y axis, and its PrimaryPart is set. An large obstruction part is placed next to it.

After 5 seconds Model:TranslateBy is used to direct the model to move inside the obstruction part. The model will move inside of the obstruction and maintain it's current orientation.

Model TranslateBy

local START_POSITION = Vector3.new(-20, 10, 0)
local END_POSITION = Vector3.new(0, 10, 0)
local model = Instance.new("Model")
local part1 = Instance.new("Part")
part1.Size = Vector3.new(4, 4, 4)
part1.CFrame = CFrame.new(START_POSITION) * CFrame.Angles(0, math.rad(45), 0)
part1.Anchored = true
part1.BrickColor = BrickColor.new("Bright yellow")
part1.Parent = model
local part2 = Instance.new("Part")
part2.Size = Vector3.new(2, 2, 2)
part2.CFrame = part1.CFrame * CFrame.new(0, 3, 0)
part2.Anchored = true
part2.BrickColor = BrickColor.new("Bright blue")
part2.Parent = model
model.PrimaryPart = part1
model.Parent = workspace
local obstruction = Instance.new("Part")
obstruction.Name = "Obstruction"
obstruction.Size = Vector3.new(10, 10, 10)
obstruction.Position = Vector3.new(0, 10, 0)
obstruction.Transparency = 0.5
obstruction.Anchored = true
obstruction.BrickColor = BrickColor.new("Bright green")
obstruction.Parent = workspace
task.wait(3)
-- use TranslateBy to shift the model into the obstruction
model:TranslateBy(END_POSITION - START_POSITION)

อีเวนต์