用途:在 Roblox 中构建响应式跨平台 UI。UI 应放在 StarterGui 的 ScreenGui(复制到各玩家 PlayerGui)或由客户端控制器创建;UI 代码仅客户端运行,正常情况下服务器不触碰 PlayerGui。
基础:ScreenGui 常用 ResetOnSpawn=false、ZIndexBehavior=Sibling,交互 UI 用 ScreenInsets=CoreUISafeInsets 避开刘海与顶部栏。尺寸位置以 Scale(UDim2.fromScale)加约束为主,Offset 仅用于固定细节;纯 Offset 会在手机和 4K 上错位。AnchorPoint=Vector2.new(0.5,0.5) 配合 Position=UDim2.fromScale(0.5,0.5) 可居中。常用约束:UIAspectRatioConstraint、UISizeConstraint、UITextSizeConstraint(优先固定 TextSize + AutomaticSize,TextScaled 尺寸不稳定);AutomaticSize 让容器随内容增长。需在设备模拟器测试手机竖横屏、平板、主机与 4K。
布局:自适应行列用 UIListLayout(FillDirection、Padding、HorizontalFlex/VerticalFlex、Wraps);单项撑满用 UIFlexItem 的 FlexMode=Fill/Grow/Shrink/Custom;网格用 ScrollingFrame 内 UIGridLayout + AutomaticCanvasSize;轮播用 UIPageLayout;圆角、描边、内边距用 UICorner、UIStroke、UIPadding;渐变阴影用 UIGradient、UIShadow;整体缩放用 UIScale。父级最后设置可减少闪烁。
样式:StyleSheet 配 StyleRules(选择器如 "TextButton"、".Primary"、"#Close"、"TextButton:Hover"、"::UICorner"),rule:SetProperties({...});令牌为令牌表属性($Primary、$Radius),主题通过 StyleDerive 派生并可切换;StyleLink 置于 ScreenGui 下应用整棵树;@Name 样式查询可按屏幕尺寸、输入类型或无障碍设置切换。可在 Studio Style Editor 可视化编辑。
输入与文本:读取 UserInputService.PreferredInput 及 GetPropertyChangedSignal 切换提示与布局;用 GuiButton.Activated 而非 MouseButton1Click;主机需设置 Selectable、GuiService.SelectedObject、SelectionGroup/NextSelection* 并支持 ButtonB 关闭;触摸目标约 44×44 px,手机文字 ≥14 px。RichText=true 支持标签,跨玩家文本须在服务器用 TextService:FilterStringAsync 过滤;字体权重用 FontFace=Font.new(...);用 LocalizationTables 本地化。
动画与其它:客户端用 TweenService 补间;弹跳动画 UIScale.Scale;CanvasGroup 适合淡入面板;拖放用 UIDragDetector。世界内 UI 用 BillboardGui、SurfaceGui,配合 Adornee 且放在 PlayerGui;ProximityPrompt 提供跨平台交互(服务器需校验)。框架可选 React(jsdotlua/react + react-roblox)、Fusion、Vide,沿用项目现有方案。
性能限制:避免每帧更新未变化的属性;用 Visible=false 隐藏而非反复销毁重建;大列表惰性构建或虚拟化;动态 UI 上过多 UIGradient/CanvasGroup/UIStroke 会耗性能,用 MicroProfiler 检查。相关技能:roblox-input、roblox-text-chat、roblox-monetization、roblox-luau、roblox-performance。