Загрузка данных
using UnityEngine;
public class PickUpSystem : MonoBehaviour
{
[Header("Ссылки и дальность")]
public Transform holdParent;
public GameObject uiPrompt;
public float range = 3f, throwForce = 400f;
[HideInInspector] public bool hasKey = false; // Наш невидимый карман для ключа
private GameObject heldObj; // Предмет, который физически удерживается в руке (фонарик)
private Collider playerCollider;
void Start()
{
playerCollider = GetComponent<Collider>();
if (uiPrompt != null) uiPrompt.SetActive(false);
}
void Update()
{
// БРОСОК: Если в руке есть предмет (фонарик), его ВСЕГДА можно бросить на G
if (heldObj != null && Input.GetKeyDown(KeyCode.G))
{
ThrowObject();
}
// ВЗАИМОДЕЙСТВИЕ: Пускаем луч из глаз, даже если в руках ГОРИТ фонарик!
Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
if (Physics.Raycast(ray, out RaycastHit hit, range))
{
// Если луч наткнулся на интерактивный предмет
if (hit.transform.TryGetComponent(out Interactable interactableObj))
{
// Если мы смотрим на предмет, который УЖЕ держим в руках, подсказку "Е" не показываем
if (hit.transform.gameObject == heldObj)
{
if (uiPrompt != null) uiPrompt.SetActive(false);
return;
}
// Показываем надпись [ E ] на экране
if (uiPrompt != null) uiPrompt.SetActive(true);
// Нажатие на кнопку E
if (Input.GetKeyDown(KeyCode.E))
{
interactableObj.Activate(gameObject);
}
}
else { if (uiPrompt != null) uiPrompt.SetActive(false); }
}
else { if (uiPrompt != null) uiPrompt.SetActive(false); }
}
// Этот метод вызывается автоматически из скрипта Interactable
public void GrabObject(GameObject pickUpObj)
{
// Двойная защита: если это ключ с именем RoomKey — кладем его СТРОГО в карман
if (pickUpObj.name == "RoomKey")
{
hasKey = true; // Ключ в кармане!
Destroy(pickUpObj); // Удаляем физическую модельку с тумбочки
if (uiPrompt != null) uiPrompt.SetActive(false);
Debug.Log("Ключ успешно спрятан в карман Олега!");
return; // Выходим из метода, рука остается свободной (или в ней остается фонарик)
}
// Если мы подобрали обычный предмет (например, канистру), а в руках УЖЕ есть фонарик —
// мы сначала автоматически выбрасываем фонарик, чтобы освободить руку
if (heldObj != null)
{
ThrowObject();
}
heldObj = pickUpObj;
if (heldObj.TryGetComponent(out Collider objCollider) && playerCollider != null) Physics.IgnoreCollision(playerCollider, objCollider, true);
if (heldObj.TryGetComponent(out Rigidbody rb)) { rb.isKinematic = true; rb.useGravity = false; }
heldObj.transform.parent = holdParent;
heldObj.transform.localPosition = Vector3.zero;
heldObj.transform.localRotation = Quaternion.identity;
if (heldObj.TryGetComponent(out PhysicalFlashlight f)) f.isGrabbed = true;
if (uiPrompt != null) uiPrompt.SetActive(false);
}
void ThrowObject()
{
if (heldObj.TryGetComponent(out Rigidbody rb)) { rb.isKinematic = false; rb.useGravity = true; rb.AddForce(Camera.main.forward * throwForce); }
if (heldObj.TryGetComponent(out Collider objCollider) && playerCollider != null) Physics.IgnoreCollision(playerCollider, objCollider, false);
heldObj.transform.parent = null;
if (heldObj.TryGetComponent(out PhysicalFlashlight f)) f.isGrabbed = false;
heldObj = null;
}
}