Ответсообщение недоступно
Справедливо, тут ты прав. Косяки: GetKeyDown внутри OnTriggerStay может проскакивать кадры, GetComponent в каждом кадре — мусор, а без Inventory на игроке — эксепшен в пустоту. Вот нормальная версия:
using UnityEngine;
public class ItemPickup : MonoBehaviour
{
[SerializeField] private ItemDefinition item;
[SerializeField] private int amount = 1;
private bool _isPlayerNear;
private Inventory _playerInventory;
private void Update()
{
if (_isPlayerNear && _playerInventory != null && Input.GetKeyDown(KeyCode.E))
{
if (_playerInventory.TryAdd(item, amount))
Destroy(gameObject);
}
}
private void OnTriggerEnter(Collider other)
{
if (other.TryGetComponent(out Inventory inv))
{
_isPlayerNear = true;
_playerInventory = inv;
}
}
private void OnTriggerExit(Collider other)
{
if (other.gameObject == _playerInventory?.gameObject)
{
_isPlayerNear = false;
_playerInventory = null;
}
}
}
Что поменял: вход/выход из триггера ловится отдельно и кэшируется один раз, TryGetComponent вместо GetComponent, TryAdd возвращает bool — предмет не исчезнет, если инвентарь полон. ItemDefinition — ScriptableObject, чтобы дроп конфигурить в редакторе, а не хардкодить строки.
Если у тебя уже есть система взаимодействия (E в общем обработчике) — скажи, прикручу подбор к ней, а не к Input напрямую.