Plugin
*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.
Plugin é o principal objeto responsável por criar widgets básicos do Studio, barras de ferramentas de plugin, botões de plugin e muito mais.É um aditivo personalizado ao Studio que adiciona novo comportamento e recursos que não são normalmente incluídos.O objeto Plugin pode ser acessado através da referência global plugin em um Script que é executado como um plugin.
Amostras de código
The plugin global reference is not passed to ModuleScripts within the plugin. In order to use it in a ModuleScript, you must explicitly pass it as seen in the example below.
assert(plugin, "This script must be run as a plugin!")
-- Code beyond this point will execute only if the script is run as a plugin
-- Load the module and pass the plugin reference
local pluginModule = require(script.Parent.PluginModule)
pluginModule:Initialize(plugin)
-- Verify if the plugin reference was initialized
pluginModule:CheckForPluginGlobal()
local pluginModule = {}
local plugin -- Local plugin reference
-- Initialize the plugin reference if not already set
function pluginModule:Initialize(pluginReference: Plugin)
if plugin ~= pluginReference then
plugin = pluginReference
else
error("Plugin is already initialized")
end
end
-- Check if the plugin reference is set and print out appropriate info
function pluginModule:CheckForPluginGlobal()
if plugin ~= nil then
print("Plugin reference is set!")
else
warn("Plugin reference is missing!")
end
end
return pluginModule
Resumo
Propriedades
Retorna se o usuário habilitou Collisions no Studio na aba Modelo.
Retorna o tamanho de sobreposição da grade que o usuário definiu no Studio.
Métodos
Define o estado do plugin de chamada para ativado.
- CreatePluginAction(actionId : string,text : string,statusTip : string,iconName : string,allowBinding : boolean):PluginAction
Cria um PluginAction que é um objeto que representa uma ação genérica executável no Roblox Studio, sem nenhum associado diretamente Toolbar ou Enum.Button.
Cria um novo menu de plugin.
Cria um novo PluginToolbar com o nome dado.
Desativa o plugin.
Retorna o Enum.JointCreationMode que o usuário definiu no Studio na aba Modelo.
Retorna um Mouse que pode ser usado enquanto o plugin estiver ativo.
Retorna o atualmente selecionado Enum.RibbonTool .
Recupera um valor previamente armazenado com a chave dada, ou nil se a chave dada não existir.
Retorna verdadeiro se este plugin estiver ativo no momento, depois de ter sido ativado através da função Plugin:Activate().
Retorna verdadeiro se este plugin estiver ativo no momento com um mouse exclusivo, depois de ter sido ativado através da função Plugin:Activate().
Nega as peças dadas e retorna as NegateOperations resultantes.
Usado para abrir a instância de script dada em uma janela de editor, no Roblox Studio, na linha dada.Se nenhuma linha for dada como argumento, ela padronizará para 1.
Abre a janela de ajuda de contexto para a página do wiki que url liga.
Abre uma janela de upload para a seleção atual do usuário.
Ativa a ferramenta Roblox Studio especificada.
Separa as Operações de União dadas e retorna as peças resultantes.
Armazena um valor dado para uso futuro sob a chave dada. O valor persistirá mesmo depois que o Studio for fechado.
Inicia uma ação de arrastamento dada um dicionário de parâmetros.
Une as partes dadas e retorna a Operação de União resultante.
- CreateDockWidgetPluginGui(pluginGuiId : string,dockWidgetPluginGuiInfo : DockWidgetPluginGuiInfo):DockWidgetPluginGui
Cria um DockWidgetPluginGui dado um DockWidgetPluginGuiInfo .
Solicita ao usuário que abra um arquivo de animação .fbx que pode ser carregado no rigModel , então procede a inserir a animação como um KeyframeSequence no Workspace .
Solicita ao usuário que abra um arquivo .fbx, carrega os componentes individuais do modelo como malhas e gera um modelo de personagem para uso na animações, que é carregado no Workspace .
Abre uma janela no Roblox Studio, que solicita ao usuário a seleção de um recurso com base no assetType.Retorna o que assetId foi selecionado, ou -1 se a janela foi fechada.
Solicita ao usuário que salve sua seleção atual com o nome de arquivo especificado. Retorna verdadeiro se o usuário salvou o arquivo.
Eventos
Dispedido quando o plugin é desativado.
Incêndios imediatamente antes de Plugin parar de funcionar.
Propriedades
DisableUIDragDetectorDrags
GridSize
Retorna o tamanho de sobreposição da grade que o usuário definiu no Studio sob as abas Modelo ou Avatar da barra de ferramentas.Observe que esta propriedade pode ter erros de arredondamento ligeiros; por exemplo, pode ser 0.0099999997764826 para uma configuração de usuário de 1 ou 0.4000000059604645 para uma configuração de usuário de 0.4.
IsDebuggable
Métodos
Activate
Essa função define o estado do plugin de chamada para ativado. Ativar o plugin permite o controle do mouse através do método Plugin:GetMouse().
A qualquer momento, existem 0 ou 1 Plugins Ativados.Ativar um plugin desativará todos os outros plugins (eles receberão um evento Plugin.Deactivation).
Veja também:
- Plugin:IsActivatedWithExclusiveMouse() , retorna verdadeiro se este plugin estiver atualmente ativo com um mouse exclusivo, depois de ter sido ativado através desta função
- Plugin.Unloading , dispara imediatamente antes que o plugin seja descarregado ou recarregado via desinstalação, desativação ou atualização
Parâmetros
Um booleano que especifica se deve ativar o plugin com o mouse exclusivo. Se verdadeiro, um PluginMouse pode ser recuperado via Plugin:GetMouse() .
Devolução
CreatePluginAction
Essa função cria um PluginAction que é um objeto que representa uma ação genérica executável no Roblox Studio, sem nenhum associado diretamente Toolbar ou Enum.Button.No Roblox Studio, eles podem ser atribuídos um atalho de teclado sob File → Advanced → Customize Shortcuts… e também podem ser adicionados à Barra de Acesso Rápido.
Quando uma ação é acionada, o evento PluginAction.Triggered é sinalizado.
Para que as Ações de Plugin funcionem como esperado, elas devem ser criadas usando essa função.
Veja também:
- PluginMenu , um menu de contexto que pode ser mostrado no Studio que exibe uma lista de Ações de Plugin e suporta submenus
- Plugin:CreatePluginMenu() , cria um PluginMenu
Parâmetros
Deve ser uma string única que identifica esta Ação de Plugin de outros.
O nome exibido da ação.
A descrição exibida da ação.
O nome do ícone usado para exibir o plugin.
Se o PluginAction será oculto da visão de atalhos do Studio. Útil para ações contextuais. Padrão para verdadeiro.
Devolução
Amostras de código
This code sample visualizes how to create a PluginAction. These must be created using the Plugin:CreatePluginAction() method in order to work.
In order to work as expected, the code block must but pasted into the Command Bar, but only once. Consecutive attempts at executing the code in the Command Bar will result in an error because a plugin cannot create more than one PluginMenu with the same ID.
When the created action is bound and Triggered, it outputs Hello world!.
local pluginAction = plugin:CreatePluginAction(
"HelloWorldAction",
"Hello World",
"Prints a 'Hello world!'",
"rbxasset://textures/sparkle.png",
true
)
pluginAction.Name = "Test Action"
local function actionTriggered()
print("Hello world!")
end
pluginAction.Triggered:Connect(actionTriggered)
CreatePluginMenu
Essa função cria um novo PluginMenu, que é um menu de contexto que pode ser mostrado no Studio que exibe uma lista de PluginActions e suporta submenus.
Para que os PluginMenus funcionem como esperado, eles devem ser criados usando essa função.
Veja também:
- PluginAction , um objeto que representa uma ação genérica executável no Roblox Studio, sem nenhuma associada diretamente Toolbar ou Enum.Button .
- Plugin:CreatePluginAction() , cria uma Ação de Plugin
- PluginMenu.Title , o texto a ser exibido quando usado como um submenu
- PluginMenu.Icon , o ícone a ser exibido quando usado como submenu
- PluginMenu:AddAction() , adiciona a ação dada ao menu
- PluginMenu:AddNewAction() , cria uma ação temporária que é oculta da janela de atalhos personalizados do Studio
- PluginMenu:AddMenu(), adiciona o menu dado como separador
- PluginMenu:AddSeparator() , adiciona um separador entre os itens no menu
- PluginMenu:Clear() , limpa o menu
- PluginMenu:ShowAsync() , mostra o menu no cursor do mouse.Produz até que um item seja selecionado ou o menu seja fechado.A ação selecionada dispara seu evento Triggered
Parâmetros
ID exclusivo para o menu.
O texto a ser exibido quando usado como submenu.
O ícone a ser exibido quando usado como submenu.
Devolução
Amostras de código
This code sample visualizes how PluginMenus and PluginActions behave when created for a Plugin. Outside of this example, you should not parent the plugin or its functional components to the experience's workspace.
In order to work as expected, the code block must but pasted into the Command Bar, but only once. Consecutive attempts at executing the code in the Command Bar will result in an error because a plugin cannot create more than one PluginMenu with the same ID.
After executing the code, changing the created BoolValue in the experience's workspace opens the plugin's menus. Selecting an action from the menus the function connected to the trigger signal.
-- This code can be pasted into the command bar, but only once
local pluginMenu = plugin:CreatePluginMenu(math.random(), "Test Menu")
pluginMenu.Name = "Test Menu"
pluginMenu:AddNewAction("ActionA", "A", "rbxasset://textures/loading/robloxTiltRed.png")
pluginMenu:AddNewAction("ActionB", "B", "rbxasset://textures/loading/robloxTilt.png")
local subMenu = plugin:CreatePluginMenu(math.random(), "C", "rbxasset://textures/explosion.png")
subMenu.Name = "Sub Menu"
subMenu:AddNewAction("ActionD", "D", "rbxasset://textures/whiteCircle.png")
subMenu:AddNewAction("ActionE", "E", "rbxasset://textures/icon_ROBUX.png")
pluginMenu:AddMenu(subMenu)
pluginMenu:AddSeparator()
pluginMenu:AddNewAction("ActionF", "F", "rbxasset://textures/sparkle.png")
local toggle = Instance.new("BoolValue")
toggle.Name = "TogglePluginMenu"
toggle.Parent = workspace
local function onToggled()
if toggle.Value then
toggle.Value = false
local selectedAction = pluginMenu:ShowAsync()
if selectedAction then
print("Selected Action:", selectedAction.Text, "with ActionId:", selectedAction.ActionId)
else
print("User did not select an action!")
end
end
end
toggle.Changed:Connect(onToggled)
CreateToolbar
A função Criar Barra de Ferramentas cria um novo PluginToolbar com o nome dado. A barra de ferramentas pode então ser usada para criar botões de plugin.
Parâmetros
O texto visível na barra de ferramentas, rotulando o grupo de botões contidos dentro dela.
Devolução
Amostras de código
This code creates a toolbar with the name "ExampleToolbar".
plugin:CreateToolbar("ExampleToolbar")
Deactivate
Desativa o plugin. Isso desengajará o associado PluginMouse se tiver sido ativado
Veja também:
- Plugin:Activate() , define o estado do plugin de chamada para ativado
- Plugin.Deactivation , dispara quando o plugin é desativado
- Plugin.Unloading , dispara imediatamente antes que o plugin seja descarregado ou recarregado via desinstalação, desativação ou atualização
Devolução
GetMouse
Obter Mouse retorna um PluginMouse que pode ser usado enquanto o plugin está ativo através de Plugin:Activate() .
Devolução
Amostras de código
This code would print Button 1 pressed from PluginMouse each time the mouse's left button was clicked.
local mouse = plugin:GetMouse()
local function button1Down()
print("Button 1 pressed from PluginMouse")
end
mouse.Button1Down:Connect(button1Down)
GetSelectedRibbonTool
GetSelectedRibbonTool retorna o atualmente selecionado Enum.RibbonTool .Retorna um Enum que corresponde a uma ferramenta específica.Isso retornará se a ferramenta for selecionada manualmente ou programaticamente via Plugin:SelectRibbonTool() .
Devolução
Amostras de código
This code must be run from a plugin. This code selects the move tool, checks which tool is selected, then prints out to the console which tool is selected. SelectRibbonTool will not return the value until the next frame.
plugin:SelectRibbonTool(Enum.RibbonTool.Move, UDim2.new())
task.wait() -- wait for next frame
local selectedRibbonTool = plugin:GetSelectedRibbonTool()
print("The selected RibbonTool is", selectedRibbonTool)
GetSetting
Recupera um valor previamente armazenado com a chave dada, ou nil se a chave dada não existir.
Como múltiplas instâncias do mesmo plugin podem executar simultaneamente (por exemplo, se várias janelas do Studio estiverem abertas), você não deve depender desse valor permanecer o mesmo ao longo do tempo.As outras instâncias de plugin podem atualizar a configuração a qualquer momento.
Essa chamada pode falhar silenciosamente e retornar nil se várias instâncias do mesmo plugin estiverem lendo e escrevendo dados ativamente.Se o seu plugin espera escrever frequentemente nas configurações, você deve verificar duas vezes o valor retornado desta chamada após um breve período para distinguir entre uma configuração temporariamente indisponível e uma configuração que não existe.
Parâmetros
Devolução
Amostras de código
The below example would print the value saved to the key FirstTime. If the key doesn't exist, it would print nil.
local RAN_BEFORE_KEY = "RanBefore"
local didRunBefore = plugin:GetSetting(RAN_BEFORE_KEY)
if didRunBefore then
print("Welcome back!")
else
plugin:SetSetting(RAN_BEFORE_KEY, true)
print("Welcome! Thanks for installing this plugin!")
end
IsActivated
Essa função retorna verdadeiro se esse plugin estiver ativo no momento, depois de ter sido ativado através da função Plugin:Activate().
Devolução
Um booleano que indica se o plugin está ativo no momento.
IsActivatedWithExclusiveMouse
Essa função retorna verdadeiro se esse plugin estiver ativo no momento com um mouse exclusivo, depois de ter sido ativado através da função Plugin:Activate().Se isso retornar verdadeiro, um PluginMouse pode ser recuperado via Plugin:GetMouse() .
Veja também:
- Plugin.Deactivation , dispara quando o plugin é desativado
- Plugin.Unloading , dispara imediatamente antes que o plugin seja descarregado ou recarregado via desinstalação, desativação ou atualização
Devolução
Se este plugin está atualmente ativo com um mouse exclusivo.
Negate
Nega as peças dadas e retorna as NegateOperations resultantes.
Parâmetros
Devolução
OpenScript
Usado para abrir a instância de script dada em uma janela de editor, no Roblox Studio, na linha dada.Se nenhuma linha for dada como argumento, ela padronizará para 1.
Parâmetros
Devolução
Amostras de código
The following would open a newly created Script in Workspace, assuming the variable "Plugin" was already declared.
local newScript = Instance.new("Script")
newScript.Parent = workspace
plugin:OpenScript(newScript)
OpenWikiPage
Abre a janela de ajuda de contexto para a página do wiki que url liga.
Parâmetros
Devolução
Amostras de código
The following, when executed in a plugin, will open the BasePart API page in the context help.
plugin:OpenWikiPage("API:Class/BasePart")
SaveSelectedToRoblox
Abre uma janela de upload para a seleção atual do usuário.
Devolução
SelectRibbonTool
Ativa a ferramenta Roblox Studio especificada. Se a ferramenta abrir uma janela, o parâmetro de posição especifica onde deve ser exibida na tela.
Nota:
- Um objeto deve ser selecionado para que isso funcione corretamente.
- Alterar os campos de escala da propriedade position não afetará os pop-ups de diálogo.
Parâmetros
Devolução
Separate
Separa as Operações de União dadas e retorna as peças resultantes.
Parâmetros
Devolução
SetSetting
Armazena um valor dado para uso futuro sob a chave dada.O valor persistirá mesmo após o fechamento do Roblox Studio.Essas configurações são salvas no formato JSON como um mapa com chaves de corda.Arranjos são automaticamente convertidos em mapas convertendo as chaves numéricas em strings primeiro.
Observe que o formato JSON impõe restrições adicionais, incluindo os seguintes caracteres que podem corromper o arquivo de configuração:
- Retornos de caracteres ( \ ) em chaves ou valores, em especial citações escapadas ( \" ).
- Novas linhas ( \n ) em chaves.
- Citações ( " ) em chaves.
- Períodos ( . ) em chaves.
Essa chamada pode falhar silenciosamente se várias instâncias do mesmo plugin estiverem lendo e escrevendo dados ativamente.Se o seu plugin espera escrever frequentemente nas configurações, você pode verificar se os dados foram escritos corretamente ao chamar Plugin:GetSetting().
Parâmetros
Devolução
Amostras de código
This code sample demonstrates use of the Plugin:GetSetting() and Plugin:SetSetting() functions. They detect if a plugin is running for the first time by setting a key. If the key is true, it prints a "welcome back" message; otherwise it prints a "first run" message and sets the key to true.
local RAN_BEFORE_KEY = "RunBefore"
local hasRunBefore = plugin:GetSetting(RAN_BEFORE_KEY)
if hasRunBefore then
print("Welcome back!")
else
print("Thanks for installing this plugin!")
plugin:SetSetting(RAN_BEFORE_KEY, true)
end
StartDrag
IniciarArrastar inicia uma ação de arrastamento usando um dicionário de parâmetros. Os parâmetros são os seguintes:
<th>Tipo</th><th>Padrão</th><th>Descrição</th></tr></thead><tbody><tr><td><b>Remetente</b></td><td>string</td><td><code>""</code> ></td><td>Identifica a fonte da ação de arrastamento para o alvo de solta</td></tr><tr><td><b>Tipo de Mime</b></td><td>string</td><td><code>""</code> ></td><td>O tipo <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types">MIME</a> de <b>Dados</b>.</td></tr><tr><td><b>Dados</b></td><td>string</td><td><code>""</code> ></td><td>Informações sobre a ação de arrastar, por exemplo, o que está sendo arrastado. Deve ser usado pelo alvo de solta.</td></tr><tr><td><b>MouseIcon</b></td><td><code>Datatype.Content</code> ></td><td><code>""</code> ></td><td>O ícone a ser usado para o cursor do mouse durante o arrastamento. Se estiver vazio, usa o cursor padrão.</td></tr><tr><td><b>DragIcon</b></td><td><code>Datatype.Content</code> ></td><td><code>""</code> ></td><td>Uma imagem para renderizar sob o cursor do mouse durante o arrastamento. Isso deve representar o item sendo arrastado.</td></tr><tr><td><b>HotSpot</b></td><td><code>Datatype.Vector2</code></td><td><code>Datatype.Vector2.new(0, 0)</code> ></td><td>O deslocamento do pixel da esquerda superior onde o cursor deve "segurar" o <b>DragIcon</b>.</td></tr></tbody>
Qual o nome |
---|
Veja também:
Parâmetros
Devolução
Amostras de código
This code sample creates two plugin widget windows: a drag source and a drop target. In the source window, the script creates a TextBox and TextButton to allow the user to begin a plugin drag action. The drop target window will display the MimeType of whatever is dragged into it using a TextLabel. If the MimeType is text/plain, it will display the plain text data instead.
To run this code sample as a plugin, paste it into a Script. Then, right-click the script in the Explorer window and choose "Save as Local Plugin".
assert(plugin, "This script must be run as a Studio plugin")
local widgetInfo = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 300, 200)
local dragSourceWidget = plugin:CreateDockWidgetPluginGui("Drag Source", widgetInfo)
dragSourceWidget.Title = "Drag Source"
local textBox = Instance.new("TextBox")
textBox.Parent = dragSourceWidget
textBox.Size = UDim2.new(1, 0, 0, 32)
textBox.Text = "Hello, plugin drags"
local dragButton = Instance.new("TextButton")
dragButton.Size = UDim2.new(1, 0, 1, -32)
dragButton.Position = UDim2.new(0, 0, 0, 32)
dragButton.Text = "Edit the text above, then start drag here"
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)
-- This widget will receive drops
local dragTargetWidget = plugin:CreateDockWidgetPluginGui("Drop Target", widgetInfo)
dragTargetWidget.Title = "Drop Target"
-- This TextLabel will display what was dropped
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, 0, 1, 0)
textLabel.Text = "Drop here..."
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)
Union
Une as partes dadas e retorna a Operação de União resultante.
Parâmetros
Devolução
CreateDockWidgetPluginGui
CreateDockWidgetPluginGui cria um novo DockWidgetPluginGui a partir do dado DockWidgetPluginGuiInfo.O primeiro parâmetro, pluginGuiId , deve ser uma string / cadeia / textoúnica e consistente.É usado para salvar o estado do estado do dock do widget e outros detalhes internos.
Parâmetros
Um identificador exclusivo e consistente usado para armazenar o estado do dock do widget e outros detalhes internos.
Descreve o DockWidgetPluginGui para criar (estado inicial, tamanho, etc).
Devolução
Amostras de código
This code, when ran inside a Plugin, creates a DockWidgetPluginGui with a simple TextButton.
-- Create new 'DockWidgetPluginGuiInfo' object
local widgetInfo = DockWidgetPluginGuiInfo.new(
Enum.InitialDockState.Float, -- Widget will be initialized in floating panel
true, -- Widget will be initially enabled
false, -- Don't override the previous enabled state
200, -- Default width of the floating window
300, -- Default height of the floating window
150, -- Minimum width of the floating window (optional)
150 -- Minimum height of the floating window (optional)
)
-- Create new widget GUI
local testWidget = plugin:CreateDockWidgetPluginGui("TestWidget", widgetInfo)
local testButton = Instance.new("TextButton")
testButton.BorderSizePixel = 0
testButton.TextSize = 20
testButton.TextColor3 = Color3.new(1, 0.2, 0.4)
testButton.AnchorPoint = Vector2.new(0.5, 0.5)
testButton.Size = UDim2.new(1, 0, 1, 0)
testButton.Position = UDim2.new(0.5, 0, 0.5, 0)
testButton.SizeConstraint = Enum.SizeConstraint.RelativeYY
testButton.Text = "Click Me"
testButton.Parent = testWidget
ImportFbxAnimation
Essa função solicita ao usuário que abra um arquivo de animação .fbx que pode ser carregado no rigModel , então procede a inserir a animação como um KeyframeSequence no Workspace .
Parâmetros
Devolução
ImportFbxRig
Solicita ao usuário que abra um arquivo .fbx, carrega os componentes individuais do modelo como malhas e gera um modelo de personagem para uso na animações, que é carregado no Workspace .
Parâmetros
Devolução
PromptForExistingAssetId
Abre uma janela no Roblox Studio, que solicita ao usuário a seleção de um recurso com base no assetType.Retorna o que assetId foi selecionado, ou -1 se a janela foi fechada.
Parâmetros
Devolução
Eventos
Deactivation
Dispedido quando o Plugin for desativado.Isso ocorre quando o código do plugin chama Plugin:Deactivate() ou porque algum outro plugin chamou Plugin:Activate(), o que força todos os outros plugins a perder seu estado ativo.
Veja também:
- Plugin.Unloading , dispara imediatamente antes que o plugin seja descarregado ou recarregado via desinstalação, desativação ou atualização
Unloading
Este evento dispara imediatamente antes de Plugin parar de funcionar.Plugins são descarregados quando desativados, desinstalados, prestes a ser atualizados ou quando o local está fechando.
Habilita um plugin a limpar após si mesmo antes que seus scripts parem de funcionar, por exemplopara remover instâncias desnecessárias do DataModel.Se um plugin não limpar corretamente, as cópias antigas permanecerão.Quando isso ocorre, os usuários podem ser forçados a fechar e reabrir o local, o que é uma má experiência do usuário.
Instâncias relacionadas a plugins como PluginToolbarButtons , DockWidgetPluginGuis e PluginGuis são limpadas automaticamente quando o plugin é descarregado, portanto, não há necessidade de removê-los.