Автор: Lumennes
При стандартных настройках игрок подбирает все предметы автоматически.
В этом уроке я вам покажу как подобрать предмет при наведении и нажатии клавиши.
Данный способ хорошо подходит для RPG игр.

https://c.radikal.ru/c29/1905/e6/6ac138782899.jpg

для начало нам необходимо открыть класс ActionGameWindow.cs

https://a.radikal.ru/a29/1905/00/e63ccd16edd0.jpg

Добавим новую переменную:

https://a.radikal.ru/a35/1905/81/be0057ceeb0b.jpg

Код:
Item currentItem;


в метод UpdateCurrentPlayerUseObjects

нужно добавить...

https://c.radikal.ru/c20/1905/36/4b2d44fa3a5e.jpg

Код:
//currentItem
{
                Item overItem = null;

    
                Map.Instance.GetObjects(ray, delegate(MapObject obj, float scale)
                {
                    Item item = obj as Item;
                    if (item != null)
                    {
                        overItem = item;
                        return false;
                    }

    
                    return true;
                });

    
                //draw selection border
                if (overItem != null)
                {
                    Bounds bounds = overItem.MapBounds;
                    DrawObjectSelectionBorder(bounds);
                }

    
                if (overItem != currentItem)
                    currentItem = overItem;
            }


Нужно изменить в том же методе.

https://a.radikal.ru/a43/1905/e1/30d5fc8c06e2.jpg

этот код:

Код:
if (currentSwitch != null || currentSeeUnitAllowPlayerControl != null)


меняем на этот:

Код:
if (currentSwitch != null || currentItem != null || currentSeeUnitAllowPlayerControl != null)


В методе DrawTarget

https://b.radikal.ru/b04/1905/23/73bb1adc6852.jpg

этот код:

Код:
if( weapon != null || currentAttachedGuiObject != null || currentSwitch != null)


меняем на этот:

Код:
if( weapon != null || currentAttachedGuiObject != null || currentSwitch != null || currentItem != null)


И добавляем новый метод TakeItem

https://d.radikal.ru/d20/1905/c6/3d4966bce80b.jpg

Код:
bool TakeItem()
        {
            if (currentItem == null)
                return false;

    
            currentItem.Take(GetPlayerUnit());

    
            return true;
        }


В методе GameControlsManager_GameControlsEvent

https://d.radikal.ru/d20/1905/c6/3d4966bce80b.jpg

добавляем:

Код:
if (TakeItem())
                            return;


Далее компилируем проект
https://b.radikal.ru/b40/1905/b7/57f4f43d1057.jpg