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