除非 UI 对象受 布局结构 或 大小修饰符/约束 的控制,否则您可以完全控制它们的 位置 和 大小。您还可以设置 Z‑index 层叠 顺序,以确定对象的重叠顺序。
核心属性
所有 GuiObjects 共享一组核心属性,以 定位、调整大小、锚点 和 层级 它们在屏幕内或游戏中的容器内。
位置
Position 属性是一个 UDim2 坐标集,用于沿 X 和 Y 轴定位对象。UDim2 由每个轴的 Scale 和 Offset 值表示:

要编辑选定的 GuiObject 的位置,请单击 属性 窗口中的 位置 字段,并输入新的 UDim2 坐标集。


大小
Size 属性是一个 UDim2 坐标集,用于沿 X 和 Y 轴调整对象的大小。UDim2 由每个轴的 Scale 和 Offset 值表示:
- Scale — 表示容器在相应轴上的 百分比 大小的值,加上任何 Offset 值。
- Offset — 表示对象在相应轴上的 像素 大小的值,加上任何 Scale 值。
要编辑选定的 GuiObject 的大小,请单击 属性 窗口中的 大小 字段,并输入新的 UDim2 坐标集。


AnchorPoint
AnchorPoint 属性定义了对象更改 位置 和 大小 的 原点。默认的 AnchorPoint 值为 (0, 0),这将锚点放置在对象的左上角。
AnchorPoint 值是从 0 到 1 的 分数,相对于对象的 大小,这意味着具有 AnchorPoint 值 (0.5, 0.5) 的对象将锚点放置在对象的水平和垂直中间(50%),对其 位置 或 大小 的任何更改都将从此点向外移动和缩放。


要查看和编辑选定的 GuiObject 的锚点:
ZIndex
ZIndex 属性定义了 GuiObjects 渲染和重叠的层级顺序。如果您想创建新的渲染层,必须为每个对象将 ZIndex 属性设置为不同的正整数或负整数值。
对于像 ScreenGui 这样的 UI 容器,默认的 ZIndexBehavior 始终将子对象渲染在其父对象之上,并且每个子对象的 ZIndex 用于决定其在其他对象之上渲染的顺序。
要编辑对象的 ZIndex,请在 属性 窗口中找到 ZIndex 并输入一个新的整数值。

布局结构
布局结构使您能够快速组织和显示 GuiObjects,例如,形成水平或垂直的 列表、均匀大小的瓷砖 网格、页面序列 等。布局通常会覆盖或影响其控制下对象的 位置/大小。
| 布局 | 描述 |
|---|---|
| 列表 | UIListLayout 将兄弟 GuiObjects 定位为其父容器内的水平行或垂直列。 |
| 网格 | UIGridLayout 将兄弟 GuiObjects 定位为其父容器内均匀大小的单元格网格。 |
| 表格 | UITableLayout 将兄弟 GuiObjects 及其子对象定位为表格格式。 |
| 页面 | UIPageLayout 将其兄弟 GuiObjects 组织为独特的页面,您可以通过脚本进行过渡。 |
跨平台因素
Roblox 本质上是 跨平台 的,因为玩家可以在手机或平板电脑上发现并加入游戏,然后在 PC 或控制台上继续他们的游戏进度。您应该设计您的 Roblox 游戏,使其在您选择支持的 所有 平台上都可访问和愉快,而不是针对一个平台进行优化而忽视其他平台。
保留区域
在移动设备上,默认控件占据屏幕左下角和右下角的一部分。当您设计游戏的 UI 时,避免在这些区域放置重要信息或虚拟按钮。

拇指区域
大多数移动玩家使用两个拇指 — 一个在虚拟摇杆上,另一个在跳跃按钮上。根据设备的物理大小和玩家的手,过于远离底角会变得不舒服或不可能,因此您应该避免将常用按钮放置在难以触及的区域之外。


请记住,舒适的拇指区域在手机和平板电脑之间是不同的,因为平板电脑的屏幕更大。放置在屏幕顶部边缘下方 40% 的按钮在手机上可触及,但在平板电脑上几乎无法触及。


在手机和平板电脑上可靠的方法是将自定义按钮 相对 定位在常用控件附近,例如默认的跳跃按钮,将它们放置在易于触及的范围内。

以下代码放置在 StarterPlayerScripts 中的客户端脚本中,获取跳跃按钮的位置并在其左侧创建一个占位符 按钮 ,距离其 20 像素。
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
if UserInputService.TouchEnabled then
-- 等待跳跃按钮完全加载
while not (playerGui:FindFirstChild("JumpButton", true) and playerGui:FindFirstChild("JumpButton", true).IsLoaded) do
task.wait()
end
local jumpButton = playerGui:FindFirstChild("JumpButton", true)
-- 将新的自定义按钮放置在跳跃按钮的左侧
local customButton = Instance.new("ImageButton")
customButton.AnchorPoint = Vector2.new(1, 1)
customButton.Size = UDim2.fromOffset(jumpButton.Size.X.Offset * 0.8, jumpButton.Size.Y.Offset * 0.8)
customButton.Position = jumpButton.Position + UDim2.fromOffset(-20, jumpButton.Size.Y.Offset)
customButton.Parent = jumpButton.Parent
else
warn("设备不支持触摸或 Studio 没有模拟触摸设备!")
end基于上下文的 UI
在移动设备上,屏幕空间有限,因此您应该在主动游戏期间仅显示最重要的信息。例如,如果您的游戏包含打开门和宝箱的特殊输入操作,则在屏幕上不断显示“打开”按钮是没有意义的。相反,使用 接近提示 或类似方法,仅在角色接近门或宝箱时接受输入。

