Model
*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.
Modeller konteyner nesneleridir, yani nesneleri bir araya getirirler.Koleksiyonları BaseParts tutmak için en iyi kullanılır ve işlevlerini genişleten bir dizi işlev vardır.
Modeller geometrik grupları temsil etmek üzere tasarlanmıştır.Grupmanızın geometrik bir yorumu yoksa, örneğin bir koleksiyon Scripts , bunun yerine bir Folder kullanın.
Bileşen parçalarının birleştirildiği modeller (böylece model hareket edebilir veya fiziğin simülasyonu aracılığıyla yok edilebilir) genellikle bir PrimaryPart ayarlasahiptir, çünkü model hareket ederken pivot ve sınır kutusunun hangi parçasını takip etedeceği belirtilir.Bir yerde kalan statik modeller, birincil bir parça ayarlasahip olmanın avantajından yararlanmaz.
Modeller, Roblox oyuncu karakterleri dahil olmak üzere geniş bir uygulama yelpazesine sahiptir.Ayrıca dikkate alınması gereken bir dizi benzersiz davranışları vardır:
- Bir Humanoid ve bir Part adlı bir Baş bir model altında ebeveyn olunca, bir isim/sağlık GUI modelin üzerinde görünecektir; ayrıntılar için Karakter İsmi/Sağlık Görüntüsü bakın.
- Bir parçanın Y eksenindeki konumu Workspace.FallenPartsDestroyHeight değerine ulaşır ve bir Model içindeki son nesneyse, model de yok edilecektir.
- Workspace.StreamingEnabled doğru olarak ayarlanmış bir yerde kullanıldığında, ModelStreamingMode model ve herhangi bir alt modelinin müşterilere yansıtılması veya kaldırılmasıyla ilgili çeşitli davranışların değeri değişir.Ayrıca, LevelOfDetail değeri modelin görüntülenmesini etkiler.
Tüm Instance türleriyle olduğu gibi, bir ebeveynin Model bir müşteriye yansıtılması, tüm çocuklarının yansıtılacağını garanti etmez.Bu, özellikle bu örneklerin istemci üzerinde çalışan kod tarafından erişildiğinde önemlidir, örneğin bir LocalScript . ile değerleri kullanarak, ebeveyn model müşteride mevcut olduğunda tüm model ve tüm yerleştirmelerin mevcut olmasını sağlayabilir veya atomiklik istemediğinizde kullanabilirsiniz.
Kod Örnekleri
The following sample includes a basic function that takes a table of objects and parents them into a new Model, returning that Model.
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)
Özet
Özellikler
Aktif durum yayınıyla deneyimler için modeldeki ayrıntı seviyesini ayarlar.Sets the level of detail on the model for experiences with instance streaming enabled.
Instans yayını etkinleştirildiğinde model yayın davranışını Models kontrol eder.
Birincil parçası Model , veya nil eğer açıkça ayarla.
Modelin etrafındaki pivot etrafında ölçeklendirilmesi için yalnızca editör tarafından kullanılan özellik. Bu özelliği ayarlamak, ölçeğin sanki Model/ScaleTo çağrılmış gibi hareket edeceğini değiştirecektir.
Hangi noktada bir Model döndürme noktasının bulunduğunu belirler bulunmuyor ve bunun bir set Model.PrimaryPart içerdiği yer.
Yöntemler
Bu modeli belirtilen oyuncu için kalıcı olarak ayarlar.Model.ModelStreamingMode davranışın ek sonucu olarak değiştirilmesi için değiştirilmesi gereken davranış PersistentPerPlayer olarak ayarlanmalıdır.
Bir Model'in tüm parçalarını içeren bir hacmin açıklamasını döndürür.
'nin tümünü içeren en küçük sınırlayıcı kutunun boyutunu döndürür, eğer ayarlanırsa ile uyumlu olur.
Bu model nesnesi için kalıcı olan tüm Player nesnelerini döndürür.Davranış, bu yöntemin bir Script veya bir LocalScript 'dan çağrılıp çağrılmadığına bağlı olarak değişir.
Yeni oluşturulan modeller için varsayılan 1'e döner ve Model/ScaleTo aracılığıyla ölçeklendirildiğinde değişecektir.
PrimaryPart ı verilen pozisyona taşır. Birincil bir parça belirtilmediyse, modelin kök parçası kullanılacaktır.
Bu modeli belirtilen oyuncu için artık kalıcı olmayan yapar.Model.ModelStreamingMode davranışın kaldırılmasının sonucunda değiştirilmesi için değiştirilmesi gereken davranış için KalıcıOyuncu olarak ayarlanmalıdır.
Modelin ölçek faktörünü ayarlar, böylece tüm alt örneklerin boyutlandırma ve konumunu ayarlar ve ölçek faktörü 1 olduğunda ilk boyutları ve konumları ile ilgili bu ölçek faktörüne sahip olurlar.
Verilen Model ofsetiyle bir Vector3 değiştirir, modelin yönünü koruyarak.Yeni pozisyonda zaten başka bir BasePart veya Terrain varsa, Model o nesneyi üzerine geçecektir.
Bir PVInstance 'nin merkezini alır.
Dönüştürür PVInstance tüm altındaki PVInstances ile birlikte pivotun şimdi belirtilen CFrame 'de yer aldığını, böylece dönüşüm aşağıdaki gibi gerçekleşir:
Özellikler
LevelOfDetail
Yayın akışı etkinleştirilmiş deneyimler için modeldeki ayrıntı seviyesini ayarlar.
StreamingMesh olarak ayarlanırken, daha düşük çözünürlüklü bir "imposter" meshesi (modelin tüm çocuk parçalarını sarıp sarmalayan renkli, kaba bir meshes) yayın yayınının dışında görüntülenir.
Disabled veya Automatic olarak ayarlanırsa, daha düşük çözünürlüklü meshlar görüntülenmez.
ModelStreamingMode
Instans yayınlandığında ve çıktığında nasıl kontrol edileceğini kontrol eder örnek yayınlanırken.Davranış seçilen enuma bağlıdır.Yayın etme etkinleştirilmediğinde etkisi yoktur.
Bu özellik, yayın etme etkinleştirildiğinde sadece Studio'nun Özellikler penceresi aracılığıyla değiştirilmelidir, ya da Scripts , ancak asla LocalScripts (bunu yapmak, belirsiz davranışa neden olabilir) değiştirilmelidir.
PrimaryPart
Model 'nin birincil kısmına işaret eder.Birincil parça, modelin merkezi için fiziksel referans olarak hareket eden BasePart parçasıdır.Yani, model içindeki parçalar fiziksel simülasyon veya diğer yollardan dolayı hareket ettirildiğinde, eksen ana parça ile aynı anda hareket edecektir.
Unutmayın ki Models varsayılan olarak PrimaryPart ayarlanmıyor.Fiziğin üzerinde hareket edilmesi gereken bir model oluşturuyorsanız, bu özelliği Studio'da veya bir senaryo içinde manuel olarak ayarlamanız gerekir.Birincil parça değil ayarlanırsa, pivot dünya uzayındaki aynı konumda kalacaktır, model içindeki parçalar hareket ederse bile.
Ayrıca, bu özelliği ayarlarken, modelin bir altının olması gerektiğini unutmayın BasePart.Eğer modelin bir altını olarak ayarlamaya çalışırsanız, bu bir modelin soyundan olmayan bir parçaya ayarlanacaktır, ancak bir sonraki simülasyon adımı sırasında sıfırlanacaktır - bu, modelden geçici olarak ana parçayı bir olarak ayarlayabileceğini varsayan senaryoları desteklemek için miras davranışıdır.
Model için genel kural şudur:
- Parçalarının fiziksel bağlantılar aracılığıyla birleştirildiği modeller, WeldConstraints veya Motor6Ds gibi fiziksel bağlantılar aracılığıyla birincil bir parçaya atanmalıdır.Örneğin, Roblox karakter modellerinin varsayılan olarak Model.PrimaryPart seti, HumanoidRootPart 'a ayarlanır.
- Bir senaryo onları açıkça hareket ettirmediği sürece, bir yerde kalan statik (genellikle Anchored ) modeller bir Model.PrimaryPart gerektirmez ve bir ayarlasahip olmanın faydasından yararlanmaz.
Kod Örnekleri
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.
-- 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
Bu özelliği özellikler penceresine ayarlamak, modelin üzerinde Model/ScaleTo çağrılmış gibi görünecek ve modelin tüm alt Instanslarını ölçeklendirecek, böylece modelin orijinal boyutuyla ilgili belirtilen ölçek faktörüne sahip olacak.
Bu özellik yalnızca Stüdyo'da mevcuttur ve bir Script veya LocalScript içinde kullanılırsa bir hata atacaktır.Model/ScaleTo ve Model/GetScale kodlardan kullanılmalıdır.
WorldPivot
Bu özellik, yapmadığı için bir eksenin nerede bulunduğunu belirler çünkü set var.Eğer yaparsa , ın merkezi, bunun birincil parçanın merkezine eşit olur ve bu özelliği göz ardı edilir.
Yeni oluşturulan bir Model için, merkezi, içeriğin sınır kutusunun merkezi olarak ele alınacaktır, ilk kez onun Model.WorldPivot ayarlanana kadar.Dünya merkezi ilk kez ayarlanırken, bu başlangıç davranışını geri yüklemeniz imkansızdır.
En yaygın olarak, modeli Studio araçlarıyla veya PVInstance:PivotTo() ve Model:MoveTo() gibi model hareket işlevleriyle taşımak, dünya merkezini ayarlayacak ve bu yeni model davranışını bitirecektir.
Bu davranışın amacı, Luau kodunun yeni bir model oluşturarak ve ona ebeveynlik yaparak basitçe mantıklı bir dönüşüm elde etmesine izin vermek, kodda her seferinde bir model oluşturmanın gereksinimini açıkça belirtmek zorunda kalmaktan kaçınmaktır.
local Workspace = game:GetService("Workspace")local model = Instance.new("Model")Workspace.BluePart.Parent = modelWorkspace.RedPart.Parent = modelmodel.Parent = Workspaceprint(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"
Kod Örnekleri
This code sample shows a custom function for resetting the pivot of a model back to the center of that model's bounding box.
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)
Yöntemler
GetBoundingBox
Bu işlev, bir BasePart içinde tüm çocukların bulunduğu bir hacmin açıklamasını döndürür Model .Sesin yönü, PrimaryPart 'in yönüne dayanmaktadır ve model seçildiğinde Studio'da görüntülenen seçim kutusuyla eşleşir.Terrain:FillBlock() davranışını yansıtarak, o bağlı kutunun merkezini temsil eden bir CFrame ve boyutunu temsil eden bir Vector3 geri döndürür.
Model için PrimaryPart yoksa, sınır kutusu dünya eksenlerine uyacaktır.
local Workspace = game:GetService("Workspace")local model = Workspace.Modellocal part = Workspace.Partlocal orientation, size = model:GetBoundingBox()-- Modelin sınır kutusuna eşit yeniden boyutlandır ve konumlandır parçasıpart.Size = sizepart.CFrame = orientation
Dönüşler
Hacmin yönünü temsil eden bir ve hacmin boyutunu temsil eden bir daha sonra hacmin yönünü temsil eden bir .
GetExtentsSize
BaseParts 'nin tümünü içeren en küçük sınırlayıcı kutunun boyutunu döndürür Model .Eğer Model.PrimaryPart varsa, sınır kutusu o parçaya uyarlanacaktır.Birincil bir parça belirlenmediyse, işlev sınır kutusunu uyumlandırmak için modelde bir parça seçecektir.Bu parçanın seçimi deterministik olmadığından, bu işlevle tutarlı sonuçlar almak için bir Model.PrimaryPart ayarlanması önerilir.
Bu işlevin sadece en küçük sınır kutusunun boyutunu döndürdüğünü ve geliştiricinin sınır kutusunun konumunu elde etmek için kendi yöntemini kullanması gerektiğini unutmayın.
Dönüşler
Kod Örnekleri
The code sample below demonstrates how Model.GetExtentsSize can be used to get the size of the bounding box containing the parts.
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
Bu yöntem bir Script 'den çağrıldığında, bu model için kalıcı olan tüm Player nesneleri döndürür.Bir LocalScript 'den çağrıldığında, bu yöntem yalnızca bu modelin LocalPlayer için kalıcı olup olmadığını kontrol eder.
Dönüşler
Bu model nesnesi için kalıcı olan tüm Player nesneleri içeren bir tablo.
GetScale
Modeller kalıcı bir kanonik ölçek faktörü içerir, bu da yeni oluşturulan modeller için 1'de başlar ve model ölçeklendirildiğinde değişir Model/ScaleTo .Bu işlev, modelin mevcut kanonik ölçek faktörünü döndürür.
Mevcut ölçek faktörü doğrudan model altındaki Instanların boyutunu etkilemez.Modelin orijinal boyutuna kıyasla nasıl ölçeklendirildiğini hatırlamak için içerik yazma ve kodlama amaçları için kullanılır.
Verilen bir oturum içinde, model, ilk Model/ScaleTo çağrıdan sonra mirasçı İnstanslarının kesin orijinal boyut bilgilerini önbelleğe alacaktır.Bu, ScaleTo(x) 'yi aramanın ScaleTo(1) ardından modelin orijinal yapılandırmasını düzgün bir şekilde geri alacağınız anlamına gelir, yüzde dalgalanma olmadan.Yüzde kaybından kaçınmak, bir Ölçek tarafından bir Ölçek işlevi yerine bir Ölçek işlevine sahip olmanın motivasyonudur.
Ölçek faktörü motor davranışını bir şekilde etkiler: Bir modelin ölçek faktörü, bu modelin altında yer alan animasyonların animasyonlarını doğru bir şekilde geri oynatacak, böylece animasyonları ölçeklendirilmiş olsa bile.
Dönüşler
Modelin mevcut kanonik ölçek faktörü.
Kod Örnekleri
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.
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 'yi verilen pozisyona taşır.Birincil bir parça belirtilmediyse, modelin kök parçası kullanılacak, ancak kök parça deterministik değildir ve MoveTo() kullanırken daima birincil bir parça ayarlamanız önerilir.
Modelin taşınması gereken herhangi bir engel varsa, örneğin Terrain veya diğer BaseParts , model yolun üzerinde hiçbir şey olana kadar yukarı doğru taşınacaktır.Bu davranış istemiyorsanız, PVInstance:PivotTo() yerine kullanılmalıdır.
Not: Rotasyon, MoveTo() ile bir modeli hareket ettirirken korunmaz.Modelin mevcut dönüşü korunması gerekiyorsa, TranslateBy() veya PVInstance:PivotTo() kullanılması önerilir.
Parametreler
Dönüşler
Kod Örnekleri
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.
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)
ScaleTo
Modellerde kalıcı bir kanonik ölçek faktörü bulunur, yeni oluşturulan modellerde 1'de başlar.Bu işlev, modeli, pivot konumuna göre, 1 ölçek faktörüyle nasıl görüneceğine göre ölçeklendirir.Bunu başarmak için iki şey yapar:
- Modelin mevcut ölçek faktörünü belirtilen değere ayarlar
- Bütün alt örnekleri uygun şekilde yeniden boyutlandırır ve konumlandırır
Konumların ölçeklendirilmesi pivot konum etrafında yapılır.
Mirasçı Instanstan gelen tüm "geometrik" özellikler ölçeklenecektir.Bu açıkça parça boyutlarını içerir, ancak burada ölçeklendirilen bazı diğer özellik örnekleri var:
- WeldConstraints ve Class.Rope|Ropes gibi eklemlerin uzunluğu
- Fiziksel hızlar ve kuvvetler Hinge.MaxServoTorque gibi
- Parçacık verici boyutları gibi görsel özellikler
- Sound.RollOffMinDistance gibi diğer uzunluk özellikleri
Parametreler
Dönüşler
TranslateBy
Verilen Model ofsetiyle bir Vector3 değiştirir, modelin yönünü koruyarak.Yeni pozisyonda zaten başka bir BasePart veya Terrain varsa, Model o nesneyi üzerine geçecektir.
Tercüme, nesne alanı yerine dünya uzayında uygulanır, yani modelün parçaları farklı yönlendirilmiş olsa bile hala standart eksende hareket edecektir.
Parametreler
Dönüşler
Kod Örnekleri
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.
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)