BasePart 是一个抽象的基地
了解有关 BaseParts 如何被组成模拟的刚体,请参阅组合。
有很多与 BasePart (除了 Terrain 之外) 互动的对象,包括:
- Class.SurfaceGui 在零件的面上渲染 GuiObjects。 请参阅在体验中使用 UI 容器。
- Class.附件|附件 可以添加到一个 BasePart 来指定 CFrames 对零件的关系。这些通常由物理 0> Class.Limit0> 对象描述在 3> 机械限制3> 和 Attachments
概要
属性
确定是否是物理上移动不可的部件。
零件的组装角度的速度。
零件装配在世界空间中的中心。
零件的装配直线速度。
零件的装配总量。
对装置的根部分的引用。
确定零件的背面表面类型 (+Z 方向)。
确定零件底部面的表面类型(-Y 方向)。
确定零件的颜色。
确定世界上的 BasePart 的位置和方向。
确定零件是否会与其他零件碰撞。
确定是否在空间查询操作中考虑零件。
决定是否在 Touched 和 TouchEnded 事件触发部件。
是否或否决定零件是否投射阴影。
描述零件中心的位置在哪个世界位置。
描述零件碰撞群组的名称。
确定零件的颜色。
指示零件的当前物理属性。
确定零件的几个物理属性。
用于启用或禁用零件和组装件上的气动力。
Class.BasePart 的物理部分的 BasePart 。
在物理引擎的视角下,BasePart的实际物理大小。
确定零件前面的表面类型(-Z 方向)。
确定零件左面的表面类型(-X 方向)。
为 BasePart.Transparency 设置一个倍增器,该客户端只能看到本地客户端。
在 Studio 中选择零件。
描述零件的质量、密度和体积。
确定零件是否对其刚性身体的总质量或粒度有贡献。
确定零件的材质和默认物理属性。
Class.Material 的名称。
描述世界上部件的旋转。
指定零件的中心从其 CFrame 。
描述世界中部件的位置。
上次记录的物理更新时间。
确定零件反射天空盒子的程度。
描述允许通过“调整大小”方法描述的最小变更。
描述零件可以调整的面。
确定零件右侧的表面类型 (+X 方向)。
确定装配件的根部的主要规则。
三轴上的零件的旋转。
确定零件的尺寸 (长度、宽度、高度)。
确定零件的顶部面的表面类型 (+Y 方向)。
通过(反向)零件隐私度来确定零件的可见度。
方法
将角度冲击应用到装配件。
在装配的 center of mass 上应用脉冲。
将脉冲应用到指定位置的装配上。
返回零件是否可以相互碰撞。
检查您是否可以设置零件的网络所有权。
返回一个连接对象的零件表,通过任何类型的刚性关接头。
返回所有连接到此零件的关联或限制。
返回 Mass 属性的值。
返回当前玩家,这是网络的主人,或者在服务器的情况下为零。
如果游戏引擎自动决定网络所有者,返回 true。
返回零件组的基础部分。
返回包含所有 BasePart.CanCollide 真实零件的表。
返回该零件相对于此零件所给定位置的直线速度。
返回 true 如果对象连接到一个部件,它将在那里保持位置(例如 Class.BasePart.Anchored|Anchored 部件),否则返回 false。
就像使用 Studio 调整对象大小。
将给予的玩家作为网络所有者,为此和所有连接的部分。
让游戏引擎动态地决定谁将处理零件的物理(客户端或服务器之一)。
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
从零件和其他零件在给定数组列中交叉的几何图形中创建一个新的 IntersectOperation。
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
从零件中创建一个新的 UnionOperation ,减去指定数组列中零件所占的几何。
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
从零件中创建一个新的 UnionOperation ,还包括在指定的数组列中占用位置的零件。
获得 PVInstance 的枢轴。
形成 PVInstance 与所有的后代 PVInstances ,使 pivot 现在位于指定的 CFrame 。
活动
物理运动的结果是当一个部分停止触摸另一个部分。
物理运动的结果是当零件触摸到另一个零件时。
属性
Anchored
锚定 属性决定部件是否会按照物理学原理固定在一个位置。启用时,一部件的位置永远不会因重力、其他部件碰撞、交叉其他部件或其他物理相关原因而改变。因结果,两个锚定的部件将不会在相互之间触发 BasePart.Touched 事件。
固定部分仍然可以通过更改其 CFrame 或 Position 来移动,它仍然可以有一个非零 AssemblyLinearVelocity 和 1> Class.BasePart.AssemblyAngularVelocity|AssemblyLinearVelocity1> 。
最后,如果未锚定的部分与锚定的部分通过一个对象,例如 Weld ,它也会作为锚定的。如果该关联断裂,部分可能会受到物理学的影响。请参阅组合获取更多信息。
网络所有者无法在锚定部件上设置。如果服务器上的锚定状态发生变更,那么该部件的网络所有者将受影响。
代码示例
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
这部件的装配的角向速度ベクト。它是每秒钟的角向速度的改变率。
角度速度在整个装配过程中都一致。
直接设置速度可能会导致不实的移动。使用 Torque 或 AngularVelocity 限制是首选,或使用 BasePart:ApplyAngularImpulse() 如果您想要立即更改速度。
AssemblyCenterOfMass
一个位置通过 mass 和 position 的所有部分在装配中计算。
如果装配有锚定的部分,该部分的中心将是装配的中心,装配将有无限的质量。
知道中心的重量可以帮助装配保持稳定。 对中心的力应力与角度加速不会造成角度加速,只是直线。 有一个低中心的装配会在重力效果下保持稳定。
AssemblyLinearVelocity
此部件的装配中的直线速度向量。它是由装配的 center of mass 在每秒钟的速度变化。
如果您想要知道在装配中心以外的任何位置的速度,请使用 BasePart:GetVelocityAtPosition()。
直接设置速度可能会导致不实的移动。使用 VectorForce 限制,或使用 BasePart:ApplyImpulse() 如果您想要立即更改速度。
AssemblyMass
此部分的装配中,所有 parts 的 масс总和。零件 that 是 Class.BasePart.Massless|Massless 且不是装配的根部分,将不会为AssemblyMass 做贡献。
如果装配有锚定部分,装配的 mass 是无限的。 约束和其他物理交互,可能会导致 instabilities。
AssemblyRootPart
这个属性表示 BasePart 自动选择代表装置的根部分。它是与开发人员调用 GetRootPart() 相同的部分。
根部分可通过更改装配中的零件的 RootPriority 来改变。
所有共享相同AssemblyRootPart的零件都在同一个装配中。
了解有关根部的更多信息,请参阅组合。
BackSurface
BackSurface 属性确定零件的 +Z 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的表面。如果设置为“Motor”,BasePart.BackSurfaceInput 确定发动机的联接应该怎么行为。
大多数表面类型会在零件面上渲染一个材质,如果 BasePart.Material 设置为“塑料” 是。一些表面类型 - 关节、机器和步进电机 - 会在游戏世界中相似于 Class.SurfaceSelection 的 3D 装饰。如果这个属性在 属性 窗口中选择,它将在游戏世界中与 Class.SurfaceSelection 的 1 个相
代码示例
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
底表面属性确定零件的 -Y 方向的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的。如果设置为“Motor”,BasePart.BottomSurfaceInput 确定发动机的联接方式。
大多数表面类型会在零件面上渲染一个材质,如果 BasePart.Material 设置为“塑料” 是。一些表面类型 - 关节、机器和步进电机 - 会在游戏世界中相似于 Class.SurfaceSelection 的 3D 装饰。如果这个属性在 属性 窗口中选择,它将在游戏世界中与 Class.SurfaceSelection 的 1 个相
代码示例
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
BrickColor 属性确定零件的颜色。如果零件有一个 BasePart.Material ,这也会决定在渲染材质时使用的颜色。为了获得更多对颜色的控制,BasePart.Color 属性可以用 (它是 Color3 变体的这个属性)。如果 Color 设置,这个属性将使用最近的 BrickColor。
其他零件的视觉属性由 BasePart.Transparency 和 BasePart.Reflectance 决定。
代码示例
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
CFrame 属性确定了世界上 BasePart 的位置和方向。它作为对象在几何学上的任意引用位置,但 ExtentsCFrame 代表其实体中心的 1> Datatype.CFrame1>。
当在零件上设置 CFrame 时,其他加入的零件也会相对于零件移动,但建议您使用 PVInstance:PivotTo() 来移动整个模型,例如在传送玩家角色时。
与设置 BasePart.Position 不同,设置 BasePart.CFrame 将总是将零件移到准确的 CFrame ;在其他 words: 1> 无重叠检查是完成的1> ,物理解决器将尝试解决任何重叠,除非两个部分
对零件的 CFrame 和 Attachment 的位置进行跟踪可能有助于使用 Class. Attendance 。
代码示例
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 确定要与其他部件是否物理上互动。 禁用时,其他部件通过砖块不受中断。 用于装饰的部件通常有 CanCollide 已禁用,因为它们不需要被物理引擎考虑。
如果零件不是 BasePart.Anchored 且具有“Workspace.FallenPartsDestroyHeight”禁用,它可能会出世以最终被摧毁 by Class.Workspace.工作间allenPartsDestroyHeight。
禁用了CanCollide后,零件仍然会触发BasePart.Touched事件(包括其他零件也触发它)。您可以使用BasePart.CanTouch来禁用它。
了解有关碰撞的更多信息,请参阅碰撞。
代码示例
-- 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 可以确定零件是否在空间查询操作中被视为零件,例如 GetPartBoundsInBox 或 Raycast 。 CanCollide 必须也被禁用,当禁用 CanQuery 时。这些函数不会包含因 2>
除此之外,还可以使用 OverlapParams 或 RaycastParams 对象来调用空间查询函数时,来排除与给定列表中的零件的子集。
CanTouch
此属性确定 whether Touched
注意,此碰撞逻辑可以通过 Clas工作间.Workspace.TouchesUseCollisionGroups 属性设置为 Workspace.TouchesUseCollisionGroups 群组 true 通过。如果 2>true2>,非 collisions 群组的零件将在 5>和5> 触摸事件之间忽略 both collisions ,从而使此属性无效。
性能
当零件具有 both CanTouch 和 CanCollide 设置为 false 时,因为这些零件永远不需要计算任何类型的零件碰撞。但它们仍然
CastShadow
是否或否决定零件是否投射阴影。
注意,该功能不是为了性能提高而设计的。它只应该在你想要隐藏零件阴影的部件上禁用。禁用此属性对于该部件可能会导致视觉艺术效果在阴影上 cast 。
CenterOfMass
中心OfMass 属性描述了零件的中心 of mass 位置。如果这是一个单个部件的组合,这是从世界空间转换到本地的 AssemblyCenterOfMass 。 在简单的 AssemblyCenterOfMass 上,中心 of mass 总是 (0,0,0)。它可以变为 Class.
CollisionGroup
Class.BasePart.CollisionGroup|CollisionGroup 属性描述零件的冲突组 (最多 100 个字符) 的名称。零件从默认组开始 (默认组的名称为 “"Default"”) 。此值不能为空。
尽管这个属性本身不是复制品,但引擎内部复制值通过另一个私人属性解决后端兼容问题。
代码示例
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
颜色属性确定零件的颜色。如果零件有一个 BasePart.Material,这也会决定在渲染材质时使用的颜色。如果该属性已设置, BasePart.BrickColor 将使用 Color3 值最近的 BrickColor 来决定使用的颜色。
其他零件的视觉属性由 BasePart.Transparency 和 BasePart.Reflectance 决定。
代码示例
-- 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
当前物理属性显示当前部件的物理属性。您可以为每个部件设置自定义物理属性,自定义材料,并且对材料进行覆盖。引擎优先考虑在确定零件有效物理属性时最高级的定义。以下列表中的值是按照从高到低的优先级排列的:
- 零件的自定义物理属性
- 零件自定义材料的自定义物理属性
- 自定义物理属性的零件材料覆盖
- 零件材料的默认物理属性
CustomPhysicalProperties
自定义物理属性允许您定制Part的各个物理属性,例如其密度、摩擦力和弹性。
启用时,此属性允许您配置这些物理属性。如果未启用,这些物理属性是由零件的 BasePart.Material 决定的。页面 Enum.Material 包含各种零件材料的列表。
代码示例
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
FrontSurface
前表面属性确定零件的 -Z 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的表面。如果设置为“Motor”,BasePart.FrontSurfaceInput 确定发动机的联接方式。
如果 BasePart.Material 设置为“塑料”,大多数表面类型都会渲染在零件面上。一些表面类型,包括枢轴、机器和步进机,会在游戏世界中类似于SurfaceSelection 的 3D 装饰。如果在属性窗口中选择此属性,它将在游戏世界中与Class.SurfaceSelection的
代码示例
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
左表面属性确定零件的 -X 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的BasePart.LeftSurfaceInput。如果设置为“Motor”,Class.BasePart.LeftSurfaceInput 确定零件的共同行为。
如果 BasePart.Material 设置为“塑料”,大多数表面类型都会渲染在零件面上。一些表面类型,包括枢轴、机器和步进机,会在游戏世界中类似于SurfaceSelection 的 3D 装饰。如果在属性窗口中选择此属性,它将在游戏世界中与Class.SurfaceSelection的
代码示例
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
Class.BasePart.LocalTransparency 属性是 BasePart.Transparency 的倍增器,该属性仅对本地客户端可见。它不会从客户端到服务器复制,并且对于特定客户端无法渲染的部分,例如玩家在第一人称模式下不能见到他们的角色身体部分。
这个属性通过以下方式修改本地部件的透明度,并使其在 0 和 1 之间进行调整,
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>
透明度 | 本地透明度调整器 | 服务器端透明度 | 客户端透明度 |
---|
Locked
锁定属性确定是否在 Roblox Studio 通过单击它来选择 (或在 part (或在 model 中)是否选择。 此属性通常在环境模型中的零件中启用。 Roblox Studio 有一个锁定/解锁所有工具,可以在当前模型中切换锁定状态。
代码示例
-- 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)
Massless
如果该属性已打开,BasePart 将不会在它的装配体中的总质量或粒度上贡献任何贡献,直到它被焊接到另一个有质量的部件上。
如果零件是根据 AssemblyRootPart 的根,这将为该零件忽略,它仍然会为其提供装配性能和隔离性,就像其他部分一样。如果零件无重量的零件,它们永远不会成为装配根部分,直到所有其他部分都无重量。
这可能对于车辆上的可选配件不是很有用,例如你不想影响车辆操纵的简易碰撞网格。
还请参阅组合,这是一个描述根部件和如何使用它们的文章。
Material
材料属性允许建筑师设置零件的材质和默认物理属性(在BasePart.CustomPhysicalProperties未设置的情况下)。默认塑料材质具有很轻的材质,而 SmoothPlastic 材质完全没有纹理。一些材质的材质,例如钻石板和花岗岩,具有非常明显的材质。每种材质的材质都会随着钢板的不同而反
设置此属性,然后启用 BasePart.CustomPhysicalProperties 将使用材料的默认物理属性。例实例,钻石板是一个很密的材料,而木材是一个很轻的材料。一部分的密度决定它在地形水中漂浮。
玻璃材料在适中的图形设置上改变渲染行为。它应用一些反射性(类似于 BasePart.Reflectance)和视角歪曲。效果特别明显在球形零件上(将 BasePart.Shape 设置为球)。半透明对象和玻璃部分在玻璃后不可见。
代码示例
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
系统使用指定的 MaterialVariant 名称和 BasePart.Material 类型搜索 MaterialService 实例。如果找到匹配的 MaterialVariant 实例,它将使用此 MaterialVariant 实例来替换默认材料。默认材料可以是内置材料或指定的 MaterialVariant 类输入。
Orientation
方向属性描述方向在 X、Y 和 Z 轴上的旋转度数,使用 Vector3 应用。旋转都是在 Y → X → Z 顺序使用。这与正确的
当设置此属性任何 Welds 或 Motor6Ds 连接到此部件时,将有相应的 C0 或 2>Class.JointInstance.C1|C12> 属性更新,允许该部件相对于任
焊接约束也将在移动工具动期间被禁用并重新启用。
代码示例
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
此属性指定零件的中心偏移从其 CFrame ,其中 part:GetPivot() 与 part.CFrame * part.PivotOffset 相同。
这很方便地将枢轴设置在 本地 空间中,但将零件的枢轴设置在 世界 空间中可以执行如下操作:
local part = workspace.BluePartlocal desiredPivotCFrameInWorldSpace = CFrame.new(0, 10, 0)part.PivotOffset = part.CFrame:ToObjectSpace(desiredPivotCFrameInWorldSpace)
代码示例
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
位置属性描述使用 part 的坐标来表示 Vector3 的位置。它反映部件的 BasePart.CFrame 位置,但也可以设置。
当设置此属性任何 Welds 或 Motor6Ds 连接到此部件时,将有相应的 C0 或 2>Class.JointInstance.C1|C12> 属性更新,允许该部件相对于任
焊接约束也将在移动工具动期间被禁用并重新启用。
Reflectance
反射率属性决定part反射天空盒子的程度。一个值为 0 表示零,一个值为 1 表示完全反射。
反射率不受 BasePart.Transparency 影响,除非零件完全透明,否则反射率不会渲染。反射率可能会或不会被忽略,这取决于零件的 BasePart.Material。
代码示例
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
调整大小增量属性是一个只读的属性,描述 BasePart:Resize() 方法可以允许的最小变更大小的描述。它与 BasePart 抽象类型实现不同。例实例, Part 有此设置为 1,1> Class.
代码示例
-- 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
Class.BasePart 的大小可以调整,用于调整零件的大小。在 BasePart 和 Class.W
代码示例
-- 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
RightSurface 属性确定零件的 +X 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的表面。如果设置为“Motor”,BasePart.RightSurfaceInput 确定了一个引擎的关键。
大多数表面类型会在零件面上渲染一个材质,如果 BasePart.Material 设置为“塑料” ,那么一些表面类型包括关节、机器和步进电机会渲染一个 3D 装饰。 如果此属性在 属性 窗口中选择,它将在游戏世界中与 SurfaceSelection 的样子相似。
代码示例
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
此属性是一个数量在 -127 和 127 之间的整数,取得根部分排序的所有其他规则的优先权。当考虑多个不是 Anchored 和共享相同的 Massless 值的部分时,高级 RootPrivile
您可以使用此属性来控制装配件的哪个部分是根部分,如果大小发生变更,可以保持根部分稳定。
还请参阅组合,这是一个描述根部件和如何使用它们的文章。
Rotation
三轴上的零件的旋转。
当设置此属性任何 Welds 或 Motor6Ds 连接到此部件时,将有相应的 C0 或 2>Class.JointInstance.C1|C12> 属性更新,允许该部件相对于任
焊接约束也将在移动工具动期间被禁用并重新启用。
Size
零件的 Size 属性确定其 视觉 尺寸,而 ExtentsSize 代表物理引擎使用的实际尺寸,例如在
零件的大小决定了它的质量,它的大小由 BasePart:GetMass() 决定。一个零件的 Size 被多个其他对象使用:
- ParticleEmitter 用于确定粒子从哪里生成的区域。
- BlockMesh 用于部分地确定渲染方块棱镜。
- SpecialMesh 对于特定 MeshTypes,用于确定渲染网格的大小。
- SurfaceLight 用于确定要照亮的空间。
代码示例
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
顶表面属性确定零件的 +Y 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的表面。如果设置为“Motor”,BasePart.TopSurfaceInput 确定发动机的共同行为。
大多数表面类型会在零件面上渲染一个材质,如果 BasePart.Material 设置为“塑料” 是。一些表面类型 - 关节、机器和步进电机 - 会在游戏世界中相似于 Class.SurfaceSelection 的 3D 装饰。如果这个属性在 属性 窗口中选择,它将在游戏世界中与 Class.SurfaceSelection 的 1 个相
代码示例
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
透明度属性控制零到1的零件的可见度,其中0完全可见(不透明),值1完全不可见(不透明)。
BasePart.Reflectance 可以减少砖块的总透明度,如果将其设置为 1 附近的值。
尽管不透明零件不会在全部何情况下渲染,但部分半透明对象有一些显著的渲染成本。有许多半透明零件可能会减慢游戏的性能。
当透明零件交叉时,渲染顺序可能会变得不可预知 - 请尝试使半透明零件从交叉中保持透明,以避免这种情况。
Class.BasePart.LocalTransparency 是一个只对本地客户端可见的透明度修改器。
代码示例
-- 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)
方法
AngularAccelerationToTorque
参数
返回
ApplyAngularImpulse
应用角度力瞬间强度对该部件的装配,使装配旋转。
由导ulse产生的角度速度受到装配体的 mass 的影响。因此,需要更大的导ulse才能移动更大的装配体。导ulse 有助于在您想要立即施加力的情况下,例如爆炸或碰撞。
如果零件是由服务器拥有 的,此功能必须从服务器 Script (不是从 Class.
参数
力量向量,应用于装配工序作为脉冲。
返回
ApplyImpulse
此函数将立即的驱动力脉冲应用到这部件的装配。
力应用在装配的 center of mass ,因此结果的移动只是直线。
由 impulse导致的速度受到装配工序的 mass 的影响。因此,需要更大的 impulse才能移动更大的装配工序。 impulses 对于您想要立即施加力的情况有用,例如爆炸或碰撞。
如果零件是由服务器拥有 的,此功能必须从服务器 Script (不是从 Class.
参数
力量向量,应用于装配工序作为脉冲。
返回
ApplyImpulseAtPosition
此函数将即时的驱动力脉冲应用到该部件的装配,在世界空间的指定位置。
如果位置不在装配工序的 center of mass ,那么,脉冲会导致位置和旋转运动。
由 impulse导致的速度受到装配工序的 mass 的影响。因此,需要更大的 impulse才能移动更大的装配工序。 impulses 对于开发人员想要立即施加力的情况有用,例如爆炸或碰撞。
如果零件是由服务器拥有 的,此功能必须从服务器 Script (不是从 Class.
参数
返回
CanCollideWith
返回零件是否可以相互碰撞。 此函数考虑到两个零件的碰撞群。 此函数将在指定的零件不是 BasePart 的情况下发生错误。
参数
检查是否可以拥有的部分。
返回
零件是否可以相互碰撞。
CanSetNetworkOwnership
CanSetNetworkOwnership 函数检查您是否可以设置零件的网络所有权。
该函数的返回值验证您是否可以调用 BasePart:SetNetworkOwner() 或 BasePart:SetNetworkOwnershipAuto() 而不会遇到错误。它返回 true 如果您可以修改/读取网络所有权,或返回 false 和理由,为字符串。
返回
您可以修改或读取网络的所有权和原因。
代码示例
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
返回一个连接对象的零件表,通过任何类型的刚性关接头。
如果 recursive 是真的,这个函数将返回基地零件的所有部分。
刚性关节
当两个部分连接在一起时,(Part0 → Part1),一个共同体是硬 如果Part1 的物理学完全被2> Part02> 锁定,这只适用于以下共同体类型:
参数
返回
GetJoints
返回所有连接到此零件的关联或限制。
返回
一个连接到零件的所有共同或限制的阵列。
GetMass
GetMass 返回 read-only Mass 属性的值。
此函数先前于“Mass”属性。它仍然支持与兼容性,您应该使用“Mass”属性直接。
返回
零件的质量。
代码示例
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)
GetNoCollisionConstraints
返回
GetRootPart
返回组装的基础部分。 使用 CFrame 移动一个组装的零件时,很重要地移动这个基础部分(这将移动所有与它相关的零件)。 更多信息可以在 组装 文章中查看。
此函数先前于 AssemblyRootPart 属性。它仍然支持向后兼容,但您应该使用 AssemblyRootPart 直接。
返回
装配的基本部分(连接在一起的零件集)。
GetTouchingParts
返回包含所有物理交互部件的表。如果零件本身设置为 false,则此函数将返回一个空表,除非零件有 Class.TouchTransmitter|TouchInterest
返回
用于表示和描述与此部分可能相互碰撞的所有部分的表。
GetVelocityAtPosition
返回该部件的组装在指定位置相对于该部件的实际位置的直线速度。它可以用于识别根部件以外的任何位置的直线速度。如果组装没有角度速度,那么直线速度将在每个位置都一致。
参数
返回
IsGrounded
如果对象连接到一个部件,该部件将它固定在一个地方 (例如一个 Anchored 部件),否则返回 false。在有 Anchored 部件的装配中,每个其他部件都是固定的。
返回
是否连接到将其固定在位场景的部件。
Resize
就像使用 Studio 调整对象大小。
参数
要调整大小的页面。
在指定的侧面上长大/缩小。
返回
是否要调整零件的大小。
SetNetworkOwner
将给予的玩家作为网络所有者为这个和所有连接的部分。当玩家实例为零时,服务器将作为所有者而不是玩家。
参数
玩家被给予网络拥有部分的网络所有权。
返回
SetNetworkOwnershipAuto
让游戏引擎动态地决定谁将处理零件的物理(客户端或服务器之一)。
返回
IntersectAsync
从零件和其他零件在给定数组列中的交叉图中创建一个新的 IntersectOperation 。 只有 Parts 支持,不是 Class.Terrain 或 1> Class.MeshPart|MeshParts1> 。
调用部分的以下属性将适用于结果中的 IntersectOperation:
- 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
在下面的图像比较中,IntersectAsync() 使用包含蓝色块的表调用紫色的方砖块。结果的IntersectOperation 解决为两个部分的交叉几何形状。
注释
- 如果交叉操作将导致超过 20,000 个三角形的零件,它将简化为 20,000 个三角形。
参数
返回
结果 IntersectOperation 使用默认名称 交叉 。
SubtractAsync
从零件中创建一个新的 UnionOperation 零件,减去占位零件在给定数组列中所占的几何。 只有 Parts 是支持的,不是 Terrain 或 1> Class.MeshPart|MeshParts
注意,结果的联合不能由于减法而为空。如果操作将导致完全空的几何体,它将会失败。
在以下图像比较中,SubtractAsync() 使用包含紫色砖块的表调用蓝色圆柱。结果的 UnionOperation 以形状结构为代码,从该圆砖块的几何形状解决为可以从该圆柱的几何形状解决的形式。
参数
参与摧毁的对象。
结果 Enum.CollisionFidelity 的 UnionOperation 值。
结果 Enum.RenderFidelity 的 PartOperation 值。
返回
结果 UnionOperation 用默认名称 联合 。
代码示例
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
从零件中创建一个新的 UnionOperation ,并且在指定的数组列中占用零件。 只有 Parts 支持,不是 Terrain 或 1> Class.MeshPart|MeshParts1> 。 与
调用部分的以下属性将适用于结果的 UnionOperation:
- 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
在下图中,UnionAsync() 使用包含紫色圆柱体的表调用蓝色块。结果的UnionOperation 解决为两个部分的组合几何形状。
注释
- 如果联合操作将导致一个部分超过 20,000 个三角形,它将简化为 20,000 个三角形。
参数
参与调用方的对象。
结果 Enum.CollisionFidelity 的 UnionOperation 值。
结果 Enum.RenderFidelity 的 PartOperation 值。
返回
结果 UnionOperation 用默认名称 联合 。
代码示例
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
活动
TouchEnded
在触摸其他部件时,当一个部件停止触摸另一个部件时,它会发生。
此事件与 Workspace.TouchesUseCollisionGroups 合作,以确定是否要认证 CollisionGroups 作为检测。
参数
代码示例
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
触摸事件发生,当零件与另一个零件接触时。例实例,如果 零件A 撞到 零件B,那么 Class.BasePart.Touched|PartA.Touched 就会发生 2> PartB2> ,而
此事件仅发生于物理运动的结果,因此在 CFrame 属性被更改为覆盖另一个部分时,它不会发生。这也意味着在碰撞时至少一个部分必须不是 Class.BasePart.Anchored|Anchored 。
此事件与 Workspace.TouchesUseCollisionGroups 合作,以确定是否要认证 CollisionGroups 作为检测。
参数
与给定部分接触的其他部分。
代码示例
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