Doughnut.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. #pragma warning disable CS0649
  5. #pragma warning disable CS0414
  6. namespace EPOOutline.Demo
  7. {
  8. public class Doughnut : MonoBehaviour, ICollectable
  9. {
  10. [SerializeField]
  11. private float rotationSpeed = 30.0f;
  12. [SerializeField]
  13. private AudioClip eatSound;
  14. [SerializeField]
  15. private float moveAmplitude = 0.25f;
  16. [SerializeField]
  17. private float moveSpeed = 0.2f;
  18. private Outlinable outlinable;
  19. private Vector3 initialPosition;
  20. private float amplitudeShift = 0.0f;
  21. private bool isCollected = false;
  22. private void Start()
  23. {
  24. outlinable = GetComponent<Outlinable>();
  25. amplitudeShift = Random.Range(0.0f, 10.0f);
  26. initialPosition = transform.position;
  27. }
  28. private void Update()
  29. {
  30. if (!isCollected)
  31. transform.position = initialPosition + Vector3.up * Mathf.Sin(Time.time * moveSpeed + amplitudeShift);
  32. transform.Rotate(Vector3.up * rotationSpeed * Time.smoothDeltaTime, Space.World);
  33. }
  34. public void Collect(GameObject collector)
  35. {
  36. if (isCollected)
  37. return;
  38. isCollected = true;
  39. StartCoroutine(AnimateCollection(collector));
  40. }
  41. private IEnumerator AnimateCollection(GameObject collector)
  42. {
  43. AudioSource.PlayClipAtPoint(eatSound, transform.position, 10);
  44. var duration = 0.2f;
  45. var collectionRadius = 1.5f;
  46. var collectionAngle = Random.Range(0.0f, 360.0f);
  47. var timeLeft = duration;
  48. while (collector != null && timeLeft > 0.0f)
  49. {
  50. timeLeft -= Time.smoothDeltaTime;
  51. var collectionShift = Quaternion.Euler(0, collectionAngle, 0) * Vector3.right;
  52. var targetPosition = collector.transform.position + collectionShift + Vector3.up * 4.5f;
  53. transform.position = Vector3.Lerp(transform.position, targetPosition, Time.smoothDeltaTime * 5.0f);
  54. collectionAngle += Time.smoothDeltaTime * 360.0f;
  55. collectionRadius = Mathf.MoveTowards(collectionRadius, 0.0f, Time.smoothDeltaTime * 3.5f);
  56. yield return null;
  57. }
  58. timeLeft = duration;
  59. var initialScale = transform.localScale;
  60. while (timeLeft >= 0.0f)
  61. {
  62. timeLeft -= Time.smoothDeltaTime;
  63. transform.localScale = Vector3.Lerp(initialScale, Vector3.zero, 1.0f - (timeLeft / duration));
  64. yield return null;
  65. }
  66. transform.localScale = Vector3.zero;
  67. Destroy(gameObject);
  68. }
  69. }
  70. }