BasePart
*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.
BasePart ist eine abstrakte Basiskl
For information on how BaseParts are grouped into simulated rigid bodies, see Assemblies .
Es gibt viele verschiedene Objekte, die mit BasePart (einschließlich Terrain interagieren, einschließlich:
- Mehrere BaseParts können innerhalb eines Model gruppiert werden und gleichzeitig mit PVInstance:PivotTo() bewegt werden. Siehe 1>Modelle1>.
- Class.附|Accessories können zu einem BasePart hinzugefügt werden, um CFrames in der Beziehung auf das Teil zu spezifizieren. Dies wird oft von physischen 0> Class.Constraints0> -Objekten verwendet, wie in Attachments3> und
- ParticleEmitter Objekte emittieren Partikel in gleichmäßigem Volumen der BasePart zu der sie zuordnen. Siehe Partikel-Emitter.
- Leichte Objekte wie PointLight emittieren Licht aus der Mitte eines BasePart wie in Lichtquellen beschrieben.
Zusammenfassung
Eigenschaften
Bestimmt, ob ein Teil auf physikalische Weise unbewegbar ist.
Die angelicale Geschwindigkeit der Montagemaschine.
Die Mitte der Masse der Montagemaschine im Platz.
Die lineare Geschwindigkeit der Montagemaschine.
Die Gesamtmenge der Montagemaschine.
Eine Verweis auf den Wurzelteil der Konfiguration.
Bestimmt die Art der Oberfläche für die Rückseite eines Teils (+Z-Richtung).
Bestimmt die Art der Oberfläche für das Untergesicht eines Teils (-Y-Richtung).
Bestimmt die Farbe eines Teils.
Bestimmt die Position und Ausrichtung der BasePart in der Welt.
Bestimmt, ob ein Teil mit anderen Teilen kollidieren kann.
Bestimmt, ob das Teil während der räumlichen Anfrage-Operationen betrachtet wird.
Bestimmt, ob Touched und TouchEnded Ereignisse auf der Teil abgefeuert werden.
Bestimmt, ob ein Teil einen Schatten wirft oder nicht.
Beschreibt die Weltposition, in der sich der Zentrum eines Teils befindet.
Beschreibt die Name einer Gruppe.
Bestimmt die Farbe eines Teils.
Zeigt die aktuellen physischen Eigenschaften des Teils an.
Bestimmt mehrere physikalische Eigenschaften eines Teils.
Wird verwendet, um aerodynamische Kräfte auf Teile und Montagen zu aktivieren oder zu deaktivieren.
Die tatsächliche physische Größe des BasePart als von der Physik-Engine betrachtet.
Bestimmt die Art der Oberfläche für die Vorderseite eines Teils (-Z-Richtung).
Bestimmt die Art der Oberfläche für die linke Seite eines Teils (-X-Richtung).
Bestimmt einen Multiplikator für BasePart.Transparency, der nur für den lokalen Client sichtbar ist.
Bestimmt, ob ein Teil in Studio auswählbar ist.
Beschreibt die Masse der Teil, das Produkt seiner Dichte und Volumen.
Bestimmt, ob der Teil zur Gesamtmenge oder zur Inaktivität seines Festen Körpers beiträgt.
Bestimmt die Textur und die Standard- physischen Eigenschaften eines Teils.
Der Name von MaterialVariant .
Beschreibt dieRotation der Teil in der Welt.
Gibt den Versatz des Teils von seinem CFrame .
Beschreibt die Position der Teil in der Welt.
Zeit seit dem letzten aufgezeichneten Physik-Update.
Bestimmt, wie viel ein Teil den Himmelskasten widerspiegelt.
Beschreibt die kleinste Größenänderung, die durch die Größenanpassungsmethode erlaubt ist.
Beschreibt die Gesichter, auf denen ein Teil skaliert werden kann.
Bestimmt die Art der Oberfläche für die rechte Seite eines Teils (+X-Richtung).
Die Hauptregel bei der Bestimmung des Hauptteils einer Konfiguration.
DieRotation der Teil in Grad für die drei Achsen.
Bestimmt die Dimensionen eines Teils (Länge, Breite, Höhe).
Bestimmt die Oberflächenart für die obere Gesichtseite eines Teils (+ Y-Richtung).
Bestimmt, wie viel ein Teil durch (den Umkehrwert der Teil-Opakez) gesehen werden kann.
Methoden
Wenden Sie einen angulären Impuls auf die Montagemaschine an.
Apply an impulse to the assembly at theAssembly's center of mass .
Geben Sie einem Montageimpuls die erforderliche Position.
Gibt zurück, ob die Teile miteinander kollidieren können.
Überprüft, ob du das Netzwerkbesitz einer Teil so einstellen kannst, dass es sich.
Gibt eine Tabelle von Teilen zurück, die mit dem Objekt durch eine beliebige Art von Verbindungverbunden sind.
Kehre alle Joints oder Einschränkungen zurück, die mit dieser Teil verbunden sind.
Kehrt den Wert der Mass Eigenschaftenzurück.
Gibt den aktuellen Spieler zurück, der der Netzwerk-Eigentümer dieses Teils ist, oder null in Falle des Servers.
Kehrt wahr zurück, wenn die Spielmaschine die Netzwerkbesitzer automatisch für diesen Teil festgelegt hat.
Rückgibt die Basis eines Teile montierens.
Gibt eine Tabelle zurück, in der alle BasePart.CanCollide wahren Teile, die mit dieser Teil intersect.
Gibt die lineare Geschwindigkeit der Montage des Teils an der angegebenen Position in Bezug auf diesen Teil zurück.
Gibt zurück, wenn das Objekt mit einem Teil verbunden ist, das es an Ort hält (z. B. eine Anchored Part), oder anders zurückgegeben wird.
Ändert die Größe eines Objekts genau wie mit dem Tool.
Setzt den angegebenen Spieler als Netzwerk-Eigentümer für dies und alle verbundenen Teile.
Lässt die SpielEngine dynamisch entscheiden, wer die Physik der Teile (eines der Clients oder des Servers) verantwortet.
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Erstellt eine neue IntersectOperation von der überlappenden Geometrie des Teils und den anderen Teilen in der angegebenen Array.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Erstellt einen neuen UnionOperation von der Abteilung, minus die Geometrie, die von den Teilen in der angegebenen Arraybesetzt ist.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Erstellt einen neuen UnionOperation von der Teil, plus die Geometrie, die von den Teilen in der angegebenen Arraybelegt ist.
Erhalten Sie die Ausrichtung einer PVInstance.
Transformiert die PVInstance zusammen mit all ihren Nachkommen PVInstances, wodurch der Pivot jetzt an der angegebenen CFrame liegt.
Ereignisse
Feuert ab, wenn ein Teil aufgrund einer physischen Bewegung ein anderes Teil berührt.
Feuert ab, wenn ein Teil eine andere Teil berührt als Ergebnis einer physischen Bewegung.
Eigenschaften
Anchored
Die verankerte Eigenschaft bestimmt, ob ein Teil auf physikalische Weise unbewegbar ist. Wenn es aktiviert ist, wird ein Teil niemals aufgrund der Schwerkraft, anderer Teilkollisionen, überlappende andere Teile oder jeder anderen physikalischen verwandten Ursachen positioniert. Ergebniswerden zwei verankerte Teile niemals das BasePart.Touched auf einander auslösen.
Ein verankertes Teil kann immer noch bewegt werden, indem seine CFrame oder Position geändert werden, und es kann immer noch eine nicht null AssemblyLinearVelocity und 1> Class.BasePart.AssemblyAngularVelocity|AssemblyLinearVelocity1> haben.
Schließlich, wenn ein unverankertes Teil mit einem verankerten Teil über ein Objekt wie ein Weld verbunden wird, wird es auch verankert. Wenn ein solches Zusammenbruch bricht, kann das Teil wieder von der Physik beeinträchtigt werden. Siehe Montagen für mehr Details.
Die Netzwerkbesitzung kann nicht auf verankerte Teile gesetzt werden. Wenn der Status eines Teils auf dem Server ändert, wird sich die Netzwerkbesitzung dieses Teils ändern.
Code-Beispiele
local part = script.Parent
-- Create a ClickDetector so we can tell when the part is clicked
local cd = Instance.new("ClickDetector", part)
-- This function updates how the part looks based on its Anchored state
local function updateVisuals()
if part.Anchored then
-- When the part is anchored...
part.BrickColor = BrickColor.new("Bright red")
part.Material = Enum.Material.DiamondPlate
else
-- When the part is unanchored...
part.BrickColor = BrickColor.new("Bright yellow")
part.Material = Enum.Material.Wood
end
end
local function onToggle()
-- Toggle the anchored property
part.Anchored = not part.Anchored
-- Update visual state of the brick
updateVisuals()
end
-- Update, then start listening for clicks
updateVisuals()
cd.MouseClick:Connect(onToggle)
AssemblyAngularVelocity
Der Winkelgeschwindigkeitsvektor dieser Teile Montagemaschine. Es ist die Rate der Orientierung in Radians pro Sekunde.
Die Winkelgeschwindigkeit ist bei jedem Punkt der Montage gleich.
Die direkte Geschwindigkeit kann unrealistische Bewegungen führen. Die Verwendung von Torque oder AngularVelocity-Einschränkung ist bevorzugt, oder verwenden Sie BasePart:ApplyAngularImpulse(), wenn Sie sofortige Änderungen in der Geschwindigkeit möchten.
Wenn das Teil von einem Server besessen ist, muss diese Eigenschaft von einem Server Script (nicht von einem Class.LocalScript
AssemblyCenterOfMass
Eine Position berechnet über die mass und position von allen Teilen in der Montagemaschine.
Wenn die Montagemaschine einen verankerten Teil hat, wird der Zentrum der Masse der Montagemaschine das Zentrum der Masse des Montagemaschinen sein und die Montagemaschine wird eine unendliche Masse haben.
Das Wissen um die Mitte der Masse kann der Montage helfen, die Stabilität zu erhalten. Eine Kraft, die auf die Mitte der Masse angewendet wird, verursacht keine linke Beschleunigung, nur lineare. Eine Montage mit einer niedrigen Mitte der Masse wird eine bessere Zeit haben, unter dem Effekt der Schwerkraft zu bleiben.
AssemblyLinearVelocity
Der lineare GeschwindigkeitVector dieser Teilkonstruktion. Es ist die Rate der Positionänderung in der Position der Montagemaschine center of mass pro Sekunde.
Wenn Sie die Geschwindigkeit an einem Punkt außerhalb der Mitte der Montagemaschine wissen möchten, verwenden Sie BasePart:GetVelocityAtPosition().
Die Geschwindigkeit direkt einzustellen, kann zu unrealistischen Bewegungen führen. Wenn Sie ein VectorForce -KonSTRUMENT verwenden, oder verwenden Sie BasePart:ApplyImpulse(), wenn Sie sofortige Änderungen in der Geschwindigkeit möchten.
Wenn das Teil von einem Server besessen ist, muss diese Eigenschaft von einem Server Script (nicht von einem Class.LocalScript
AssemblyMass
Die Summe der Masse aller parts in diesem Teil der Montagemaschine. Teile, die Massless und nicht die Montagemaschinen-Wurzel sind, werden nicht zur Montagemasse beitragen.
Wenn die Montagemaschine eine verankerte Teil hat, wird die Montagemaschine-Masse als unendlich betrachtet. Einschränkungen und andere physikalische Interaktionen zwischen nicht verankerten Montagemaschinen mit einem großen Unterschied in der Masse können Instabilitäten verursachen.
AssemblyRootPart
Dieses Eigenschaft zeigt an, dass die BasePart automatisch ausgewählt wurde, um die Wurzel des Montages zu repräsentieren. Es ist die gleiche Teil, die zurückgegeben wird, wenn Entwickler GetRootPart() rufen.
Der Wurzelbereich kann geändert werden, indem der RootPriority der Teile in der Montagemaschine geändert wird.
Teile, die alle dieselbeAssemblyRootPart teilen, befinden sich in demselben Montage.
For more information on root parts, see Assemblies .
BackSurface
Die BackSurface-Eigenschaft bestimmt die Art der Oberfläche, die für die +Z-Richtung eines Teils verwendet wird. Wenn die Gesichter von zwei Teilen nebeneinander platziert werden, können sie eine gemeinsame Erfahrung zwischen ihnen erstellen. Wenn auf Motor gesetzt, bestimmt die BasePart.BackSurfaceInput , wie eine Motor-Joint funktionieren soll.
Die meisten Oberflächentypen rendern eine Textur auf der Teilseite, wenn der BasePart.Material auf Plastik eingestellt ist. Einige Oberflächentypen - Hinge, Motor und SteppingMotor - werden stattdessen eine 3D-Verzierung rendern. Wenn diese Eigenschaft in dem Eigenschaften-Fenster ausgewählt wird, wird sie im Spiel wie diejenige eines SurfaceSelection ausgewählt.
Code-Beispiele
local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end
BottomSurface
Die BottomSurface-Eigenschaft bestimmt die Art der Oberfläche, die für die -Y-Richtung eines Teils verwendet wird. Wenn die Gesichter von zwei Teilen nebeneinander platziert werden, können sie eine gemeinsame zwischen ihnen erstellen. Wenn auf Motor gesetzt, bestimmt die BasePart.BottomSurfaceInput , wie eine Motor-Joint zwischen ihnen funktionieren soll.
Die meisten Oberflächentypen rendern eine Textur auf der Teilseite, wenn der BasePart.Material auf Plastik eingestellt ist. Einige Oberflächentypen - Hinge, Motor und SteppingMotor - werden stattdessen eine 3D-Verzierung rendern. Wenn diese Eigenschaft in dem Eigenschaften-Fenster ausgewählt wird, wird sie im Spiel wie diejenige eines SurfaceSelection ausgewählt.
Code-Beispiele
local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end
BrickColor
Die Eigenschaft BrickColor bestimmt die Farbe eines Teils. Wenn der Teil eine BasePart.Material hat, bestimmt dies auch die verwendete Farbe, wenn die Texturrendert wird. Für mehr Kontrolle über die Farbe kann die Eigenschaft BasePart.Color verwendet werden (es ist eine Color3-Variante dieser Eigenschaften). Wenn Farbe festlegenist, verwendet diese Eigenschaft die nächste BrickColor.
Andere visuelle Eigenschaften eines Teils werden durch BasePart.Transparency und BasePart.Reflectance bestimmt.
Code-Beispiele
local part = script.Parent
-- Create a ClickDetector so we can tell when the part is clicked
local cd = Instance.new("ClickDetector", part)
-- This function updates how the part looks based on its Anchored state
local function updateVisuals()
if part.Anchored then
-- When the part is anchored...
part.BrickColor = BrickColor.new("Bright red")
part.Material = Enum.Material.DiamondPlate
else
-- When the part is unanchored...
part.BrickColor = BrickColor.new("Bright yellow")
part.Material = Enum.Material.Wood
end
end
local function onToggle()
-- Toggle the anchored property
part.Anchored = not part.Anchored
-- Update visual state of the brick
updateVisuals()
end
-- Update, then start listening for clicks
updateVisuals()
cd.MouseClick:Connect(onToggle)
CFrame
Die CFrame -Eigenschaft bestimmt sowohl die Position als auch die Ausrichtung des BasePart in der Welt. Sie fungiert als arbitrische Referenzposition auf der Geometrie, aber ExtentsCFrame repräsentiert das tatsächliche 2>Datatype.CFrame2> seiner physischen Mitte.
Wenn Sie CFrame auf einem Teil einstellen, werden andere verbundene Teile auch relativ zu dem Teil bewegt, aber es wird empfohlen, PVInstance:PivotTo() zu verwenden, um ein gesamtes Modell zu verschieben, z. B. wenn Sie einen Charakter eines Spieler:inteleportieren.
Anders als das Einstellen von BasePart.Position , wird das Einstellen von BasePart.CFrame immer das Teil zum genauen gegebenen CFrame bewegen; mit anderen Worten: 1> keine Überlapp-Kontrolle wird ausgeführt1> und der Physik-Solver wird versuchen, jede Überlapp zu be
Um Positionen in Bezug auf ein Teil의 CFrame zu verfolgen, kann ein Attachment nützlich sein.
Code-Beispiele
local part = script.Parent:WaitForChild("Part")
local otherPart = script.Parent:WaitForChild("OtherPart")
-- Reset the part's CFrame to (0, 0, 0) with no rotation.
-- This is sometimes called the "identity" CFrame
part.CFrame = CFrame.new()
-- Set to a specific position (X, Y, Z)
part.CFrame = CFrame.new(0, 25, 10)
-- Same as above, but use a Vector3 instead
local point = Vector3.new(0, 25, 10)
part.CFrame = CFrame.new(point)
-- Set the part's CFrame to be at one point, looking at another
local lookAtPoint = Vector3.new(0, 20, 15)
part.CFrame = CFrame.lookAt(point, lookAtPoint)
-- Rotate the part's CFrame by pi/2 radians on local X axis
part.CFrame = part.CFrame * CFrame.Angles(math.pi / 2, 0, 0)
-- Rotate the part's CFrame by 45 degrees on local Y axis
part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(45), 0)
-- Rotate the part's CFrame by 180 degrees on global Z axis (note the order!)
part.CFrame = CFrame.Angles(0, 0, math.pi) * part.CFrame -- Pi radians is equal to 180 degrees
-- Composing two CFrames is done using * (the multiplication operator)
part.CFrame = CFrame.new(2, 3, 4) * CFrame.new(4, 5, 6) --> equal to CFrame.new(6, 8, 10)
-- Unlike algebraic multiplication, CFrame composition is NOT communitative: a * b is not necessarily b * a!
-- Imagine * as an ORDERED series of actions. For example, the following lines produce different CFrames:
-- 1) Slide the part 5 units on X.
-- 2) Rotate the part 45 degrees around its Y axis.
part.CFrame = CFrame.new(5, 0, 0) * CFrame.Angles(0, math.rad(45), 0)
-- 1) Rotate the part 45 degrees around its Y axis.
-- 2) Slide the part 5 units on X.
part.CFrame = CFrame.Angles(0, math.rad(45), 0) * CFrame.new(5, 0, 0)
-- There is no "CFrame division", but instead simply "doing the inverse operation".
part.CFrame = CFrame.new(4, 5, 6) * CFrame.new(4, 5, 6):Inverse() --> is equal to CFrame.new(0, 0, 0)
part.CFrame = CFrame.Angles(0, 0, math.pi) * CFrame.Angles(0, 0, math.pi):Inverse() --> equal to CFrame.Angles(0, 0, 0)
-- Position a part relative to another (in this case, put our part on top of otherPart)
part.CFrame = otherPart.CFrame * CFrame.new(0, part.Size.Y / 2 + otherPart.Size.Y / 2, 0)
CanCollide
CanCollide bestimmt, ob ein Teil physisch mit anderen Teilen interagiert. Wenn es deaktiviert ist, können andere Teile durch die Ziegel unbeschadet passieren. Teile, die für Dekoration verwendet werden, haben normalerweise CanCollide deaktiviert, da sie nicht vom Physik-Engine betrachtet werden müssen.
Wenn ein Teil nicht BasePart.Anchored ist und CanCollide deaktiviert ist, kann es aus der Welt fallen, um schließlich durch Workspace.FallenPartsDestroyHeight zerstört zu werden.
Wenn CanCollide deaktiviert ist, können Teile immer noch das BasePart.Touched -Ereignis abfeuern (einschließlich der anderen Teile, die sie berühren). Sie können dies mit BasePart.CanTouch deaktivieren.
For more information on Collisions, see Kollisionen .
Code-Beispiele
-- Paste into a Script inside a tall part
local part = script.Parent
local OPEN_TIME = 1
-- Can the door be opened at the moment?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("Black")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("Bright blue")
end
local function onTouch(otherPart)
-- If the door was already open, do nothing
if debounce then
print("D")
return
end
-- Check if touched by a Humanoid
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("not human")
return
end
-- Perform the door opening sequence
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()
CanQuery
CanQuery bestimmt, ob die parte während raumbezogene Anfrage操作en wie GetPartBoundsInBox oder Raycast betrachtet wird. CanCollide muss auch deaktiviert sein, wenn 1> CanQuery1> und 4> CanCollide4>
Jenseits dieser Eigenschaftenist es auch möglich, Teile auszuschließen, die Nachkommen einer bestimmten Liste von Teilen sind, indem ein OverlapParams oder ein RaycastParams -Objekt verwendet wird, wenn die räumlichen Anfrage-Funktionen aufgerufen werden.
CanTouch
Dieses Eigenschaft bestimmt, ob Class.BasePart.Touched|Tou
Beachten Sie, dass diese Kollisionslogik über die EigenschaftenWorkspace.TouchesUseCollisionGroups auf die Einhaltung von true eingestellt werden kann. Wenn 1> true1>, ignorieren Teile in nicht kollidierenden Gruppen sowohl Kollisionen 4> und4> Touch-Ereignisse, wodurch diese Eigenschaft unnötig ist.
Leistung
Es gibt einen kleinen Leistungsgewinn auf Teile, die sowohl CanTouch und CanCollide auf 8 gesetzt sind, da diese Teile niemals Berechnungen für Teilekollisionen benötigen. Sie können jedoch immer noch von
CastShadow
Bestimmt, ob ein Teil einen Schatten wirft oder nicht.
Beachten Sie, dass diese Funktion nicht für die Leistungssteigerung entwickelt ist. Es sollte nur auf Teilen deaktiviert werden, auf denen Sie die Schatten, die die Teil castet, verbergen möchten. Die Deaktivierung dieser Eigenschaft für ein bestimmtes Teil kann visuelle Artefakte auf den Schatten casten auf diesem Teil verursachen.
CenterOfMass
Die Eigenschaft CenterOfMass beschreibt die lokale Position des Zentrums der Masse einer Teil. Wenn dies ein einzelnes Teil-Assembly ist, ist dies die AssemblyCenterOfMass -Umwandlung aus der Welt in die lokale. Auf einfachem Class.Part|Parts -Server ist der Zentrum der Masse immer (0,0,0). Es kann jedoch für Class
CollisionGroup
Die CollisionGroup -Eigenschaft beschreibt den Namen der Kollisionsgruppe der Teil (maximal 100 Zeichen). Teile beginnen mit der Standardgruppe, deren Name "Default" ist. Dieser Wert kann nicht leer sein.
Obwohl diese Eigenschaft selbst nicht repliziert ist, repliziert der Engine die Werte intern durch ein anderes private Eigenschaft, um Rückwärtss兼ibilitätsprobleme zu beheben.
Code-Beispiele
local PhysicsService = game:GetService("PhysicsService")
local collisionGroupBall = "CollisionGroupBall"
local collisionGroupDoor = "CollisionGroupDoor"
-- Register collision groups
PhysicsService:RegisterCollisionGroup(collisionGroupBall)
PhysicsService:RegisterCollisionGroup(collisionGroupDoor)
-- Assign parts to collision groups
script.Parent.BallPart.CollisionGroup = collisionGroupBall
script.Parent.DoorPart.CollisionGroup = collisionGroupDoor
-- Set groups as non-collidable with each other and check the result
PhysicsService:CollisionGroupSetCollidable(collisionGroupBall, collisionGroupDoor, false)
print(PhysicsService:CollisionGroupsAreCollidable(collisionGroupBall, collisionGroupDoor)) --> false
Color
Die Farbe-Eigenschaft bestimmt die Farbe eines Teils. Wenn der Teil eine BasePart.Material hat, bestimmt dies auch die verwendete Farbe, wenn die Texturrendert wird. Wenn diese Eigenschaft festlegenist, verwendet BasePart.BrickColor die nächste BrickColor zum Farb3-Wert.
Andere visuelle Eigenschaften eines Teils werden durch BasePart.Transparency und BasePart.Reflectance bestimmt.
Code-Beispiele
-- Paste into a Script within StarterCharacterScripts
-- Then play the game, and fiddle with your character's health
local char = script.Parent
local human = char.Humanoid
local colorHealthy = Color3.new(0.4, 1, 0.2)
local colorUnhealthy = Color3.new(1, 0.4, 0.2)
local function setColor(color)
for _, child in pairs(char:GetChildren()) do
if child:IsA("BasePart") then
child.Color = color
while child:FindFirstChildOfClass("Decal") do
child:FindFirstChildOfClass("Decal"):Destroy()
end
elseif child:IsA("Accessory") then
child.Handle.Color = color
local mesh = child.Handle:FindFirstChildOfClass("SpecialMesh")
if mesh then
mesh.TextureId = ""
end
elseif child:IsA("Shirt") or child:IsA("Pants") then
child:Destroy()
end
end
end
local function update()
local percentage = human.Health / human.MaxHealth
-- Create a color by tweening based on the percentage of your health
-- The color goes from colorHealthy (100%) ----- > colorUnhealthy (0%)
local color = Color3.new(
colorHealthy.R * percentage + colorUnhealthy.r * (1 - percentage),
colorHealthy.G * percentage + colorUnhealthy.g * (1 - percentage),
colorHealthy.B * percentage + colorUnhealthy.b * (1 - percentage)
)
setColor(color)
end
update()
human.HealthChanged:Connect(update)
CurrentPhysicalProperties
Die aktuellen physikalischen Eigenschaften der aktuellen physikalischen Eigenschaften der Teil. Sie können benutzerdefinierte Werte für die physikalischen Eigenschaften pro Teil, benutzerdefiniertes Material und überschreibenfestlegen. Die Engine priorisiert mehr granulare Definitionen, wenn sie die effektiven physikalischen Eigenschaften eines Teils bestimmen. Die Werte in der folgenden Liste sind in Ordnung von der höchsten bis der niedrigsten Priorität:
- Benutzerdefinierte physische Eigenschaften des Teils
- Benutzerdefinierte physische Eigenschaften des benutzerdefinierten Materials der Teil
- Benutzerdefinierte physische Eigenschaften des Materials von der Materialplatte überschreiben
- Standard- physische Eigenschaften des Materials des Teils
CustomPhysicalProperties
Mit "CustomPhysicalProperties" kannst du verschiedene physikalische Aspekte deines Part anpassen, wie seine Dichte, Friction und Elastizität.
Wenn aktiviert, ermöglicht dieses Eigenschaften konfigurieren dieser physischen Eigenschaften. Wenn deaktiviert, bestimmen diese physischen Eigenschaften das BasePart.Material der Teile. Die Seite für Enum.Material enthält eine Liste der verschiedenen Teilematerialien.
Code-Beispiele
local part = script.Parent
-- This will make the part light and bouncy!
local DENSITY = 0.3
local FRICTION = 0.1
local ELASTICITY = 1
local FRICTION_WEIGHT = 1
local ELASTICITY_WEIGHT = 1
local physProperties = PhysicalProperties.new(DENSITY, FRICTION, ELASTICITY, FRICTION_WEIGHT, ELASTICITY_WEIGHT)
part.CustomPhysicalProperties = physProperties
EnableFluidForces
Wenn wahr und wenn Workspace.FluidForces aktiviert ist, verursacht dies den Physik-Engine, auf dieser BasePart aerodynamische Kräfte zu berechnen.
ExtentsCFrame
Das CFrame der physischen Extents der BasePart, die sein physisches Zentrum repräsentiert.
ExtentsSize
Die tatsächliche physische Größe des BasePart als von der PhysikEngine betrachtete, z. B. in Kollisionserkennung .
FrontSurface
Die FrontSurface-Eigenschaft bestimmt die Art der Oberfläche, die für die -Z-Richtung eines Teils verwendet wird. Wenn die Gesichter von zwei Teilen nebeneinander platziert werden, können sie eine gemeinsame Erfahrung zwischen ihnen erstellen. Wenn auf Motor gesetzt, bestimmt die BasePart.FrontSurfaceInput , wie eine Motor-Joint funktionieren soll.
Die meisten Oberflächenrendern eine Textur auf der Teilseite, wenn das BasePart.Material auf Plastik eingestellt ist. Einige Oberflächenrendern, einschließlich Hinge, Motor und SteppingMotor, rendern stattdessen eine 3D-Verzierung. Wenn diese Eigenschaft in dem Eigenschaften-Fenster ausgewählt wird, wird sie im Spiel wie diejenige eines SurfaceSelection ausgewählt.
Code-Beispiele
local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end
LeftSurface
Die LeftSurface-Eigenschaft bestimmt die Art der Oberfläche, die für die -X-Richtung eines Teils verwendet wird. Wenn die Gesichter von zwei Teilen nebeneinander platziert werden, können sie eine gemeinsame Erfahrung zwischen ihnen erstellen. Wenn auf Motor gesetzt, bestimmt die BasePart.LeftSurfaceInput , wie eine Motor-Joint funktionieren soll.
Die meisten Oberflächenrendern eine Textur auf der Teilseite, wenn das BasePart.Material auf Plastik eingestellt ist. Einige Oberflächenrendern, einschließlich Hinge, Motor und SteppingMotor, rendern stattdessen eine 3D-Verzierung. Wenn diese Eigenschaft in dem Eigenschaften-Fenster ausgewählt wird, wird sie im Spiel wie diejenige eines SurfaceSelection ausgewählt.
Code-Beispiele
local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end
LocalTransparencyModifier
Die LocalTransparencyModifier-Eigenschaft ist ein Multiplikator für BasePart.Transparency, das nur für den lokalen Client sichtbar ist. Sie wird nicht vom Client auf Server repliziert und ist nützlich, wenn ein Teil nicht für einen bestimmten Client gerendert werden sollte, z. B. wenn der Spieler den Charakter ihres Körpers nicht sieht, wenn er in den First-Person-Modus zoomt.
Dieses Eigenschaft modifiziert die Lichtbarkeit der lokalen Teil durch die folgende Formel, wobei die resultierenden Werte zwischen 0 und 1 eingeklemmt sind.
clientTransparency = 1 - ((1 - part.Transparency) * (1 - part.LocalTransparencyModifier))
<tbody><tr><td>0.5</td><td>0</td><td>0.5</td><td>0.5</td></tr><tr><td>0.5</td><td>0.25</td><td>0.5</td><td>0,625</td></tr><tr><td>0.5</td><td>0.5</td><td>0.5</td><td>0.75</td></tr><tr><td>0.5</td><td>0.75</td><td>0.5</td><td>0.875</td></tr><tr><td>0.5</td><td>1</td><td>0.5</td><td>1</td></tr></tbody>
Transparenz | Lokale Transparenz-Modifier | Server-seitige Transparenz | Kunden-seitige Transparenz |
---|
Locked
Die Locked-Eigenschaft bestimmt, ob eine part (oder eine model in ihr enthalten ist) in Roblox Studio durch Klicken darauf ausgewählt werden kann. Diese Eigenschaft wird in der Regel für Teile innerhalb von Umgebungsmodellen aktiviert, die derzeit nicht bearbeitet werden. Roblox Studio hat ein Auswählen/Entsperren-Alle-
Code-Beispiele
-- Paste into a Script within a Model you want to unlock
local model = script.Parent
-- This function recurses through a model's heirarchy and unlocks
-- every part that it encounters.
local function recursiveUnlock(object)
if object:IsA("BasePart") then
object.Locked = false
end
-- Call the same function on the children of the object
-- The recursive process stops if an object has no children
for _, child in pairs(object:GetChildren()) do
recursiveUnlock(child)
end
end
recursiveUnlock(model)
Mass
Masse ist eine lesbare Eigenschaft, die die Produktmenge einer Teilemenge und -dichte beschreibt. Sie wird von der GetMass Funktion zurückgegeben.
- Die Dichte eines Teils wird durch seine Material oder CustomPhysicalProperties bestimmt, wenn angegeben.
Massless
Wenn diese Eigenschaft aktiviert ist, trägt die BasePart nicht zu der Gesamtmenge oder der Inaktivität seiner Montagemaschine bei, solange sie an einer anderen Montagemaschine mit Masse verbunden ist.
Wenn das Teil seine eigene Wurzel ist, gemäß AssemblyRootPart, wird dies für dieses Teil ignoriert, und es wird immer noch Masse und Inertie zu seiner Montage beitragen, wie ein normales Teil. Teile, die masslos sind, sollten niemals eine Montagewurzelteil sein, wenn alle anderen Teile in der Montage nicht masslos sind.
Dies könnte für Dinge nützlich sein, wie optionale Zubehörteile auf Fahrzeugen, die Sie nicht möchten, dass die Handhabung des Autos beeinflussen, oder ein massives Rendernetz, das an ein einfaches Meshgeschweißt ist.
Siehe auch Assemblies, ein Artikel, der beschreibt, was Wurzelteile sind und wie man sie verwendet.
Material
Die Material-Eigenschaft ermöglicht es einem Baumeister, die Textur und die Standard- physischen Eigenschaften eines Teils festzulegen (im Falle, dass BasePart.CustomPhysicalProperties nicht festgelegt ist). Das Standard-Plastik-Material hat eine sehr leichte Textur, und das SmoothPlastic-Material hat Allekeine Textur. Einige Materialtexturen wie DiamondPlate und Granite haben sehr sichtbare Texturen. Die Textur jedes Materials reflektiert Sonnen
Durch das Festlegen dieser Eigenschaft und das Aktivieren von BasePart.CustomPhysicalProperties wird die Standard- physische Eigenschaft eines Materials verwendet. Zum Instanzist DiamondPlate ein sehr dichtes Material, während Wood sehr leicht ist. Die Dichte eines Teils bestimmt, ob er in Geländewasser schwimmt.
Das Glas-Material ändert das Rendering-Verhalten bei mäßigen Grafik-Einstellungen. Es gilt ein wenig Reflexion (ähnlich wie BasePart.Reflectance ) und Perspektionsverzerrung. Der Effekt ist besonders auf kugelförmigen Teilen (Set Class.BasePart.Shape Ball) sichtbar. Semitransparente Objekte und Glasteile hinter Glas sind nicht sichtbar.
Code-Beispiele
local part = script.Parent
-- Create a ClickDetector so we can tell when the part is clicked
local cd = Instance.new("ClickDetector", part)
-- This function updates how the part looks based on its Anchored state
local function updateVisuals()
if part.Anchored then
-- When the part is anchored...
part.BrickColor = BrickColor.new("Bright red")
part.Material = Enum.Material.DiamondPlate
else
-- When the part is unanchored...
part.BrickColor = BrickColor.new("Bright yellow")
part.Material = Enum.Material.Wood
end
end
local function onToggle()
-- Toggle the anchored property
part.Anchored = not part.Anchored
-- Update visual state of the brick
updateVisuals()
end
-- Update, then start listening for clicks
updateVisuals()
cd.MouseClick:Connect(onToggle)
MaterialVariant
Das System sucht die MaterialVariant Instanz mit dem angegebenen MaterialVariant-Namen und BasePart.Material eingeben. Wenn es eine passende MaterialVariant-Instanz findet, verwendet es diese MaterialVariant-Instanz, um das Standardmaterial zu ersetzen. Standardmaterial kann das integrierte Material oder ein Override Material sein, der in MaterialService angegeben ist.
Orientation
Die Ausrichtungseigenschaft beschreibt die Ausrichtung der Teil in Grad um die X, Y und Z-Achsen mit einem Vector3. Die Ausrichtungen werden in Y → X → Z orderiert. Dies unterscheidet sich von
Wenn Sie diese Eigenschaft auf irgendeine Welds oder Motor6Ds mit diesem Teil verbunden setzen, wird die entsprechende C0 oder 1> Class.JointInstance.C1|C11> Eigenschaft aktual
Weldschnitten werden auch vorübergehend deaktiviert und wieder aktiviert, während der Verschiebungswerkzeug.
Code-Beispiele
local part = script.Parent
local INCREMENT = 360 / 20
-- Rotate the part continually
while true do
for degrees = 0, 360, INCREMENT do
-- Set only the Y axis rotation
part.Rotation = Vector3.new(0, degrees, 0)
-- A better way to do this would be setting CFrame
--part.CFrame = CFrame.new(part.Position) * CFrame.Angles(0, math.rad(degrees), 0)
task.wait()
end
end
PivotOffset
Diese Eigenschaft spezifiziert den Versatz des Teils von seinem CFrame, der dasselbe ist wie part:GetPivot() .
Dies ist praktisch, um den Pivot in einem lokalen Platzzu einer Position zu setzen, aber das Setzen eines Teils in einen Welt -Raum kann wie folgt durchgeführt werden:
local part = workspace.BluePartlocal desiredPivotCFrameInWorldSpace = CFrame.new(0, 10, 0)part.PivotOffset = part.CFrame:ToObjectSpace(desiredPivotCFrameInWorldSpace)
Code-Beispiele
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)
local function createHand(length, width, yOffset)
local part = Instance.new("Part")
part.Size = Vector3.new(width, 0.1, length)
part.Material = Enum.Material.Neon
part.PivotOffset = CFrame.new(0, -(yOffset + 0.1), length / 2)
part.Anchored = true
part.Parent = workspace
return part
end
local function positionHand(hand, fraction)
hand:PivotTo(CFrame.fromEulerAnglesXYZ(0, -fraction * 2 * math.pi, 0))
end
-- Create dial
for i = 0, 11 do
local dialPart = Instance.new("Part")
dialPart.Size = Vector3.new(0.2, 0.2, 1)
dialPart.TopSurface = Enum.SurfaceType.Smooth
if i == 0 then
dialPart.Size = Vector3.new(0.2, 0.2, 2)
dialPart.Color = Color3.new(1, 0, 0)
end
dialPart.PivotOffset = CFrame.new(0, -0.1, 10.5)
dialPart.Anchored = true
dialPart:PivotTo(CFrame.fromEulerAnglesXYZ(0, (i / 12) * 2 * math.pi, 0))
dialPart.Parent = workspace
end
-- Create hands
local hourHand = createHand(7, 1, 0)
local minuteHand = createHand(10, 0.6, 0.1)
local secondHand = createHand(11, 0.2, 0.2)
-- Run clock
while true do
local components = os.date("*t")
positionHand(hourHand, (components.hour + components.min / 60) / 12)
positionHand(minuteHand, (components.min + components.sec / 60) / 60)
positionHand(secondHand, components.sec / 60)
task.wait()
end
Position
Die Position-Eigenschaft beschreibt die Koordinaten eines part mit einem Vector3. Sie reflektiert die Position des Teils BasePart.CFrame , aber sie kann auch festlegenwerden.
Wenn Sie diese Eigenschaft auf irgendeine Welds oder Motor6Ds mit diesem Teil verbunden setzen, wird die entsprechende C0 oder 1> Class.JointInstance.C1|C11> Eigenschaft aktual
Weldschnitten werden auch vorübergehend deaktiviert und wieder aktiviert, während der Verschiebungswerkzeug.
ReceiveAge
Dies gibt die Zeit in Sekunden zurück, seit der Physik der Teil auf dem lokalen Client (oder dem Server) aktualisiert wurde. Wird 0 zurückgegeben, wenn die Teil keine Physik hat (verankert)
Reflectance
Die Reflexions-Eigenschaft bestimmt, wie viel ein part den Himmelskasten reflektiert. Ein Wert von 0 zeigt an, Alledie partei nicht reflektierend ist, und ein Wert von 1 zeigt an, dass die partei vollständig reflektieren sollte.
Reflexion wird nicht von BasePart.Transparency beeinträchtigt, es sei denn, die Teil ist vollständig durchsichtig, in dem Fall wird keine Reflexion rend染。Reflexion kann oder nicht ignoriert werden, abhängig von der BasePart.Material der Teil.
Code-Beispiele
local part = script.Parent
local pointLight = Instance.new("PointLight")
pointLight.Brightness = 0
pointLight.Range = 12
pointLight.Parent = part
local touchNo = 0
local function blink()
-- Advance touchNo to tell other blink() calls to stop early
touchNo = touchNo + 1
-- Save touchNo locally so we can tell when it changes globally
local myTouchNo = touchNo
for i = 1, 0, -0.1 do
-- Stop early if another blink started
if touchNo ~= myTouchNo then
break
end
-- Update the blink animation
part.Reflectance = i
pointLight.Brightness = i * 2
task.wait(0.05)
end
end
part.Touched:Connect(blink)
ResizeIncrement
Die Eigenschaft ResizeIncrement ist eine읽기-only-Eigenschaft, die die kleinste Größenänderung, die mit der BasePart:Resize() Methode erlaubt ist, beschreibt. Sie unterscheidet sich zwischen der Umsetzung der BasePart-Abstraktklasse. Zum Instanzhat Class.
Code-Beispiele
-- Put this Script in several kinds of BasePart, like
-- Part, TrussPart, WedgePart, CornerWedgePart, etc.
local part = script.Parent
-- Create a handles object for this part
local handles = Instance.new("Handles")
handles.Adornee = part
handles.Parent = part
-- Manually specify the faces applicable for this handle
handles.Faces = Faces.new(Enum.NormalId.Top, Enum.NormalId.Front, Enum.NormalId.Left)
-- Alternatively, use the faces on which the part can be resized.
-- If part is a TrussPart with only two Size dimensions
-- of length 2, then ResizeableFaces will only have two
-- enabled faces. For other parts, all faces will be enabled.
handles.Faces = part.ResizeableFaces
ResizeableFaces
Die Eigenschaft ResizeableFaces (mit einem e , nicht ResizableFaces) beschreibt die Verwendung eines Gesichtsobjekts, auf das ein Teil skaliert werden kann. Für die meisten implementierungen von
Code-Beispiele
-- Put this Script in several kinds of BasePart, like
-- Part, TrussPart, WedgePart, CornerWedgePart, etc.
local part = script.Parent
-- Create a handles object for this part
local handles = Instance.new("Handles")
handles.Adornee = part
handles.Parent = part
-- Manually specify the faces applicable for this handle
handles.Faces = Faces.new(Enum.NormalId.Top, Enum.NormalId.Front, Enum.NormalId.Left)
-- Alternatively, use the faces on which the part can be resized.
-- If part is a TrussPart with only two Size dimensions
-- of length 2, then ResizeableFaces will only have two
-- enabled faces. For other parts, all faces will be enabled.
handles.Faces = part.ResizeableFaces
RightSurface
Die RightSurface-Eigenschaft bestimmt die Art der Oberfläche, die für die +X-Richtung eines Teils verwendet wird. Wenn die Gesichter von zwei Teilen nebeneinander platziert werden, können sie eine gemeinsame Erfahrung zwischen ihnen erstellen. Wenn auf Motor gesetzt, bestimmt die BasePart.RightSurfaceInput , wie eine Motor-Joint funktionieren soll.
Die meisten Oberflächentypen rendern eine Textur auf der Teilseite, wenn der BasePart.Material auf Plastik eingestellt ist. Einige Oberflächentypen, einschließlich Hinge, Motor und SteppingMotor, rendern stattdessen eine 3D-Verzierung. Wenn diese Eigenschaft in dem Eigenschaften-Fenster ausgewählt wird, wird sie im Spiel wie das eines SurfaceSelection angezeigt.
Code-Beispiele
local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end
RootPriority
Diese Eigenschaft ist ein ganzer Zahl zwischen -127 und 127, der die Vorrangregel für die Wurzel-Teil-Sortierung über alle anderen Regeln für die Wurzel-Teil-Sortierung übersteht. Wenn Sie mehrere Teile betrachten, die nicht Anchored sind und den gleichen Class.BasePart.Massless|Massless
Sie können diese Eigenschaft verwenden, um zu steuern, welcher Teil einer Montagemaschine die Wurzel ist, und die Wurzel bei der Größenänderung stabil zu halten.
Siehe auch Assemblies, ein Artikel, der beschreibt, was Wurzelteile sind und wie man sie verwendet.
Rotation
DieRotation der Teil in Grad für die drei Achsen.
Wenn Sie diese Eigenschaft auf irgendeine Welds oder Motor6Ds mit diesem Teil verbunden setzen, wird die entsprechende C0 oder 1> Class.JointInstance.C1|C11> Eigenschaft aktual
Weldschnitten werden auch vorübergehend deaktiviert und wieder aktiviert, während der Verschiebungswerkzeug.
Size
Die Eigenschaft Size eines Teils bestimmt seine visuellen Dimensionen, während ExtentsSize die tatsächliche Größe, die von der Physik-Engine verwendet wird, repr
Die Größe des Teils bestimmt seine Masse, die durch BasePart:GetMass() gegeben wird. Ein Teil's Size wird von einer Vielzahl anderer Objekte verwendet:
- ParticleEmitter um den Bereich zu bestimmen, aus dem Partikel spawnen.
- BlockMesh, um das gerendelte rechteckige Prisma teilweise zu bestimmen.
- SpecialMesh für bestimmte MeshTypes, um die Größe des gerenderten Netzwerks zu bestimmen.
- SurfaceLight um den Bereich zu beleuchten.
Code-Beispiele
local TOWER_BASE_SIZE = 30
local position = Vector3.new(50, 50, 50)
local hue = math.random()
local color0 = Color3.fromHSV(hue, 1, 1)
local color1 = Color3.fromHSV((hue + 0.35) % 1, 1, 1)
local model = Instance.new("Model")
model.Name = "Tower"
for i = TOWER_BASE_SIZE, 1, -2 do
local part = Instance.new("Part")
part.Size = Vector3.new(i, 2, i)
part.Position = position
part.Anchored = true
part.Parent = model
-- Tween from color0 and color1
local perc = i / TOWER_BASE_SIZE
part.Color = Color3.new(
color0.R * perc + color1.R * (1 - perc),
color0.G * perc + color1.G * (1 - perc),
color0.B * perc + color1.B * (1 - perc)
)
position = position + Vector3.new(0, part.Size.Y, 0)
end
model.Parent = workspace
TopSurface
Die TopSurface-Eigenschaft bestimmt die Art der Oberfläche, die für die +Y-Richtung eines Teils verwendet wird. Wenn die Gesichter von zwei Teilen nebeneinander platziert werden, können sie eine gemeinsame Erfahrung zwischen ihnen erstellen. Wenn auf Motor gesetzt, bestimmt die BasePart.TopSurfaceInput , wie eine Motor-Joint funktionieren soll.
Die meisten Oberflächentypen rendern eine Textur auf der Teilseite, wenn der BasePart.Material auf Plastik eingestellt ist. Einige Oberflächentypen - Hinge, Motor und SteppingMotor - werden stattdessen eine 3D-Verzierung rendern. Wenn diese Eigenschaft in dem Eigenschaften-Fenster ausgewählt wird, wird sie im Spiel wie diejenige eines SurfaceSelection ausgewählt.
Code-Beispiele
local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end
Transparency
Die Transparenz-Eigenschaft kontrolliert die Sichtbarkeit eines Teils auf einer Skala von 0 zu 1, bei der 0 vollständig sichtbar (opake) ist, und ein Wert von 1 vollständig unsichtbar (nicht gerendert).
BasePart.Reflectance kann die Gesamtwohn透明ität eines Ziegelns reduzieren, wenn er auf einen Wert in der Nähe von 1 eingestellt ist.
Während vollständig durchsichtige Teile nicht gerendert werden, haben teilweise transparente Objekte einige wichtige Render-Kosten. Wenn Sie viele transparente Teile haben, kann dies das Spiel verlangsamen.
Wenn transparente Teile überlappen, kann die Rendering-Ordnung unvorhersehbar sein - versuchen Sie, halbtransparente Teile von überlappenden zu vermeiden.
Der BasePart.LocalTransparencyModifier ist ein Multiplikator für Transparenz, der nur für den lokalen Client sichtbar ist.
Code-Beispiele
-- Paste into a Script inside a tall part
local part = script.Parent
local OPEN_TIME = 1
-- Can the door be opened at the moment?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("Black")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("Bright blue")
end
local function onTouch(otherPart)
-- If the door was already open, do nothing
if debounce then
print("D")
return
end
-- Check if touched by a Humanoid
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("not human")
return
end
-- Perform the door opening sequence
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()
local function makeXRayPart(part)
-- LocalTransparencyModifier will make parts see-through but only for the local
-- client, and it won't replicate to the server
part.LocalTransparencyModifier = 0.5
end
-- This function uses recursion to search for parts in the game
local function recurseForParts(object)
if object:IsA("BasePart") then
makeXRayPart(object)
end
-- Stop if this object has a Humanoid - we don't want to see-through players!
if object:FindFirstChildOfClass("Humanoid") then
return
end
-- Check the object's children for more parts
for _, child in pairs(object:GetChildren()) do
recurseForParts(child)
end
end
recurseForParts(workspace)
Methoden
AngularAccelerationToTorque
Parameter
Rückgaben
ApplyAngularImpulse
Applys einen sofortigen Winkelkraft-Boost für das Montieren dieses Teils, wodurch das Montieren gedreht wird.
Die daraus resultierende angelicale Geschwindigkeit basiert auf der Montagemaschine mass. So ist ein höherer Impuls erforderlich, um größere Assemblies zu bewegen. Impulse sind nützlich für Fälle, in denen Sie eine sofortige Kraft anwenden möchten, z. B. eine Explosion oder einen Zusammenstoß.
Wenn das Teil von einem Server besessen ist, muss diese Funktion von einem Server Script (nicht von einem Class.LocalScript
Parameter
Ein Kraftvektor, der auf die Montagemaschine als Impuls angewendet wird.
Rückgaben
ApplyImpulse
Diese Funktion gilt für einen sofortigen Kraftimpuls für die Montage dieses Teils.
Die Kraft wird an der Montagemaschine angewendet, center of mass, so dass der resultierende Bewegung nur linear ist.
Die daraus resultierende Geschwindigkeit basiert auf der Montagemaschine mass. Ein höherer Impuls ist erforderlich, um größere Assemblies zu bewegen. Impulse sind nützlich für Fälle, in denen Sie eine sofortige Kraft anwenden möchten, z. B. eine Explosion oder einen Zusammenstoß.
Wenn das Teil von einem Server besessen ist, muss diese Funktion von einem Server Script (nicht von einem Class.LocalScript
Parameter
Ein Kraftvektor, der auf die Montagemaschine als Impuls angewendet wird.
Rückgaben
ApplyImpulseAtPosition
Diese Funktion gilt für einen sofortigen Kraftimpuls für die Montage dieses Teils im Platzan der angegebenen Position.
Wenn die Position nicht in der Montagemaschine center of mass ist, verursacht der Impuls eine positoriale und drehende Bewegung.
Die daraus resultierende Geschwindigkeit basiert auf der Montagemaschine mass. Ein höherer Impuls ist erforderlich, um größere Assemblies zu bewegen. Impulse sind nützlich für Fälle, in denen Entwickler eine sofortige Kraft anwenden möchten, z. B. eine Explosion oder einen Zusammenstoß.
Wenn das Teil von einem Server besessen ist, muss diese Funktion von einem Server Script (nicht von einem Class.LocalScript
Parameter
Ein Kraftvektor, der auf die Montagemaschine als Impuls angewendet wird.
Die Position, im Platz, um den Impuls anzuwenden.
Rückgaben
CanCollideWith
Gibt zurück, ob die Teile miteinander kollidieren können oder nicht. Diese Funktion berücksichtigt die Kollisionsgruppen der beiden Teile. Diese Funktion wird einen Fehler zurückgeben, wenn die angegebene Teil nicht eine BasePart ist.
Parameter
Der angegebene Teil wird auf Kollisionsfähigkeit überprüft.
Rückgaben
Ob die Teile miteinander kollidieren können.
CanSetNetworkOwnership
Die Funktion CanSetNetworkOwnership prüft, ob Sie die Netzwerkbesitzung eines Teils verwalten können.
Der Rückgabewert der Funktion überprüft, ob Sie BasePart:SetNetworkOwner() oder BasePart:SetNetworkOwnershipAuto() aufrufen können, ohne einen Fehler zu begegnen. Es gibt die Rückgabe wahr, wenn Sie das Netzwerkbesitz ändern/lesen können, oder gibt die Rückgabe falsch und der Grund, warum Sie es nicht, als Stringzurück.
Rückgaben
Ob du die Netzwerkbesitz und den Grund ändern kannst oder nicht.
Code-Beispiele
local part = workspace:FindFirstChild("Part")
if part and part:IsA("BasePart") then
local canSet, errorReason = part:CanSetNetworkOwnership()
if canSet then
print(part:GetFullName() .. "'s Network Ownership can be changed!")
else
warn("Cannot change the Network Ownership of " .. part:GetFullName() .. " because: " .. errorReason)
end
end
GetConnectedParts
Gibt eine Tabelle von Teilen zurück, die mit dem Objekt durch eine beliebige Art von Verbindungverbunden sind.
Wenn recursive wahr ist, wird diese Funktion alle Teile in der Montage in der Basis fest verbunden zurückgeben.
Starre Gelenke
Wenn ein Zug zwei Teile miteinander verbindet, (Part0 → Part1), ist ein Zug (Part1if die Physik von Part1 vollständig von 2> (Part0)2> eingesperrt ist. Dies gilt nur für die folgenden Zugtypen:
Parameter
Rückgaben
GetJoints
Kehre alle Joints oder Einschränkungen zurück, die mit dieser Teil verbunden sind.
Rückgaben
Ein Array von allen Joints oder Beschränkungen, die mit dem Teil verbunden sind.
GetMass
GetMass gibt den Wert der Mass Eigenschaftenzurück.
Diese Funktion ist der Eigenschaftenvoraus. Sie wird für die Rückwärtsskompatibilität unterstützt; Sie sollten die Masse-Eigenschaft direkt verwenden.
Rückgaben
Die Masse des Teils.
Code-Beispiele
local myPart = Instance.new("Part")
myPart.Size = Vector3.new(4, 6, 4)
myPart.Anchored = true
myPart.Parent = workspace
local myMass = myPart:GetMass()
print("My part's mass is " .. myMass)
GetNetworkOwner
Gibt den aktuellen Spieler zurück, der der Netzwerk-Eigentümer dieses Teils ist, oder null in Falle des Servers.
Rückgaben
Der aktuelle Spieler, der Besitzer der Netzwerk dieses Teils, oder null in Falle des Servers.
GetNetworkOwnershipAuto
Kehrt wahr zurück, wenn die Spielmaschine die Netzwerkbesitzer automatisch für diesen Teil festgelegt hat.
Rückgaben
Ob der SpielEngine automatisch den Netzwerk-Besitzer für diesen Teil entscheidet.
GetNoCollisionConstraints
Rückgaben
GetRootPart
Gibt die grundlegende Teil einer Montagemaschine zurück. Wenn Sie eine Montagemaschine mit einem CFrame beweegen, ist es wichtig, diesen grundlegenden Teil zu bewegen (dies wird alle anderen Teile, die an ihm verbunden sind, entsprechend bewegen). Weitere Informationen finden Sie im Artikel Montagemaschinen.
Diese Funktion ist vor der AssemblyRootPart Eigenschaftendatiert. Sie wird für die Rückwärtsskompatibilität unterstützt, aber Sie sollten AssemblyRootPart direkt verwenden.
Rückgaben
Die grundlegende Teil einer Montagemaschine (eine Sammlung von Teilen, die miteinander verbunden sind).
GetTouchingParts
Gibt eine Tabelle zurück, in der alle Teile, die physisch mit dieser Teil interagieren, beschrieben sind. Wenn die Teil selbst CanCollide auf falsch gesetzt ist, dann gibt diese Funktion eine leere Tabelle zurück
Rückgaben
Eine Tabelle aller Teile, die mit dieser Teil interagieren und kollidieren kann.
GetVelocityAtPosition
Gibt die lineare Geschwindigkeit der Montagemaschine der angegebenen Position im Verhältnis zu dieser Maschine zurück. Es kann verwendet werden, um die lineare Geschwindigkeit der Teile in einer Montagemaschine außer der Wurzelmaschine zu identifizieren. Wenn die Montagemaschine keine angulare Geschwindigkeit hat, dann ist die lineare Geschwindigkeit immer die gleiche für jede Position.
Parameter
Rückgaben
IsGrounded
Gibt zurück, wenn das Objekt mit einem Teil verbunden ist, das es an Ort und Stelle halten wird (z. B. mit einem Anchored Teil), sonst gibt es zurück. In einer Montage, die ein Anchored Teil hat, ist jedes andere Teil auf dem Boden.
Rückgaben
Ob das Objekt mit einem Teil verbunden ist, das es an Ort halten wird.
Resize
Ändert die Größe eines Objekts genau wie mit dem Tool.
Parameter
Die Seite zum Größe anpassen.
Wie viel auf der angegebenen Seite zu wachsen/rückgängig zu machen ist.
Rückgaben
Ob das Teil skaliert wird.
SetNetworkOwner
Setzt den angegebenen Spieler als Netzwerkbesitzer für dies und alle verbundenen Teile. Wenn playerInstance null ist, wird der Server der Besitzer sein, anstatt ein Spieler:in.
Parameter
Der Spieler erhält die Netzwerkbesitz der Teil.
Rückgaben
SetNetworkOwnershipAuto
Lässt die SpielEngine dynamisch entscheiden, wer die Physik der Teile (eines der Clients oder des Servers) verantwortet.
Rückgaben
TorqueToAngularAcceleration
Parameter
Rückgaben
IntersectAsync
Erstellt ein neues IntersectOperation von der intersecting Geometry des Teils und der anderen Teile in der angegebenen Array. Nur Parts werden unterstützt, nicht Terrain oder 1> Class.MeshPart|MeshParts1>.
Die folgenden Eigenschaften der aufrufenden Teil werden auf das resultierende IntersectOperation angewendet:
- Class.BasePart.Color|Color , Material , MaterialVariant , 0> Class.BasePart.Reflectance|Reflectance0> , Color3>
- Class.BasePart.Anchored|Anchored , Density , Elasticity , 0> Class.BasePart.ElasticityWeight|Elasticity0> , 3> Class.Base
Im folgenden Bildvergleich wird IntersectAsync() auf den lila Block aufgerufen, der mit einer Tabelle, die den blauen Blöckeenthält, auf eine Form der interessierenden Geometrie der beiden Teile resolviert.
Notizen
- Die ursprünglichen Teile bleiben nach einem erfolgreichen Intersect-Operation intakt. In den meisten Fällen solltest du alle ursprünglichen Teile und das zurückgegebene Destroy() an den gleichen Ort wie die aufrufende IntersectOperation .
- Standardmäßig sind die Gesichtsfarben der resultierenden Interaktion auf die Eigenschaft Color der ursprünglichen Teile übernommen. Um die gesamte Interaktion in eine bestimmte Farbe zu ändern, setzen Sie seine UsePartColor Eigenschaft auf true.
- Wenn eine Intersektion mit mehr als 20.000 Dreieck ergäbe, wird sie auf 20.000 Dreieck einfacht.
Parameter
Die Objekte, die an der Intersektion teilnehmen.
Der Enum.CollisionFidelity -Wert für die resultierende IntersectOperation .
Der Enum.RenderFidelity -Wert des resultierenden PartOperation .
Rückgaben
Ergebnis IntersectOperation mit Standardname Intersect .
SubtractAsync
Erstellt ein neues UnionOperation von der Teil, minus die Geometrie, die von den Teilen in der angegebenen Arraybesetzt ist. Nur Parts werden unterstützt, nicht Class.Terrain oder 1> Class.MeshPart|MeshParts1>. Ähn
Beachten Sie, dass die resultierende Union aufgrund von Subtraktionen leer sein kann. Wenn die Operation eine vollständig leere Geometrie ergibt, wird sie fehlgeschlagen.
Im folgenden Bildvergleich wird SubtractAsync() auf den blauen Zylinder aufgerufen, der eine Tabelle enthält, die die lila Blöckeenthält. Das resultierende UnionOperation löst sich in eine Form, die die Geometrie des Blöckevon derjenigen des Zylinders enthält.
Parameter
Die Objekte, die an der Subtraktion teilnehmen.
Der Enum.CollisionFidelity -Wert für die resultierende UnionOperation .
Der Enum.RenderFidelity -Wert des resultierenden PartOperation .
Rückgaben
Ergebnis UnionOperation mit Standardname Union .
Code-Beispiele
local Workspace = game:GetService("Workspace")
local mainPart = script.Parent.PartA
local otherParts = { script.Parent.PartB, script.Parent.PartC }
-- Perform subtract operation
local success, newSubtract = pcall(function()
return mainPart:SubtractAsync(otherParts)
end)
-- If operation succeeds, position it at the same location and parent it to the workspace
if success and newSubtract then
newSubtract.Position = mainPart.Position
newSubtract.Parent = Workspace
end
-- Destroy original parts which remain intact after operation
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
end
UnionAsync
Erstellt eine neue UnionOperation von der Teil, plus die Geometrie, die von den Teilen in der angegebenen Arraybelegt ist. Nur Parts sind unterstützt, nicht Class.Terrain oder 1> Class.MeshPart|MeshParts1>. Ähnlich wie <
Die folgenden Eigenschaften der aufrufenden Teil werden auf das resultierende UnionOperation angewendet:
- Class.BasePart.Color|Color , Material , MaterialVariant , 0> Class.BasePart.Reflectance|Reflectance0> , Color3>
- Class.BasePart.Anchored|Anchored , Density , Elasticity , 0> Class.BasePart.ElasticityWeight|Elasticity0> , 3> Class.Base
Im folgenden Bildvergleich wird UnionAsync() auf den blauen Block aufgerufen, der mit einer Tabelle, die den lila Zylinder enthält, auf eine Form der kombinierten Geometrie beider Teile resolviert.
Notizen
- Die ursprünglichen Teile bleiben nach einer erfolgreichen Union-Operation intakt. In den meisten Fällen solltest du alle ursprünglichen Teile und das zurückgegebene Destroy() an den gleichen Ort wie die aufrufende UnionOperation .
- Standardmäßig respektiert die resultierende Union die Eigenschaft Color jeder deiner Teile. Um die gesamte Union in eine bestimmte Farbe zu ändern, setze seine Class.PartOperation.UsePartColor|UsePartColor -Eigenschaft auf true .
- Wenn eine Unionsberechnung zu einem Teil mit mehr als 20.000 Dreieck ergäbe, wird es auf 20.000 Dreieck einfacht.
Parameter
Die Objekte, die an der Union mit dem aufrufenden Teil teilnehmen.
Der Enum.CollisionFidelity -Wert für die resultierende UnionOperation .
Der Enum.RenderFidelity -Wert des resultierenden PartOperation .
Rückgaben
Ergebnis UnionOperation mit Standardname Union .
Code-Beispiele
local Workspace = game:GetService("Workspace")
local mainPart = script.Parent.PartA
local otherParts = { script.Parent.PartB, script.Parent.PartC }
-- Perform union operation
local success, newUnion = pcall(function()
return mainPart:UnionAsync(otherParts)
end)
-- If operation succeeds, position it at the same location and parent it to the workspace
if success and newUnion then
newUnion.Position = mainPart.Position
newUnion.Parent = Workspace
end
-- Destroy original parts which remain intact after operation
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
end
Ereignisse
TouchEnded
Feuert ab, wenn ein Teil unter ähnlichen Bedingungen wie BasePart.Touched berührt wird.
Dieses Ereignis funktioniert in Zusammenarbeit mit Workspace.TouchesUseCollisionGroups, um anzugeben, ob Zusammenarbeitsgruppen anerkannt sind für die Erkennung.
Parameter
Code-Beispiele
local part = script.Parent
local billboardGui = Instance.new("BillboardGui")
billboardGui.Size = UDim2.new(0, 200, 0, 50)
billboardGui.Adornee = part
billboardGui.AlwaysOnTop = true
billboardGui.Parent = part
local tl = Instance.new("TextLabel")
tl.Size = UDim2.new(1, 0, 1, 0)
tl.BackgroundTransparency = 1
tl.Parent = billboardGui
local numTouchingParts = 0
local function onTouch(otherPart)
print("Touch started: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("Touch ended: " .. otherPart.Name)
numTouchingParts = numTouchingParts - 1
tl.Text = numTouchingParts
end
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
Touched
Das Berührte -Ereignis wird ausgelöst, wenn ein Teil mit einem anderen Teil in Berührung kommt. Zum Instanz, wenn TeilA auf TeilB stößt, dann 1> Class.BasePart.Touched|PartA.Touched1> mit 4> TeilB
Dieses Ereignis wird nur als Ergebnis von physischen Bewegungen ausgelöst, so dass es nicht ausgelöst wird, wenn die CFrame Eigenschaft geändert wird, sodass die Teil überlappende ein anderes Teil. Dies bedeutet auch, dass mindestens einer der beteiligten Teile nicht Class.BasePart.Anchored|Anchored 2>im Zeitpunkt der Kollision</
Dieses Ereignis funktioniert in Zusammenarbeit mit Workspace.TouchesUseCollisionGroups, um anzugeben, ob Zusammenarbeitsgruppen anerkannt sind für die Erkennung.
Parameter
Der andere Teil, der mit dem gegebenen Teil in Kontakt stand.
Code-Beispiele
local part = script.Parent
local billboardGui = Instance.new("BillboardGui")
billboardGui.Size = UDim2.new(0, 200, 0, 50)
billboardGui.Adornee = part
billboardGui.AlwaysOnTop = true
billboardGui.Parent = part
local tl = Instance.new("TextLabel")
tl.Size = UDim2.new(1, 0, 1, 0)
tl.BackgroundTransparency = 1
tl.Parent = billboardGui
local numTouchingParts = 0
local function onTouch(otherPart)
print("Touch started: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("Touch ended: " .. otherPart.Name)
numTouchingParts = numTouchingParts - 1
tl.Text = numTouchingParts
end
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
local model = script.Parent
local function onTouched(otherPart)
-- Ignore instances of the model coming in contact with itself
if otherPart:IsDescendantOf(model) then return end
print(model.Name .. " collided with " .. otherPart.Name)
end
for _, child in pairs(model:GetChildren()) do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
end
end