Untitled

 avatar
unknown
plain_text
4 months ago
4.1 kB
6
Indexable
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using TMPro;

public class Drawers : MonoBehaviour
{
    [Header("Drawer Settings")]
    public float targetDistance = 5.0f; 
    public Transform drawer; 
    public float openPosition = 1.0f; 
    public float closedPosition = 0.0f; 
    public float openSpeed = 2.0f;
    public float closeSpeed = 2.0f; 
    public KeyCode interactionKey = KeyCode.E;

    [Header("Animation Settings")]
    public AnimationCurve smoothCurve = AnimationCurve.EaseInOut(0, 0, 1, 1);

    [Header("Audio Settings")]
    [Range(0f, 1f)] public float openingVolume = 0.5f; 
    public List<AudioClip> openingSounds = new List<AudioClip>(); 
    [Range(0f, 1f)] public float closingVolume = 0.5f; 
    public List<AudioClip> closingSounds = new List<AudioClip>();

    [Header("UI Settings")]
    public GameObject interactionImage; 

    private Transform player;
    private bool isInteracting = false;
    private bool isDrawerOpen = false; 
    private AudioSource audioSource; 

    void Start()
    {
        player = Camera.main.transform;
        interactionImage.SetActive(false);

        audioSource = gameObject.AddComponent<AudioSource>();
        audioSource.playOnAwake = false;
    }

    void Update()
    {
        if (isInteracting) return;

        float distance = Vector3.Distance(player.position, drawer.position);
        RaycastHit hit;
        bool isRaycastingToDrawer = Physics.Raycast(player.position, player.forward, out hit, targetDistance) && hit.transform == drawer;

        if (distance <= targetDistance && isRaycastingToDrawer)
        {
            interactionImage.SetActive(true);

            if (Input.GetKeyDown(interactionKey))
            {
                if (!isDrawerOpen)
                {
                    StartCoroutine(OpenDrawer());
                }
                else
                {
                    StartCoroutine(CloseDrawer());
                }
            }
        }
        else
        {
            interactionImage.SetActive(false);
        }
    }

    IEnumerator OpenDrawer()
    {
        isInteracting = true;
        interactionImage.SetActive(false);

        PlayRandomSound(openingSounds, openingVolume);

        Vector3 startPosition = drawer.localPosition;
        Vector3 endPosition = new Vector3(openPosition, startPosition.y, startPosition.z);

        float elapsedTime = 0f;
        float duration = 1f / openSpeed;

        while (elapsedTime < duration)
        {
            float t = smoothCurve.Evaluate(elapsedTime / duration);
            drawer.localPosition = Vector3.Lerp(startPosition, endPosition, t);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        drawer.localPosition = endPosition;
        isDrawerOpen = true;
        isInteracting = false;
    }

    IEnumerator CloseDrawer()
    {
        isInteracting = true;
        interactionImage.SetActive(false);

        PlayRandomSound(closingSounds, closingVolume);

        Vector3 startPosition = drawer.localPosition;
        Vector3 endPosition = new Vector3(closedPosition, startPosition.y, startPosition.z);

        float elapsedTime = 0f;
        float duration = 1f / closeSpeed;

        while (elapsedTime < duration)
        {
            float t = smoothCurve.Evaluate(elapsedTime / duration);
            drawer.localPosition = Vector3.Lerp(startPosition, endPosition, t);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        drawer.localPosition = endPosition;
        isDrawerOpen = false;
        isInteracting = false;
    }

    private void PlayRandomSound(List<AudioClip> sounds, float volume)
    {
        if (sounds.Count > 0)
        {
            AudioClip clip = sounds[Random.Range(0, sounds.Count)];
            audioSource.volume = volume;
            audioSource.PlayOneShot(clip);
        }
    }
}
Editor is loading...
Leave a Comment