Plugin

Mostrar obsoleto

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

No creable

El plugin es el objeto principal responsable de crear widgets básicos de Studio, barras de herramientas de plugin, botones de plugin y más.Es un complemento personalizado para Studio que añade nuevo comportamiento y características que no se incluyen normalmente.El objeto Plugin se puede acceder a través de la referencia global plugin en un Script que se ejecuta como plugin.

Muestras 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.

Script - Pass the Plugin Global to a ModuleScript

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()
ModuleScript - Receive and Store the Plugin Global

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

Resumen

Propiedades

Métodos

Eventos

Propiedades

CollisionEnabled

Solo lectura
No replicado
Leer paralelo

Devuelve si el usuario habilitó Collisions en Studio bajo la pestaña de modelo.

DisableUIDragDetectorDrags

Seguridad de scripts Roblox
Leer paralelo

GridSize

Solo lectura
No replicado
Leer paralelo

Devuelve el tamaño de ajuste de la cuadrícula que el usuario ha establecido en Studio bajo las pestañas Modelo o Avatar de la barra de herramientas.Tenga en cuenta que esta propiedad puede tener errores de redondeo ligeros; por ejemplo, puede ser 0.0099999997764826 para una configuración de usuario de 1 o 0.4000000059604645 para una configuración de usuario de 0.4 .

IsDebuggable

Seguridad de scripts Roblox
Leer paralelo

Métodos

Activate

()
Seguridad del plugin

Esta función establece el estado del plugin de llamada en activado. Activar el plugin permite el control del mouse a través del método Plugin:GetMouse().

En cualquier momento hay 0 o 1 plugins activados.Activar un plugin desactivará todos los demás plugins (recibirán un evento Plugin.Deactivation).

Vea también:

  • Plugin:IsActivatedWithExclusiveMouse() , devuelve verdadero si este plugin está actualmente activo con un ratónexclusivo, después de haber sido activado a través de esta función
  • Plugin.Unloading , se activa inmediatamente antes de que el plugin se desactive o se vuelva a cargar a través de la desinstalación, desactivación o actualización

Parámetros

exclusiveMouse: boolean

Un booleano que especifica si se debe activar el plugin con el ratónexclusivo. Si es verdadero, un PluginMouse se puede recuperar a través de Plugin:GetMouse() .

Valor predeterminado: ""

Devuelve

()

CreatePluginAction

Seguridad del plugin

Esta función crea un PluginAction que es un objeto que representa una acción genérica ejecutable en Roblox Studio, sin asociación directa Toolbar o Enum.Button.En Roblox Studio, se les puede asignar un atajo de teclado bajo File → Advanced → Customize Shortcuts… , y también se pueden agregar a la barra de acceso rápido.

Cuando se activa una acción, se señala el evento PluginAction.Triggered .

Para que las acciones de plugin funcionen como se espera, deben crearse usando esta función.

Vea también:

  • PluginMenu , un menú contextual que se puede mostrar en Studio que muestra una lista de PluginActions y soporta submenús
  • Plugin:CreatePluginMenu() , crea un menú de plugins

Parámetros

actionId: string

Debe ser una cadena única que identifica esta acción de plugin de otras.

Valor predeterminado: ""
text: string

El nombre mostrado de la acción.

Valor predeterminado: ""
statusTip: string

La descripción mostrada de la acción.

Valor predeterminado: ""
iconName: string

El nombre del icono utilizado para mostrar el complemento.

Valor predeterminado: ""
allowBinding: boolean

Si el PluginAction se ocultará de la vista de atajos de Studio. Útil para acciones contextuales. Por defecto, se establece en verdadero.

Valor predeterminado: true

Devuelve

Muestras 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!.

Creating a PluginAction

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

Seguridad del plugin

Esta función crea un nuevo PluginMenu , que es un menú contextual que se puede mostrar en Studio que muestra una lista de PluginActions y soporta submenús.

Para que los menús de plugins funcionen como se espera, deben crearse usando esta función.

Vea también:

Parámetros

id: string

ID único para el menú.

Valor predeterminado: ""
title: string

El texto que se mostrará cuando se use como submenú.

Valor predeterminado: ""
icon: string

El icono que se mostrará cuando se use como submenú.

Valor predeterminado: ""

Devuelve

Muestras 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.

Creating a PluginMenu and PluginMenuAction

-- 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

Seguridad del plugin

La función Crear barra de herramientas crea una nueva PluginToolbar con el nombre dado. La barra de herramientas se puede usar para crear botones de plugin.

Parámetros

name: string

El texto visible en la barra de herramientas, etiquetando el grupo de botones contenido dentro.

Valor predeterminado: ""

Devuelve

Muestras de código

This code creates a toolbar with the name "ExampleToolbar".

Plugin:CreateToolbar

plugin:CreateToolbar("ExampleToolbar")

Deactivate

()
Seguridad del plugin

Desactiva el complemento. Esto desenganchará el asociado PluginMouse si se ha activado

Vea también:

  • Plugin:Activate() , establece el estado del plugin de llamada en activado
  • Plugin.Deactivation , se activa cuando el plugin está desactivado
  • Plugin.Unloading , se activa inmediatamente antes de que el plugin se desactive o se vuelva a cargar a través de la desinstalación, desactivación o actualización

Devuelve

()
Seguridad del plugin

Devuelve el Enum.JointCreationMode que el usuario ha establecido en Studio en la pestaña de modelo.


Devuelve

GetMouse

Seguridad del plugin

GetMouse devuelve un PluginMouse que se puede usar mientras el plugin está activo a través de Plugin:Activate() .


Devuelve

Muestras de código

This code would print Button 1 pressed from PluginMouse each time the mouse's left button was clicked.

Plugin:GetMouse

local mouse = plugin:GetMouse()
local function button1Down()
print("Button 1 pressed from PluginMouse")
end
mouse.Button1Down:Connect(button1Down)

GetSelectedRibbonTool

Seguridad del plugin

GetSelectedRibbonTool devuelve la herramienta seleccionada actualmente Enum.RibbonTool .Devuelve un Enum que corresponde a una herramienta particular.Esto devolverá si la herramienta se selecciona manualmente o programáticamente a través de Plugin:SelectRibbonTool() .


Devuelve

Muestras 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:GetSelectedRibbonTool

plugin:SelectRibbonTool(Enum.RibbonTool.Move, UDim2.new())
task.wait() -- wait for next frame
local selectedRibbonTool = plugin:GetSelectedRibbonTool()
print("The selected RibbonTool is", selectedRibbonTool)

GetSetting

Variant
Seguridad del plugin

Recupera un valor previamente almacenado con la clave dada, o nil si la clave dada no existe.

Debido a que varias instancias del mismo plugin pueden ejecutarse simultáneamente (por ejemplo, si varias ventanas de Studio están abiertas), no deberías depender de que este valor se mantenga igual con el tiempo.Las otras instancias de plugin pueden actualizar la configuración en cualquier momento.

Esta llamada puede fallar silenciosamente y devolver nil si varias instancias del mismo plugin están leyendo y escribiendo activamente datos.Si tu plugin espera escribir a las configuraciones con frecuencia, deberías revisar dos veces el valor devuelto de esta llamada después de un breve período de tiempo para distinguir entre una configuración que no está disponible temporalmente y una configuración que no existe.

Parámetros

key: string
Valor predeterminado: ""

Devuelve

Variant

Muestras 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.

Plugin:GetSetting

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

Intersect

Seguridad del plugin

Parámetros

objects: Instances
Valor predeterminado: ""

Devuelve

IsActivated

Seguridad del plugin

Esta función devuelve verdadero si este plugin está actualmente activo, después de haber sido activado a través de la función Plugin:Activate().


Devuelve

Un booleano que indica si el plugin está actualmente activo.

IsActivatedWithExclusiveMouse

Seguridad del plugin

Esta función devuelve verdadero si este plugin está actualmente activo con un ratónexclusivo, después de haber sido activado a través de la función Plugin:Activate().Si esto devuelve verdadero, un PluginMouse se puede recuperar a través de Plugin:GetMouse() .

Vea también:

  • Plugin.Deactivation , se activa cuando el plugin está desactivado
  • Plugin.Unloading , se activa inmediatamente antes de que el plugin se desactive o se vuelva a cargar a través de la desinstalación, desactivación o actualización

Devuelve

Si este plugin está actualmente activo con un ratónexclusivo.

Negate

Instances
Seguridad del plugin

Negar las partes dadas y devolver las operaciones de negación resultantes.

Parámetros

objects: Instances
Valor predeterminado: ""

Devuelve

Instances

OpenScript

()
Seguridad del plugin

Se usa para abrir la instancia de script dada en una ventana de editor, en Roblox Studio, en la línea dada.Si no se da una línea como argumento, se asignará por defecto a 1.

Parámetros

Valor predeterminado: ""
lineNumber: number
Valor predeterminado: 1

Devuelve

()

Muestras de código

The following would open a newly created Script in Workspace, assuming the variable "Plugin" was already declared.

Plugin:OpenScript

local newScript = Instance.new("Script")
newScript.Parent = workspace
plugin:OpenScript(newScript)

OpenWikiPage

()
Seguridad del plugin

Abre la ventana de ayuda de contexto a la página del wiki a la que se enlaza url.

Parámetros

url: string
Valor predeterminado: ""

Devuelve

()

Muestras de código

The following, when executed in a plugin, will open the BasePart API page in the context help.

Plugin:OpenWikiPage

plugin:OpenWikiPage("API:Class/BasePart")

SaveSelectedToRoblox

()
Seguridad del plugin

Abre una ventana de carga para la selección actual del usuario.


Devuelve

()

SelectRibbonTool

()
Seguridad del plugin

Activa la herramienta de Roblox Studio especificada. Si la herramienta abre una ventana, el parámetro de posición especifica dónde debe mostrarse en la pantalla.

Nota:

  • Un objeto debe ser seleccionado para que esto funcione correctamente.
  • Alterar los campos de escala de la propiedad position no afectará los popups de diálogo.

Parámetros

Valor predeterminado: ""
position: UDim2
Valor predeterminado: ""

Devuelve

()

Separate

Instances
Seguridad del plugin

Separa las operaciones de unión dadas y devuelve las piezas resultantes.

Parámetros

objects: Instances
Valor predeterminado: ""

Devuelve

Instances

SetSetting

()
Seguridad del plugin

Almacena un valor dado para su uso posterior bajo la clave dada.El valor persistirá incluso después de que Roblox Studio se cierre.Estas configuraciones se guardan en formato JSON como un mapa con claves de cadena.Los arreglos se convierten automáticamente a mapas al convertir primero las claves numéricas a cadenas.

Tenga en cuenta que el formato JSON impone restricciones adicionales, incluidos los siguientes caracteres que pueden corromper el archivo de configuración:

  • Retrocesos ( \ ) en claves o valores, en particular citas escapadas ( \" ).
  • Nuevas líneas ( \n ) en las claves.
  • Citas ( " ) en claves.
  • Periodos ( . ) en claves.

Esta llamada puede fallar silenciosamente si varias instancias del mismo plugin están leyendo y escribiendo activamente datos.Si tu plugin espera escribir a las configuraciones con frecuencia, puedes verificar que los datos se hayan escrito correctamente llamando Plugin:GetSetting() .

Parámetros

key: string
Valor predeterminado: ""
value: Variant
Valor predeterminado: ""

Devuelve

()

Muestras 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.

Plugin:GetSetting and Plugin:SetSetting

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

()
Seguridad del plugin

Iniciar arrastrar inicia una acción de arrastrado usando un diccionario de parámetros. Los parámetros son los siguientes:


<th>Tipo</th>
<th>Por defecto</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>Remitente</b></td><td>texto</td><td><code>""</code></td>
<td>
Identifica la fuente de la acción de arrastre al objetivo de soltar
</td>
</tr>
<tr>
<td><b>Tipo de mime</b></td><td>texto</td><td><code>""</code></td>
<td>
El tipo <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types">MIME</a> de <b>datos</b>.
</td>
</tr>
<tr>
<td><b>Datos</b></td><td>texto</td><td><code>""</code></td>
<td>
Información sobre la acción de arrastrar, por ejemplo, qué se está arrastrando. Debe usarse por el objetivo de soltar.
</td>
</tr>
<tr>
<td><b>MouseIcon</b></td><td><code>Datatype.Content</code></td><td><code>""</code></td>
<td>
El icono para usar con el cursor del mouse durante el arrastre. Si está vacío, usa el cursor predeterminado.
</td>
</tr>
<tr>
<td><b>DragIcon</b></td><td><code>Tipo de datos.Contenido</code></td><td><code>""</code> ></td>
<td>
Una imagen para renderizar bajo el cursor de la ratón durante el arrastre. Esto debería representar el artículo que se arrastra.
</td>
</tr>
<tr>
<td><b>Punto caliente</b></td><td><code>Datotipo.Vector2</code></td><td><code>Datotipo.Vector2.new(0, 0)</code></td>
<td>
El desplazamiento píxel desde la parte superior izquierda donde el cursor debe "mantener" el <b>DragIcon</b>.
</td>
</tr>
</tbody>
Nombre

Vea también:

Parámetros

dragData: Dictionary
Valor predeterminado: ""

Devuelve

()

Muestras 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".

Plugin Drag and Drop

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)
Seguridad del plugin

Une las partes dadas y devuelve la operación de unión resultante.

Parámetros

objects: Instances
Valor predeterminado: ""

Devuelve

CreateDockWidgetPluginGui

Proporciona
Seguridad del plugin

CreateDockWidgetPluginGui crea un nuevo DockWidgetPluginGui desde el dado DockWidgetPluginGuiInfo .El primer parámetro, pluginGuiId , debe ser una cadena única y consistente.Se usa para guardar el estado del estado del puerto del widget y otros detalles internos.

Parámetros

pluginGuiId: string

Un identificador único y consistente que se utiliza para almacenar el estado del puerto del widget y otros detalles internos.

Valor predeterminado: ""
dockWidgetPluginGuiInfo: DockWidgetPluginGuiInfo

Describe el DockWidgetPluginGui para crear (estado inicial, tamaño, etc.).

Valor predeterminado: ""

Devuelve

Muestras de código

This code, when ran inside a Plugin, creates a DockWidgetPluginGui with a simple TextButton.

Widget GUI Text Button

-- 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

Proporciona
Seguridad del plugin

Esta función le pide al usuario que abra un archivo de animación .fbx que se puede cargar en el rigModel , luego procede a insertar la animación como un KeyframeSequence en el Workspace .

Parámetros

rigModel: Instance
Valor predeterminado: ""
isR15: boolean
Valor predeterminado: true

Devuelve

ImportFbxRig

Proporciona
Seguridad del plugin

Solicita al usuario que abra un archivo .fbx, sube los componentes individuales del modelo como mallas y genera un personaje para usar en la animaciones, que se carga en el Workspace .

Parámetros

isR15: boolean
Valor predeterminado: true

Devuelve

PromptForExistingAssetId

Proporciona
Seguridad del plugin

Abre una ventana en Roblox Studio, que le solicita al usuario que seleccione un activo basado en el assetType especificado.Devuelve qué ID de activo se seleccionó o -1 si la ventana se cerró.

Parámetros

assetType: string
Valor predeterminado: ""

Devuelve

PromptSaveSelection

Proporciona
Seguridad del plugin

Solicita al usuario que guarde su selección actual con el nombre de archivo especificado. Devuelve verdadero si el usuario guardó el archivo.

Parámetros

suggestedFileName: string
Valor predeterminado: ""

Devuelve

Eventos

Deactivation

Seguridad del plugin

Despedido cuando el Plugin está desactivado.Esto ocurre cuando el código del plugin llama Plugin:Deactivate() o porque algún otro plugin llamó Plugin:Activate() , lo que obliga a todos los demás plugins a perder su estado activo.

Vea también:

  • Plugin.Unloading , se activa inmediatamente antes de que el plugin se desactive o se vuelva a cargar a través de la desinstalación, desactivación o actualización

Unloading

Seguridad del plugin

Este evento se activa inmediatamente antes de que los Plugin dejen de funcionar.Los plugins se desactivan cuando se desactivan, se eliminan, están a punto de actualizarse o cuando el lugar se está cerrando.

Habilita a un plugin para limpiarse después de sí mismo antes de que sus scripts dejen de funcionar, por ejemplopara eliminar instancias innecesarias de la DataModel .Si un plugin no se limpia correctamente, las copias antiguas permanecerán.Cuando esto ocurre, los usuarios pueden verse obligados a cerrar y reabrir el lugar, lo cual es una mala experiencia de usuario.

Las instancias relacionadas con los plugins como PluginToolbarButtons , DockWidgetPluginGuis y PluginGuis se limpian automáticamente cuando se desinstala el plugin, por lo que no hay necesidad de eliminarlas.