Classe motore
BasePart
*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.
Sommario
Proprietà
Metodi
Eventi
StoppedTouching(otherPart: BasePart):RBXScriptSignal |
Touched(otherPart: BasePart):RBXScriptSignal |
TouchEnded(otherPart: BasePart):RBXScriptSignal |
Membri ereditati
Membri ereditati da PVInstance: 4
Membri ereditati da Instance: 57
Membri ereditati da Object: 6
Ereditata da
Campioni di codice
SmoothDamping il CFrame di un Part
local TweenService = game:GetService("TweenService")
-- crea un part e un obiettivo
local part = Instance.new("Part", workspace)
part.Size = Vector3.one
part.Anchored = true
part.BrickColor = BrickColor.new("Electric blue")
part.CFrame = CFrame.new(0, 4, 0)
local target = Instance.new("Part", workspace)
target.Name = "Target"
target.Size = Vector3.one * 0.5
target.Anchored = true
target.BrickColor = BrickColor.new("Really red")
target.CFrame = CFrame.new(0, 8, 0)
-- imposta una variabile per memorizzare la velocità
local velocity = CFrame.new()
-- regola la velocità di smussatura
local smoothTime = 0.5
game:GetService("RunService").Stepped:Connect(function(t, dt)
part.CFrame, velocity = TweenService:SmoothDamp(part.CFrame, target.CFrame, velocity, smoothTime, math.huge, dt)
end)Riferimento API
Proprietà
Anchored
Campioni di codice
Attivazione Ancorata del Part
local part = script.Parent
-- Crea un ClickDetector così sappiamo quando la parte viene cliccata
local cd = Instance.new("ClickDetector", part)
-- Questa funzione aggiorna l'aspetto della parte in base al suo stato Ancorato
local function updateVisuals()
if part.Anchored then
-- Quando la parte è ancorata...
part.BrickColor = BrickColor.new("Rosso brillante")
part.Material = Enum.Material.DiamondPlate
else
-- Quando la parte è non ancorata...
part.BrickColor = BrickColor.new("Giallo brillante")
part.Material = Enum.Material.Wood
end
end
local function onToggle()
-- Attiva/disattiva la proprietà ancorata
part.Anchored = not part.Anchored
-- Aggiorna lo stato visivo del mattone
updateVisuals()
end
-- Aggiorna, poi inizia ad ascoltare i clic
updateVisuals()
cd.MouseClick:Connect(onToggle)BackParamA
BackParamB
BackSurfaceInput
BottomParamA
BottomParamB
BottomSurfaceInput
brickColor
CanCollide
Campioni di codice
Porta Sfumata
-- Incolla in uno Script all'interno di una parte alta
local part = script.Parent
local OPEN_TIME = 1
-- La porta può essere aperta in questo momento?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("Nero")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("Blu brillante")
end
local function onTouch(otherPart)
-- Se la porta era già aperta, non fare nulla
if debounce then
print("D")
return
end
-- Controlla se è stata toccata da un Humanoid
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("non umano")
return
end
-- Esegui la sequenza di apertura della porta
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()CFrame
Campioni di codice
Impostare il CFrame della parte
local part = script.Parent:WaitForChild("Part")
local otherPart = script.Parent:WaitForChild("OtherPart")
-- Ripristina il CFrame della parte a (0, 0, 0) senza rotazione.
-- Questo è a volte chiamato il "CFrame identità"
part.CFrame = CFrame.new()
-- Imposta una posizione specifica (X, Y, Z)
part.CFrame = CFrame.new(0, 25, 10)
-- Stesso di sopra, ma usa un Vector3 invece
local point = Vector3.new(0, 25, 10)
part.CFrame = CFrame.new(point)
-- Imposta il CFrame della parte per essere in un punto, guardando un altro
local lookAtPoint = Vector3.new(0, 20, 15)
part.CFrame = CFrame.lookAt(point, lookAtPoint)
-- Ruota il CFrame della parte di pi/2 radianti sull'asse X locale
part.CFrame = part.CFrame * CFrame.Angles(math.pi / 2, 0, 0)
-- Ruota il CFrame della parte di 45 gradi sull'asse Y locale
part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(45), 0)
-- Ruota il CFrame della parte di 180 gradi sull'asse Z globale (nota l'ordine!)
part.CFrame = CFrame.Angles(0, 0, math.pi) * part.CFrame -- I radianti di Pi sono uguali a 180 gradi
-- Comporre due CFrame si fa usando * (l'operatore di moltiplicazione)
part.CFrame = CFrame.new(2, 3, 4) * CFrame.new(4, 5, 6) --> uguale a CFrame.new(6, 8, 10)
-- Diversamente dalla moltiplicazione algebrica, la composizione dei CFrame NON è commutativa: a * b non è necessariamente b * a!
-- Immagina * come una serie ORDINATA di azioni. Ad esempio, le seguenti righe producono CFrame diversi:
-- 1) Scivola la parte di 5 unità su X.
-- 2) Ruota la parte di 45 gradi attorno al suo asse Y.
part.CFrame = CFrame.new(5, 0, 0) * CFrame.Angles(0, math.rad(45), 0)
-- 1) Ruota la parte di 45 gradi attorno al suo asse Y.
-- 2) Scivola la parte di 5 unità su X.
part.CFrame = CFrame.Angles(0, math.rad(45), 0) * CFrame.new(5, 0, 0)
-- Non esiste una "divisione CFrame", ma semplicemente "fare l'operazione inversa".
part.CFrame = CFrame.new(4, 5, 6) * CFrame.new(4, 5, 6):Inverse() --> è uguale a CFrame.new(0, 0, 0)
part.CFrame = CFrame.Angles(0, 0, math.pi) * CFrame.Angles(0, 0, math.pi):Inverse() --> uguale a CFrame.Angles(0, 0, 0)
-- Posiziona una parte rispetto a un'altra (in questo caso, metti la nostra parte sopra otherPart)
part.CFrame = otherPart.CFrame * CFrame.new(0, part.Size.Y / 2 + otherPart.Size.Y / 2, 0)CollisionGroup
Campioni di codice
PhysicsService:RegisterCollisionGroup
local PhysicsService = game:GetService("PhysicsService")
local collisionGroupBall = "CollisionGroupBall"
local collisionGroupDoor = "CollisionGroupDoor"
-- Registra i gruppi di collisione
PhysicsService:RegisterCollisionGroup(collisionGroupBall)
PhysicsService:RegisterCollisionGroup(collisionGroupDoor)
-- Assegna parti ai gruppi di collisione
script.Parent.BallPart.CollisionGroup = collisionGroupBall
script.Parent.DoorPart.CollisionGroup = collisionGroupDoor
-- Imposta i gruppi come non collidibili tra loro e controlla il risultato
PhysicsService:CollisionGroupSetCollidable(collisionGroupBall, collisionGroupDoor, false)
print(PhysicsService:CollisionGroupsAreCollidable(collisionGroupBall, collisionGroupDoor)) --> falseCollisionGroupId
Color
Campioni di codice
Colore del Corpo della Salute del Personaggio
-- Incolla in uno Script all'interno di StarterCharacterScripts
-- Quindi gioca e prova la salute del tuo personaggio
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
-- Crea un colore effettuando un tweening in base alla percentuale della tua salute
-- Il colore passa da 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)CustomPhysicalProperties
Campioni di codice
Imposta ProprietàFisichePersonalizzate
local part = script.Parent
-- Questo renderà l'oggetto leggero e rimbalzante!
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 = physPropertiesElasticity
Friction
FrontParamA
FrontParamB
FrontSurfaceInput
LeftParamA
LeftParamB
LeftSurfaceInput
Locked
Campioni di codice
Sblocco Ricorsivo
-- Incolla in uno Script all'interno di un Modello che vuoi sbloccare
local model = script.Parent
-- Questa funzione ricorre attraverso l'gerarchia di un modello e sblocca
-- ogni parte che incontra.
local function recursiveUnlock(object)
if object:IsA("BasePart") then
object.Locked = false
end
-- Chiama la stessa funzione sui figli dell'oggetto
-- Il processo ricorsivo si ferma se un oggetto non ha figli
for _, child in pairs(object:GetChildren()) do
recursiveUnlock(child)
end
end
recursiveUnlock(model)Orientation
Campioni di codice
Spinner di Parti
local part = script.Parent
local INCREMENT = 360 / 20
-- Ruota continuamente la parte
while true do
for degrees = 0, 360, INCREMENT do
-- Imposta solo la rotazione dell'asse Y
part.Rotation = Vector3.new(0, degrees, 0)
-- Un modo migliore per fare questo sarebbe impostare CFrame
--part.CFrame = CFrame.new(part.Position) * CFrame.Angles(0, math.rad(degrees), 0)
task.wait()
end
endPivotOffset
Campioni di codice
Ripristina 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)Lancette dell'orologio
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
-- Crea il quadrante
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
-- Crea le lancette
local hourHand = createHand(7, 1, 0)
local minuteHand = createHand(10, 0.6, 0.1)
local secondHand = createHand(11, 0.2, 0.2)
-- Esegui l'orologio
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()
endResizeableFaces
Campioni di codice
Maniglie di Ridimensionamento
-- Posiziona questo Script in diversi tipi di BasePart, come
-- Part, TrussPart, WedgePart, CornerWedgePart, ecc.
local part = script.Parent
-- Crea un oggetto maniglie per questo componente
local handles = Instance.new("Handles")
handles.Adornee = part
handles.Parent = part
-- Specifica manualmente le facce applicabili per questa maniglia
handles.Faces = Faces.new(Enum.NormalId.Top, Enum.NormalId.Front, Enum.NormalId.Left)
-- In alternativa, usa le facce su cui il componente può essere ridimensionato.
-- Se il componente è un TrussPart con solo due dimensioni di dimensione
-- di lunghezza 2, allora le FacceRidimensionabili avranno solo due
-- facce abilitate. Per altri componenti, tutte le facce saranno abilitate.
handles.Faces = part.ResizeableFacesRightParamA
RightParamB
RightSurfaceInput
RotVelocity
Size
Campioni di codice
Costruttore di Piramidi
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
-- Esegui il tween da color0 a 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 = workspaceSpecificGravity
TopParamA
TopParamB
TopSurfaceInput
Transparency
Campioni di codice
Porta Sfumata
-- Incolla in uno Script all'interno di una parte alta
local part = script.Parent
local OPEN_TIME = 1
-- La porta può essere aperta in questo momento?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("Nero")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("Blu brillante")
end
local function onTouch(otherPart)
-- Se la porta era già aperta, non fare nulla
if debounce then
print("D")
return
end
-- Controlla se è stata toccata da un Humanoid
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("non umano")
return
end
-- Esegui la sequenza di apertura della porta
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()Velocity
Metodi
AngularAccelerationToTorque
ApplyAngularImpulse
ApplyImpulseAtPosition
BreakJoints
breakJoints
CanCollideWith
CanSetNetworkOwnership
Restituzioni
Campioni di codice
Controlla se la proprietà di rete di un Part può essere impostata
local part = workspace:FindFirstChild("Part")
if part and part:IsA("BasePart") then
local canSet, errorReason = part:CanSetNetworkOwnership()
if canSet then
print(part:GetFullName() .. " può cambiare la Proprietà di Rete!")
else
warn("Impossibile cambiare la Proprietà di Rete di " .. part:GetFullName() .. " perché: " .. errorReason)
end
endGetClosestPointOnSurface
GetConnectedParts
GetJoints
BasePart:GetJoints():Instances
Restituzioni
Instances
GetMass
getMass
GetNoCollisionConstraints
BasePart:GetNoCollisionConstraints():Instances
Restituzioni
Instances
GetRenderCFrame
GetRootPart
GetTouchingParts
BasePart:GetTouchingParts():Instances
Restituzioni
Instances
GetVelocityAtPosition
IntersectAsync
BasePart:IntersectAsync(
Parametri
parts:Instances |
| Valore predefinito: "Default" |
| Valore predefinito: "Automatic" |
Restituzioni
MakeJoints
makeJoints
Resize
Parametri
Restituzioni
resize
SetNetworkOwner
SetNetworkOwnershipAuto
BasePart:SetNetworkOwnershipAuto():()
Restituzioni
()
SubtractAsync
BasePart:SubtractAsync(
Parametri
parts:Instances |
| Valore predefinito: "Default" |
| Valore predefinito: "Automatic" |
Restituzioni
Campioni di codice
BasePart:SubtractAsync()
local Workspace = game:GetService("Workspace")
local mainPart = script.Parent.PartA
local otherParts = { script.Parent.PartB, script.Parent.PartC }
-- Esegui l'operazione di sottrazione
local success, newSubtract = pcall(function()
return mainPart:SubtractAsync(otherParts)
end)
-- Se l'operazione ha successo, posizionalo nella stessa posizione e impostalo come genitore nello spazio di lavoro
if success and newSubtract then
newSubtract.Position = mainPart.Position
newSubtract.Parent = Workspace
end
-- Distruggi le parti originali che rimangono intatte dopo l'operazione
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
endTorqueToAngularAcceleration
UnionAsync
BasePart:UnionAsync(
Parametri
parts:Instances |
| Valore predefinito: "Default" |
| Valore predefinito: "Automatic" |
Restituzioni
Campioni di codice
BasePart:UnionAsync()
local Workspace = game:GetService("Workspace")
local mainPart = script.Parent.PartA
local otherParts = { script.Parent.PartB, script.Parent.PartC }
-- Eseguire l'operazione di unione
local success, newUnion = pcall(function()
return mainPart:UnionAsync(otherParts)
end)
-- Se l'operazione ha successo, posizionalo nella stessa posizione e aggiungilo allo spazio di lavoro
if success and newUnion then
newUnion.Position = mainPart.Position
newUnion.Parent = Workspace
end
-- Distruggi le parti originali che rimangono intatte dopo l'operazione
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
endEventi
LocalSimulationTouched
OutfitChanged
StoppedTouching
Touched
Parametri
Campioni di codice
Conteggio Parti Tocchate
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("Contatto iniziato: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("Contatto terminato: " .. otherPart.Name)
numTouchingParts = numTouchingParts - 1
tl.Text = numTouchingParts
end
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)Modello Toccato
local model = script.Parent
local function onTouched(otherPart)
-- Ignora le istanze del modello che vengono a contatto con se stesse
if otherPart:IsDescendantOf(model) then
return
end
print(model.Name .. " è colliso con " .. otherPart.Name)
end
for _, child in pairs(model:GetChildren()) do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
end
endTouchEnded
Parametri
Campioni di codice
Conteggio Parti Tocchate
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("Contatto iniziato: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("Contatto terminato: " .. otherPart.Name)
numTouchingParts = numTouchingParts - 1
tl.Text = numTouchingParts
end
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)