Untitled
unknown
plain_text
10 months ago
4.1 kB
7
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