Контекстное меню
Контекстное меню показывает список действий при правом клике (или долгом нажатии) на слот инвентаря. Пункты меню настраиваются через ScriptableObject-пресеты и могут быть разными для каждого инвентаря.
Как работает
flowchart LR
A["ПКМ по слоту"] --> B["Собрать\nдоступные\nпункты"]
B --> C["Показать\nменю"]
C --> D["Игрок\nвыбирает\nпункт"]
D --> E["Выполнить\nдействие"]
Система автоматически фильтрует пункты через CanShow() --- в меню попадают только те действия, которые применимы к текущему слоту. Пункты сортируются по полю Order.
Настройка
- Добавьте
ContextMenuManagerна сцену (синглтон). Назначьте ему префаб вьюшки меню. - Создайте пресет через меню: Create > DragAndDrop > ContextMenu > Preset. Добавьте в него нужные пункты.
- Добавьте
ContextMenuBinderна GameObject инвентаря. Назначьте пресет для непустых слотов и (опционально) отдельный пресет для пустых слотов. - Привяжите действие
ShowContextMenuActionк правой кнопке мыши (или долгому нажатию) вInteractionBindingsProfile.
Свой пункт меню
Создайте ScriptableObject, унаследовавшись от ContextMenuEntryDefinitionSO:
[CreateAssetMenu(menuName = "Game/Context Menu/Use Item")]
public class UseItemEntry : ContextMenuEntryDefinitionSO
{
public override bool CanShow(ContextMenuContext ctx)
{
// Показывать только если есть предмет
return ctx.Item != null;
}
public override void Execute(ContextMenuContext ctx)
{
// Ваша логика использования предмета
Debug.Log($"Используем: {ctx.Item.DisplayName}");
}
}
Затем создайте ассет через Create и добавьте его в пресет меню.
Встроенные пункты
| Пункт | Описание |
|---|---|
| Debug | Выводит информацию о предмете в консоль (имя, количество) |
| Sort | Сортирует предметы в инвентаре (по имени, категории, редкости) |
Контекст
При вызове Execute() и CanShow() вы получаете структуру ContextMenuContext с полной информацией:
| Поле | Тип | Описание |
|---|---|---|
Slot |
BaseSlot |
Слот, на котором вызвали меню |
Item |
IItemAdapter |
Предмет в слоте (null если пустой) |
ItemCount |
int |
Количество предметов в стаке |
Inventory |
UniversalInventory |
Инвентарь, которому принадлежит слот |
ScreenPosition |
Vector2 |
Экранная позиция клика |
InputSource |
FocusSource |
Источник ввода (мышь / геймпад) |
Закрытие меню выполняется автоматически через ContextMenuManager.Instance.Hide().
Справочник классов
| Класс | Роль |
|---|---|
ContextMenuManager |
Синглтон-менеджер: показывает/скрывает меню |
ContextMenuPreset |
ScriptableObject-пресет со списком пунктов |
ContextMenuBinder |
Привязывает пресеты к инвентарю |
ContextMenuEntryDefinitionSO |
Базовый SO для пункта меню (наследуйте) |
IContextMenuEntry |
Интерфейс пункта меню |
ContextMenuContext |
Структура с данными о контексте вызова |
ContextMenuViewBase |
Базовый класс вьюшки меню (реализуйте свою) |
UniversalContextMenuView |
Готовая UGUI-реализация вьюшки |
ShowContextMenuAction |
Действие для привязки к PointerBinding |