PluginGui 是一个抽象类,用于在各种 Roblox Studio 小工具中显示 GuiObjects。截至目前,唯一可用的 PluginGui 类型是 DockWidgetPluginGui,但未来可能会有更多类型!
概要
属性
显示在 PluginGui 内容上方的标题。
属性
切换此 LayerCollector 的可见性。
确定 LayerCollector 是否在玩家角色重生时重置(删除自身并重新克隆到玩家的 PlayerGui)。
控制所有此 LayerCollector 后代的 GuiObject.ZIndex 的行为。
属性
方法
将一个函数绑定到 PluginGui 的关闭按钮,覆盖默认行为。
返回鼠标相对于 PluginGui 的位置。
活动
当用户在拖动操作期间释放鼠标时触发,拖动操作由 Plugin:StartDrag() 启动。
当用户的鼠标在拖动操作期间进入 PluginGui 时触发,该拖动操作由 Plugin:StartDrag() 启动。
当用户的鼠标在拖动操作期间离开 PluginGui 时触发,该拖动操作由 Plugin:StartDrag() 启动。
当用户的鼠标在拖动操作期间在 PluginGui 内移动时触发,该拖动操作由 Plugin:StartDrag() 启动。
当用户停止与 PluginGui 窗口交互时触发。
当用户开始与 PluginGui 的窗口交互时触发。
活动
- SelectionChanged(amISelected : boolean,previousSelection : GuiObject,newSelection : GuiObject):RBXScriptSignal
当游戏手柄选择移动到、离开或在连接的 GuiBase2d 或任何后代 GuiObjects 内部更改时触发。
属性
方法
BindToClose
此函数将一个函数绑定到 PluginGui 的关闭按钮, 覆盖默认行为。
默认情况下,当用户点击 PluginGui 右上角的 'x' 按钮时, Enabled 属性会被设置为 false,关闭窗口。 当通过 BindToClose 绑定一个自定义函数时,此行为会被覆盖, 允许你检查用户是否真的想关闭窗口或给予他们保存工作的机会。
由于默认关闭行为被此函数覆盖,你需要通过将 PluginGui.Enabled 设置为 false 手动配置 PluginGui 关闭。例如,在下面的代码片段中,用户需要点击确认按钮以关闭 GUI:
local closing = false
pluginGui:BindToClose(function()
-- 确保我们没有已经制作按钮
if closing then
return
end
closing = true
-- 创建确认按钮
local confirmButton = Instance.new("TextButton")
confirmButton.AnchorPoint = Vector2.new(0.5, 0.5)
confirmButton.Size = UDim2.new(0.5, 0, 0.5, 0)
confirmButton.Position = UDim2.new(0.5, 0, 0.5, 0)
confirmButton.BackgroundColor3 = Color3.new(1, 0, 0)
confirmButton.Text = "关闭?"
confirmButton.Parent = pluginGui
-- 监听点击事件
confirmButton.Activated:Connect(function()
-- 关闭 GUI
pluginGui.Enabled = false
-- 移除确认按钮
confirmButton:Destroy()
end)
end)
你可以不带参数调用 BindToClose 以“解绑”并恢复默认行为,如下所示:
pluginGui:BindToClose()
另见:
- DataModel:BindToClose(),用于绑定一个函数到游戏结束,与此函数不要混淆
参数
要绑定到关闭按钮的函数。如果未指定函数,则会取消绑定任何先前指定的函数。
返回
GetRelativeMousePosition
GetRelativeMousePosition 返回鼠标相对于 PluginGui 左上角的位置。 返回值仅在鼠标输入开始于 PluginGui 或者鼠标当前悬停在窗口上时发生变化。
返回
相对于 PluginGui 的鼠标屏幕位置(以像素为单位)。
代码示例
local RunService = game:GetService("RunService")
local widgetInfo = DockWidgetPluginGuiInfo.new(
Enum.InitialDockState.Float,
true,
false, -- 启用状态,覆盖
200,
300, -- 尺寸
150,
150 -- 最小尺寸
)
local testWidget = plugin:CreateDockWidgetPluginGui("测试小部件", widgetInfo)
function update()
local v2 = testWidget:GetRelativeMousePosition()
testWidget.Title = ("(%d, %d)"):format(v2.x, v2.y)
end
RunService.Stepped:Connect(update)
update()
活动
PluginDragDropped
PluginDragDropped 在用户在拖动操作期间释放鼠标到 PluginGui 上时触发,该拖动操作由 Plugin:StartDrag() 启动。
另见:
参数
代码示例
本代码示例创建了两个插件小部件窗口:一个拖动源和一个放置目标。在源窗口中,脚本创建了一个 TextBox 和 TextButton 以允许用户开始插件拖动操作。放置目标窗口将使用 TextLabel 显示拖入的内容的 MimeType。如果 MimeType 是 text/plain,它将显示纯文本数据。
要将此代码示例作为插件运行,请将其粘贴到一个 Script 中。然后,在资源管理器窗口中右键单击脚本并选择“保存为本地插件”。
assert(plugin, "该脚本必须作为 Studio 插件运行")
local widgetInfo = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 300, 200)
local dragSourceWidget = plugin:CreateDockWidgetPluginGui("拖动源", widgetInfo)
dragSourceWidget.Title = "拖动源"
local textBox = Instance.new("TextBox")
textBox.Parent = dragSourceWidget
textBox.Size = UDim2.new(1, 0, 0, 32)
textBox.Text = "你好,插件拖动"
local dragButton = Instance.new("TextButton")
dragButton.Size = UDim2.new(1, 0, 1, -32)
dragButton.Position = UDim2.new(0, 0, 0, 32)
dragButton.Text = "编辑上面的文本,然后在这里开始拖动"
dragButton.Parent = dragSourceWidget
function onMouseButton1Down()
local dragData = {
Sender = "SomeDragSource",
MimeType = "text/plain",
Data = textBox.Text,
MouseIcon = "",
DragIcon = "",
HotSpot = Vector2.new(0, 0),
}
plugin:StartDrag(dragData)
end
dragButton.MouseButton1Down:Connect(onMouseButton1Down)
-- 此小部件将接收放置
local dragTargetWidget = plugin:CreateDockWidgetPluginGui("放置目标", widgetInfo)
dragTargetWidget.Title = "放置目标"
-- 此 TextLabel 将显示被放置的内容
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, 0, 1, 0)
textLabel.Text = "在这里放置..."
textLabel.Parent = dragTargetWidget
local function onDragDrop(dragData)
if dragData.MimeType == "text/plain" then
textLabel.Text = dragData.Data
else
textLabel.Text = dragData.MimeType
end
end
dragTargetWidget.PluginDragDropped:Connect(onDragDrop)
dragTargetWidget.PluginDragEntered:Connect(function(_dragData)
print("PluginDragEntered")
end)
dragTargetWidget.PluginDragLeft:Connect(function(_dragData)
print("PluginDragLeft")
end)
dragTargetWidget.PluginDragMoved:Connect(function(_dragData)
print("PluginDragMoved")
end)
PluginDragEntered
PluginDragEntered 在用户的鼠标在拖动操作期间进入 PluginGui 时触发,该拖动操作由 Plugin:StartDrag() 启动。
此事件对于在可投放的 PluginGui 上显示“在此投放” UI 非常有用。此类 UI 应在 PluginDragLeft 或 PluginDragDropped 触发时隐藏。
另见:
参数
一份最初传递给 Plugin:StartDrag() 的数据的副本。
代码示例
本代码示例创建了两个插件小部件窗口:一个拖动源和一个放置目标。在源窗口中,脚本创建了一个 TextBox 和 TextButton 以允许用户开始插件拖动操作。放置目标窗口将使用 TextLabel 显示拖入的内容的 MimeType。如果 MimeType 是 text/plain,它将显示纯文本数据。
要将此代码示例作为插件运行,请将其粘贴到一个 Script 中。然后,在资源管理器窗口中右键单击脚本并选择“保存为本地插件”。
assert(plugin, "该脚本必须作为 Studio 插件运行")
local widgetInfo = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 300, 200)
local dragSourceWidget = plugin:CreateDockWidgetPluginGui("拖动源", widgetInfo)
dragSourceWidget.Title = "拖动源"
local textBox = Instance.new("TextBox")
textBox.Parent = dragSourceWidget
textBox.Size = UDim2.new(1, 0, 0, 32)
textBox.Text = "你好,插件拖动"
local dragButton = Instance.new("TextButton")
dragButton.Size = UDim2.new(1, 0, 1, -32)
dragButton.Position = UDim2.new(0, 0, 0, 32)
dragButton.Text = "编辑上面的文本,然后在这里开始拖动"
dragButton.Parent = dragSourceWidget
function onMouseButton1Down()
local dragData = {
Sender = "SomeDragSource",
MimeType = "text/plain",
Data = textBox.Text,
MouseIcon = "",
DragIcon = "",
HotSpot = Vector2.new(0, 0),
}
plugin:StartDrag(dragData)
end
dragButton.MouseButton1Down:Connect(onMouseButton1Down)
-- 此小部件将接收放置
local dragTargetWidget = plugin:CreateDockWidgetPluginGui("放置目标", widgetInfo)
dragTargetWidget.Title = "放置目标"
-- 此 TextLabel 将显示被放置的内容
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, 0, 1, 0)
textLabel.Text = "在这里放置..."
textLabel.Parent = dragTargetWidget
local function onDragDrop(dragData)
if dragData.MimeType == "text/plain" then
textLabel.Text = dragData.Data
else
textLabel.Text = dragData.MimeType
end
end
dragTargetWidget.PluginDragDropped:Connect(onDragDrop)
dragTargetWidget.PluginDragEntered:Connect(function(_dragData)
print("PluginDragEntered")
end)
dragTargetWidget.PluginDragLeft:Connect(function(_dragData)
print("PluginDragLeft")
end)
dragTargetWidget.PluginDragMoved:Connect(function(_dragData)
print("PluginDragMoved")
end)
PluginDragLeft
PluginDragLeft 在用户的鼠标在拖动操作期间离开 PluginGui 时触发,该拖动操作由 Plugin:StartDrag() 启动。
此事件和 PluginDragDropped 对于隐藏可投放的 PluginGui 上的“在此投放” UI 非常有用。当 PluginDragEntered 被触发时,该 UI 应显示。
另见:
参数
一份最初传递给 Plugin:StartDrag() 的数据的副本。
代码示例
本代码示例创建了两个插件小部件窗口:一个拖动源和一个放置目标。在源窗口中,脚本创建了一个 TextBox 和 TextButton 以允许用户开始插件拖动操作。放置目标窗口将使用 TextLabel 显示拖入的内容的 MimeType。如果 MimeType 是 text/plain,它将显示纯文本数据。
要将此代码示例作为插件运行,请将其粘贴到一个 Script 中。然后,在资源管理器窗口中右键单击脚本并选择“保存为本地插件”。
assert(plugin, "该脚本必须作为 Studio 插件运行")
local widgetInfo = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 300, 200)
local dragSourceWidget = plugin:CreateDockWidgetPluginGui("拖动源", widgetInfo)
dragSourceWidget.Title = "拖动源"
local textBox = Instance.new("TextBox")
textBox.Parent = dragSourceWidget
textBox.Size = UDim2.new(1, 0, 0, 32)
textBox.Text = "你好,插件拖动"
local dragButton = Instance.new("TextButton")
dragButton.Size = UDim2.new(1, 0, 1, -32)
dragButton.Position = UDim2.new(0, 0, 0, 32)
dragButton.Text = "编辑上面的文本,然后在这里开始拖动"
dragButton.Parent = dragSourceWidget
function onMouseButton1Down()
local dragData = {
Sender = "SomeDragSource",
MimeType = "text/plain",
Data = textBox.Text,
MouseIcon = "",
DragIcon = "",
HotSpot = Vector2.new(0, 0),
}
plugin:StartDrag(dragData)
end
dragButton.MouseButton1Down:Connect(onMouseButton1Down)
-- 此小部件将接收放置
local dragTargetWidget = plugin:CreateDockWidgetPluginGui("放置目标", widgetInfo)
dragTargetWidget.Title = "放置目标"
-- 此 TextLabel 将显示被放置的内容
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, 0, 1, 0)
textLabel.Text = "在这里放置..."
textLabel.Parent = dragTargetWidget
local function onDragDrop(dragData)
if dragData.MimeType == "text/plain" then
textLabel.Text = dragData.Data
else
textLabel.Text = dragData.MimeType
end
end
dragTargetWidget.PluginDragDropped:Connect(onDragDrop)
dragTargetWidget.PluginDragEntered:Connect(function(_dragData)
print("PluginDragEntered")
end)
dragTargetWidget.PluginDragLeft:Connect(function(_dragData)
print("PluginDragLeft")
end)
dragTargetWidget.PluginDragMoved:Connect(function(_dragData)
print("PluginDragMoved")
end)
WindowFocusReleased
WindowFocusReleased 用户停止与 PluginGui 的窗口交互时立即触发, 通常是通过点击窗口外的某个东西。该事件的功能与同名的 UserInputService.WindowFocusReleased 事件相似。
如果焦点正在转移到另一个 PluginGui,而用户在此 PluginGui 上有焦点,则此事件会在另一个的 WindowFocused 事件之前触发。,但是, 如果主游戏窗口获得焦点,则此事件会在 UserInputService.WindowFocused 之后触发。
代码示例
此代码示例演示了如何使用 WindowFocused() 和 WindowFocusReleased() 事件跟踪 PluginGui 的聚焦状态。它会根据聚焦状态的变化更改 Title()。
local info = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 200, 50, 1, 1)
local widget = plugin:CreateDockWidgetPluginGui("测试小部件", info)
local function onFocusReleased()
widget.Title = "我没有聚焦 :("
end
local function onFocused()
widget.Title = "我在聚焦 :D"
end
widget.WindowFocusReleased:Connect(onFocusReleased)
widget.WindowFocused:Connect(onFocused)
WindowFocused
WindowFocused 用户开始与 PluginGui 的窗口交互时立即触发, 通常是通过点击它。该事件的功能与同名的 UserInputService.WindowFocused 事件相似。它在任何相关的 GuiObject.InputBegan 鼠标按钮事件之前触发。
如果另一个 PluginGui 处于焦点状态,并且用户聚焦此 PluginGui, 则此事件在另一个的 WindowFocusReleased 事件之后触发。然而, 如果主游戏窗口处于焦点状态,则此事件在 UserInputService.WindowFocusReleased 之后触发。
代码示例
此代码示例演示了如何使用 WindowFocused() 和 WindowFocusReleased() 事件跟踪 PluginGui 的聚焦状态。它会根据聚焦状态的变化更改 Title()。
local info = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 200, 50, 1, 1)
local widget = plugin:CreateDockWidgetPluginGui("测试小部件", info)
local function onFocusReleased()
widget.Title = "我没有聚焦 :("
end
local function onFocused()
widget.Title = "我在聚焦 :D"
end
widget.WindowFocusReleased:Connect(onFocusReleased)
widget.WindowFocused:Connect(onFocused)