145 lines
4.4 KiB
C#
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;
|
|
}
|
|
} |