Загрузка данных


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;
    }
}