Afterparty/Assets/Scripts/Player/PlayerHandsController.cs
2026-01-11 17:04:23 +03:00

145 lines
4.4 KiB
C#

using System.Collections;
using UnityEngine;
public class PlayerHandsController : MonoBehaviour
{
public static PlayerHandsController Instance;
[Header("Visual Models")]
public GameObject emptyBagModel;
public GameObject fullBagModel;
[Header("Broom Settings")]
[SerializeField] private GameObject broomModel;
[SerializeField] private float sweepAnimationDuration = 1.5f;
[SerializeField] private float sweepAngle = 30f;
[Header("Rag Settings")]
[SerializeField] private GameObject ragModel; // Model for the rag in hand
[SerializeField] private float wipeAnimationDuration = 1.0f;
[SerializeField] private float wipeDistance = 0.1f;
private Coroutine _animationCoroutine;
private void Awake()
{
Instance = this;
}
private void Start()
{
HideHands(); // Hides all models at the start
}
public void ShowBag(bool isFull)
{
HideHands();
if (emptyBagModel) emptyBagModel.SetActive(!isFull);
if (fullBagModel) fullBagModel.SetActive(isFull);
}
public void ShowBroom(bool state)
{
HideHands();
if (broomModel != null)
{
broomModel.SetActive(state);
}
}
public void ShowRag(bool state)
{
HideHands();
if (ragModel != null)
{
ragModel.SetActive(state);
}
}
public void HideHands()
{
if (emptyBagModel) emptyBagModel.SetActive(false);
if (fullBagModel) fullBagModel.SetActive(false);
if (broomModel) broomModel.SetActive(false);
if (ragModel) ragModel.SetActive(false);
}
public void PlaySweepAnimation()
{
if (broomModel != null && broomModel.activeInHierarchy)
{
if (_animationCoroutine != null) StopCoroutine(_animationCoroutine);
_animationCoroutine = StartCoroutine(SweepRoutine());
}
}
public void PlayWipeAnimation()
{
if (ragModel != null && ragModel.activeInHierarchy)
{
if (_animationCoroutine != null) StopCoroutine(_animationCoroutine);
_animationCoroutine = StartCoroutine(WipeRoutine());
}
}
private IEnumerator SweepRoutine()
{
Quaternion startRotation = broomModel.transform.localRotation;
Quaternion forwardRotation = startRotation * Quaternion.Euler(sweepAngle, 0, 0);
Quaternion backwardRotation = startRotation * Quaternion.Euler(-sweepAngle / 2, 0, 0);
float halfDuration = sweepAnimationDuration / 2;
float timer = 0f;
while (timer < halfDuration)
{
timer += Time.deltaTime;
broomModel.transform.localRotation = Quaternion.Slerp(startRotation, forwardRotation, timer / halfDuration);
yield return null;
}
timer = 0f;
while (timer < halfDuration)
{
timer += Time.deltaTime;
broomModel.transform.localRotation = Quaternion.Slerp(forwardRotation, backwardRotation, timer / halfDuration);
yield return null;
}
broomModel.transform.localRotation = startRotation;
_animationCoroutine = null;
}
private IEnumerator WipeRoutine()
{
Vector3 startPosition = ragModel.transform.localPosition;
Vector3 forwardPosition = startPosition + new Vector3(wipeDistance, 0, 0);
Vector3 backwardPosition = startPosition - new Vector3(wipeDistance, 0, 0);
float quarterDuration = wipeAnimationDuration / 4;
float timer = 0f;
// Wipe forward
while (timer < quarterDuration)
{
timer += Time.deltaTime;
ragModel.transform.localPosition = Vector3.Lerp(startPosition, forwardPosition, timer / quarterDuration);
yield return null;
}
// Wipe back
timer = 0f;
while (timer < quarterDuration * 2)
{
timer += Time.deltaTime;
ragModel.transform.localPosition = Vector3.Lerp(forwardPosition, backwardPosition, timer / (quarterDuration * 2));
yield return null;
}
// Return to start
timer = 0f;
while (timer < quarterDuration)
{
timer += Time.deltaTime;
ragModel.transform.localPosition = Vector3.Lerp(backwardPosition, startPosition, timer / quarterDuration);
yield return null;
}
ragModel.transform.localPosition = startPosition;
_animationCoroutine = null;
}
}