Untitled
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