using UnityEngine;
///
/// Предмет в мире — подбирается только по нажатию кнопки E (через charecter.cs).
/// Авто-подбор при касании намеренно убран.
///
public class WorldItem : MonoBehaviour
{
public ItemData itemData;
public int amount = 1;
[Header("Pickup")]
public float pickupDelay = 0f;
public float interactRange = 2.5f;
private bool _canPickup;
private bool _setupCalled;
void Start()
{
// Объект размещён в сцене через редактор — Setup() не вызывается,
// поэтому инициализируем pickup здесь.
if (!_setupCalled)
{
if (pickupDelay > 0)
Invoke(nameof(EnablePickup), pickupDelay);
else
_canPickup = true;
}
}
public void Setup(ItemData data, int count)
{
_setupCalled = true;
itemData = data;
amount = count;
// Спавним модель только если визуал ещё не встроен в prefab
if (data.modelPrefab != null && transform.childCount == 0)
{
var model = Instantiate(data.modelPrefab, transform);
model.transform.localPosition = Vector3.zero;
// Удаляем WorldItem из визуальной модели — она только для отображения,
// не должна быть самостоятельным подбираемым объектом
foreach (var wi in model.GetComponentsInChildren())
Destroy(wi);
}
if (pickupDelay > 0)
Invoke(nameof(EnablePickup), pickupDelay);
else
_canPickup = true;
}
private void EnablePickup() => _canPickup = true;
///
/// Вызывается из charecter.cs при нажатии E рядом с предметом.
///
public bool TryPickupByButton()
{
if (!_canPickup)
{
Debug.LogWarning("[WorldItem] Cannot pickup — delay not elapsed yet");
return false;
}
if (itemData == null)
{
Debug.LogWarning("[WorldItem] itemData is null!");
return false;
}
if (InventoryManager.Instance == null)
{
Debug.LogWarning("[WorldItem] InventoryManager.Instance is null!");
return false;
}
int remaining = InventoryManager.Instance.AddItem(itemData, amount);
if (remaining <= 0)
{
CancelInvoke(); // отменяем отложенный EnablePickup если он ещё не сработал
Destroy(gameObject);
return true;
}
amount = remaining;
return false;
}
///
/// Выбросить предмет с физической силой.
///
public void Throw(Vector3 velocity)
{
var rb = GetComponent();
if (rb == null) rb = gameObject.AddComponent();
rb.linearVelocity = velocity;
}
}