概要
屬性
方法
活動
StoppedTouching(otherPart: BasePart):RBXScriptSignal |
Touched(otherPart: BasePart):RBXScriptSignal |
TouchEnded(otherPart: BasePart):RBXScriptSignal |
範例程式碼
平滑阻尼一個部件的 CFrame
local TweenService = game:GetService("TweenService")
-- 創建一個部件和目標
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)
-- 設置一個變量來存儲速度
local velocity = CFrame.new()
-- 調整平滑速度
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)API 參考
屬性
Anchored
範例程式碼
部件固定切換
local part = script.Parent
-- 創建一個 ClickDetector,以便我們可以知道何時點擊部件
local cd = Instance.new("ClickDetector", part)
-- 此函數根據部件的 Anchored 狀態更新部件的外觀
local function updateVisuals()
if part.Anchored then
-- 當部件被固定時...
part.BrickColor = BrickColor.new("Bright red")
part.Material = Enum.Material.DiamondPlate
else
-- 當部件未被固定時...
part.BrickColor = BrickColor.new("Bright yellow")
part.Material = Enum.Material.Wood
end
end
local function onToggle()
-- 切換固定屬性
part.Anchored = not part.Anchored
-- 更新磚塊的視覺狀態
updateVisuals()
end
-- 更新,然後開始監聽點擊
updateVisuals()
cd.MouseClick:Connect(onToggle)BackParamA
BackParamB
BackSurfaceInput
BottomParamA
BottomParamB
BottomSurfaceInput
brickColor
CanCollide
範例程式碼
淡化門
-- 粘貼到一個高部件內的腳本中
local part = script.Parent
local OPEN_TIME = 1
-- 此時門可以打開嗎?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("黑色")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("亮藍色")
end
local function onTouch(otherPart)
-- 如果門已經打開,則不執行任何操作
if debounce then
print("D")
return
end
-- 檢查是否被人形觸碰
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("不是人形")
return
end
-- 執行門打開序列
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()CFrame
範例程式碼
設定部件的 CFrame
local part = script.Parent:WaitForChild("Part")
local otherPart = script.Parent:WaitForChild("OtherPart")
-- 將部件的 CFrame 重置為 (0, 0, 0) 並沒有旋轉。
-- 這有時被稱為「身份」CFrame
part.CFrame = CFrame.new()
-- 設定為特定位置 (X, Y, Z)
part.CFrame = CFrame.new(0, 25, 10)
-- 與上面相同,但使用 Vector3
local point = Vector3.new(0, 25, 10)
part.CFrame = CFrame.new(point)
-- 設定部件的 CFrame 在某個點,看向另一個點
local lookAtPoint = Vector3.new(0, 20, 15)
part.CFrame = CFrame.lookAt(point, lookAtPoint)
-- 在本地 X 軸上將部件的 CFrame 旋轉 pi/2 弧度
part.CFrame = part.CFrame * CFrame.Angles(math.pi / 2, 0, 0)
-- 在本地 Y 軸上將部件的 CFrame 旋轉 45 度
part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(45), 0)
-- 在全局 Z 軸上將部件的 CFrame 旋轉 180 度(注意順序!)
part.CFrame = CFrame.Angles(0, 0, math.pi) * part.CFrame -- Pi 弧度等於 180 度
-- 組合兩個 CFrame 是使用 *(乘法運算符)
part.CFrame = CFrame.new(2, 3, 4) * CFrame.new(4, 5, 6) --> 等於 CFrame.new(6, 8, 10)
-- 與代數乘法不同,CFrame 組合不是交換的:a * b 不一定等於 b * a!
-- 想像 * 為一系列有序的動作。例如,以下幾行會產生不同的 CFrame:
-- 1) 在 X 軸上平移部件 5 個單位。
-- 2) 將部件繞其 Y 軸旋轉 45 度。
part.CFrame = CFrame.new(5, 0, 0) * CFrame.Angles(0, math.rad(45), 0)
-- 1) 將部件繞其 Y 軸旋轉 45 度。
-- 2) 在 X 軸上平移部件 5 個單位。
part.CFrame = CFrame.Angles(0, math.rad(45), 0) * CFrame.new(5, 0, 0)
-- 沒有「CFrame 除法」,而是簡單地「執行相反操作」。
part.CFrame = CFrame.new(4, 5, 6) * CFrame.new(4, 5, 6):Inverse() --> 等於 CFrame.new(0, 0, 0)
part.CFrame = CFrame.Angles(0, 0, math.pi) * CFrame.Angles(0, 0, math.pi):Inverse() --> 等於 CFrame.Angles(0, 0, 0)
-- 相對於另一個部件設定位置(在這個案例中,將我們的部件放在 otherPart 上方)
part.CFrame = otherPart.CFrame * CFrame.new(0, part.Size.Y / 2 + otherPart.Size.Y / 2, 0)CollisionGroup
範例程式碼
PhysicsService:RegisterCollisionGroup
local PhysicsService = game:GetService("PhysicsService")
local collisionGroupBall = "CollisionGroupBall"
local collisionGroupDoor = "CollisionGroupDoor"
-- 註冊碰撞組
PhysicsService:RegisterCollisionGroup(collisionGroupBall)
PhysicsService:RegisterCollisionGroup(collisionGroupDoor)
-- 將部件指派給碰撞組
script.Parent.BallPart.CollisionGroup = collisionGroupBall
script.Parent.DoorPart.CollisionGroup = collisionGroupDoor
-- 設定組別為彼此不可碰撞並檢查結果
PhysicsService:CollisionGroupSetCollidable(collisionGroupBall, collisionGroupDoor, false)
print(PhysicsService:CollisionGroupsAreCollidable(collisionGroupBall, collisionGroupDoor)) --> falseCollisionGroupId
Color
範例程式碼
角色健康身體顏色
-- 將其粘貼到 StarterCharacterScripts 中的腳本內
-- 然後玩遊戲,並調整你角色的健康
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
-- 根據你的健康百分比進行插值創建顏色
-- 顏色從 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
範例程式碼
設置自訂物理屬性
local part = script.Parent
-- 這會使零件變得輕且有彈性!
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
範例程式碼
遞迴解鎖
-- 粘貼到您想要解鎖的模型中的腳本
local model = script.Parent
-- 此函數遞迴遍歷模型的層級並解鎖
-- 每個遇到的部件。
local function recursiveUnlock(object)
if object:IsA("BasePart") then
object.Locked = false
end
-- 在物件的子項上調用相同的函數
-- 如果物件沒有子項,遞迴過程將停止
for _, child in pairs(object:GetChildren()) do
recursiveUnlock(child)
end
end
recursiveUnlock(model)Orientation
範例程式碼
部件旋轉器
local part = script.Parent
local INCREMENT = 360 / 20
-- 持續旋轉部件
while true do
for degrees = 0, 360, INCREMENT do
-- 只設置 Y 軸的旋轉
part.Rotation = Vector3.new(0, degrees, 0)
-- 更好的做法是設置 CFrame
--part.CFrame = CFrame.new(part.Position) * CFrame.Angles(0, math.rad(degrees), 0)
task.wait()
end
endPivotOffset
範例程式碼
重置樞紐
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
-- 創建刻度盤
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
-- 創建指針
local hourHand = createHand(7, 1, 0)
local minuteHand = createHand(10, 0.6, 0.1)
local secondHand = createHand(11, 0.2, 0.2)
-- 運行時鐘
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樞紐偏移
local Workspace = game:GetService("Workspace")
local bluePart = Instance.new("Part")
bluePart.Name = "BluePart"
bluePart.Parent = Workspace
local part = Workspace.BluePart
local desiredPivotCFrameInWorldSpace = CFrame.new(0, 10, 0)
part.PivotOffset = part.CFrame:ToObjectSpace(desiredPivotCFrameInWorldSpace)ResizeableFaces
範例程式碼
調整手柄
-- 將此腳本放入幾種 BasePart 中,例如
-- Part、TrussPart、WedgePart、CornerWedgePart 等。
local part = script.Parent
-- 為此部件創建一個 handles 物件
local handles = Instance.new("Handles")
handles.Adornee = part
handles.Parent = part
-- 手動指定適用於此手柄的面
handles.Faces = Faces.new(Enum.NormalId.Top, Enum.NormalId.Front, Enum.NormalId.Left)
-- 或者,使用部件可以調整大小的面。
-- 如果部件是只有兩個大小維度的 TrussPart,
-- 長度為 2,則 ResizeableFaces 只會有兩個
-- 啟用的面。對於其他部件,所有面都將被啟用。
handles.Faces = part.ResizeableFacesRightParamA
RightParamB
RightSurfaceInput
RotVelocity
Size
範例程式碼
金字塔建造者
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
-- 從 color0 和 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
範例程式碼
淡化門
-- 粘貼到一個高部件內的腳本中
local part = script.Parent
local OPEN_TIME = 1
-- 此時門可以打開嗎?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("黑色")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("亮藍色")
end
local function onTouch(otherPart)
-- 如果門已經打開,則不執行任何操作
if debounce then
print("D")
return
end
-- 檢查是否被人形觸碰
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("不是人形")
return
end
-- 執行門打開序列
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()Velocity
方法
AngularAccelerationToTorque
返回
範例程式碼
角加速度轉矩
local part = Instance.new("Part")
part.Parent = workspace
local angularVelocity = part.AssemblyAngularVelocity
local desiredAcceleration = Vector3.new(0, 10, 0)
-- 計算達到所需加速度所需的轉矩
local torque = part:AngularAccelerationToTorque(desiredAcceleration, angularVelocity)ApplyImpulseAtPosition
BreakJoints
breakJoints
CanSetNetworkOwnership
返回
範例程式碼
檢查一個部件的網路擁有權是否可以設置
local part = workspace:FindFirstChild("Part")
if part and part:IsA("BasePart") then
local canSet, errorReason = part:CanSetNetworkOwnership()
if canSet then
print(part:GetFullName() .. " 的網路擁有權可以更改!")
else
warn("無法更改 " .. part:GetFullName() .. " 的網路擁有權,因為: " .. errorReason)
end
endGetClosestPointOnSurface
GetConnectedParts
GetJoints
BasePart:GetJoints():Instances
返回
Instances
GetMass
getMass
GetNoCollisionConstraints
BasePart:GetNoCollisionConstraints():Instances
返回
Instances
GetRenderCFrame
GetRootPart
GetTouchingParts
BasePart:GetTouchingParts():Instances
返回
Instances
GetVelocityAtPosition
IntersectAsync
BasePart:IntersectAsync(
參數
parts:Instances |
| 預設值:"Default" |
| 預設值:"Automatic" |
返回
MakeJoints
makeJoints
Resize
參數
返回
resize
SetNetworkOwner
SetNetworkOwnershipAuto
BasePart:SetNetworkOwnershipAuto():()
返回
()
SubtractAsync
BasePart:SubtractAsync(
參數
parts:Instances |
| 預設值:"Default" |
| 預設值:"Automatic" |
返回
TorqueToAngularAcceleration
返回
範例程式碼
扭矩轉換為角加速度
local part = Instance.new("Part")
part.Parent = workspace
local angularVelocity = part.AssemblyAngularVelocity
local appliedTorque = Vector3.new(0, 100, 0)
-- 根據這個扭矩預測角加速度
local angAccel = part:TorqueToAngularAcceleration(appliedTorque, angularVelocity)UnionAsync
BasePart:UnionAsync(
參數
parts:Instances |
| 預設值:"Default" |
| 預設值:"Automatic" |
返回
活動
LocalSimulationTouched
OutfitChanged
StoppedTouching
Touched
參數
範例程式碼
接觸零件數量
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("接觸開始: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("接觸結束: " .. 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)
-- 忽略模型與自身接觸的實例
if otherPart:IsDescendantOf(model) then
return
end
print(model.Name .. " 與 " .. otherPart.Name .. " 碰撞")
end
for _, child in pairs(model:GetChildren()) do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
end
endTouchEnded
參數
範例程式碼
接觸零件數量
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("接觸開始: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("接觸結束: " .. otherPart.Name)
numTouchingParts = numTouchingParts - 1
tl.Text = numTouchingParts
end
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)