motkot
@motkot
Программирование C#.

Как нормально реализовать подбор/показ предметов инвентарь?

Инвентарь работает, но проблема с предметами.

Инвентарь реализован с помощью scriptable object

У предмета есть его максимальное количество:

Доски: максимальное количество 32

Топор: максимальное количество 1

При подборе к количеству предмета начисляется его количество: Лежит 5 досок, тогда проверять, если досок у игрока нет, тогда .Add, если есть, тогда к этому элементу листа Items добавлять количество лежащих досок.

Может это можно как то улучшить?

Сейчас:

public static void AddItem(Item _item, int Amount)
{
if(Items.Find(item => item == _item) != null)
{
var item = Items.Find(item => item == _item);
item.Amount += Amount;
}
else // Если нету такого
{
_item.Amount += Amount;
Items.Add(_item);
}

}


Главная ​проблемa:

Я уже сказал про максимальное количество, так вот. Сейчас есть переменная ограничения есть, но она никак не используется. Список предметов заполняется так:

private void RenderItems()
    {
        foreach (Transform child in _contaner)
        {
            Destroy(child.gameObject);
        }

        Inventory.Items.ForEach(item =>
        {
            var cell = Instantiate(_inventotyCell, _contaner);
            cell.Render(item);
        });
    }


И как видите сейчас нету ограничений, а нужно так, чтобы если например максимальное количество было 10, а предметов 16, то в первую клетку занести 10, а во вторую 6. А например если максималка 10, а есть 84, то будет 8 по 10 и одна по 4. Думаю смысл понятен. Как это сделать?
  • Вопрос задан
  • 30 просмотров
Пригласить эксперта
Ответы на вопрос 1
twobomb
@twobomb
У вас _item что передается аргументом, тот и добавляется в массив. А если вам их нужно 8шт, то их же нужно где-то взять. Как вариант передовать ид айтема, а в методе уже создавать. Типа такого
public static void AddItem(int itemId, int Amount){
	
	int inventoryCellCount = 20;//Количество ячеек инвентаря
	int maxCount = GetMaxCountById(itemId);//Получить максимальное кол-во стека для этого айтема по ид
	
	while(Amount > 0){
		var item = Items.Find(item => item.id == itemId);
		if(item == null || item.Amount == maxCount){
			if(Items.Count >= inventoryCellCount)//Если ячейки инвентаря забиты
				break;
			item = CreateItemById(itemId);//создает итем по ид
			Items.Add(item);			
		}	
		if(item.Amount + Amount > maxCount){		
			Amount = Amount - (maxCount - item.Amount);
			item.Amount = maxCount;
		}
		else{
			item.Amount += Amount;
			Amount = 0;
		}
	}
}

P.S. Ну и тут есть недостаток, допустим поднимаем предметов 80шт. а у нас места только на 20 и дальше инвентарь забивается. Тут нужно продумать обратную связь, ну типа банально возвращать остаточный Amount и записывать его в предмет на земле, если он равен нулю то удалять предмет с земле если больше нуля перезаписывать кол-во. Ну или радикальный метод удалять предмет с земли после подбора окончательно, а если всё не влезло то оно изчезнет просто, тут уже на ваш выбор...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы