Context Menu
El context menu muestra una lista de acciones al hacer clic derecho (o pulsación larga) sobre un slot del inventario. Las entradas del menú se configuran mediante ScriptableObject presets y pueden ser distintas para cada inventario.
Cómo funciona
flowchart LR
A["Right-click\non slot"] --> B["Collect\navailable\nentries"]
B --> C["Show\nmenu"]
C --> D["Player\nselects\nan entry"]
D --> E["Execute\naction"]
El sistema filtra automáticamente las entradas a través de CanShow(): solo aparecen acciones aplicables al slot actual. Las entradas se ordenan por el campo Order.
Configuración
- Añade
ContextMenuManagera la escena (singleton). Asígnale el prefab de la vista del menú. - Crea un preset desde el menú: Create > DragAndDrop > ContextMenu > Preset. Añádele las entradas deseadas.
- Añade
ContextMenuBinderal GameObject del inventario. Asigna un preset para slots no vacíos y, opcionalmente, otro para slots vacíos. - Vincula la acción
ShowContextMenuActional botón derecho del ratón (o pulsación larga) enInteractionBindingsProfile.
Entrada de menú personalizada
Crea un ScriptableObject heredando de ContextMenuEntryDefinitionSO:
[CreateAssetMenu(menuName = "Game/Context Menu/Use Item")]
public class UseItemEntry : ContextMenuEntryDefinitionSO
{
public override bool CanShow(ContextMenuContext ctx)
{
// Show only if there is an item
return ctx.Item != null;
}
public override void Execute(ContextMenuContext ctx)
{
// Your item usage logic
Debug.Log($"Using: {ctx.Item.DisplayName}");
}
}
Después crea el asset desde Create y añádelo al preset del menú.
Entradas incluidas
| Entrada | Descripción |
|---|---|
| Debug | Imprime información del item en la consola (nombre, cantidad) |
| Sort | Ordena los items del inventario (por nombre, categoría, rareza) |
Contexto
Cuando se llaman Execute() y CanShow(), recibes una estructura ContextMenuContext con toda la información:
| Campo | Tipo | Descripción |
|---|---|---|
Slot |
BaseSlot |
El slot sobre el que se invocó el menú |
Item |
IItemAdapter |
El item del slot (null si está vacío) |
ItemCount |
int |
Número de items en el stack |
Inventory |
UniversalInventory |
El inventario propietario del slot |
ScreenPosition |
Vector2 |
Posición en pantalla del clic |
InputSource |
FocusSource |
Fuente de input (mouse / gamepad) |
El cierre del menú se gestiona automáticamente mediante ContextMenuManager.Instance.Hide().
Referencia de clases
| Clase | Rol |
|---|---|
ContextMenuManager |
Singleton manager: muestra/oculta el menú |
ContextMenuPreset |
ScriptableObject preset con una lista de entradas |
ContextMenuBinder |
Vincula presets a un inventario |
ContextMenuEntryDefinitionSO |
SO base para una entrada de menú (hereda de él) |
IContextMenuEntry |
Interface de una entrada de menú |
ContextMenuContext |
Struct con datos del contexto de invocación |
ContextMenuViewBase |
Clase base para la vista del menú (implementa la tuya) |
UniversalContextMenuView |
Implementación UGUI lista para usar |
ShowContextMenuAction |
Acción para vincular a PointerBinding |