Untitled
unknown
plain_text
a year ago
4.1 kB
9
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