98 lines
2.8 KiB
C#
98 lines
2.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
#pragma warning disable CS0649
|
|
#pragma warning disable CS0414
|
|
|
|
namespace EPOOutline.Demo
|
|
{
|
|
public class Doughnut : MonoBehaviour, ICollectable
|
|
{
|
|
[SerializeField]
|
|
private float rotationSpeed = 30.0f;
|
|
|
|
[SerializeField]
|
|
private AudioClip eatSound;
|
|
|
|
[SerializeField]
|
|
private float moveAmplitude = 0.25f;
|
|
|
|
[SerializeField]
|
|
private float moveSpeed = 0.2f;
|
|
|
|
private Outlinable outlinable;
|
|
|
|
private Vector3 initialPosition;
|
|
|
|
private float amplitudeShift = 0.0f;
|
|
|
|
private bool isCollected = false;
|
|
|
|
private void Start()
|
|
{
|
|
outlinable = GetComponent<Outlinable>();
|
|
amplitudeShift = Random.Range(0.0f, 10.0f);
|
|
initialPosition = transform.position;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (!isCollected)
|
|
transform.position = initialPosition + Vector3.up * Mathf.Sin(Time.time * moveSpeed + amplitudeShift);
|
|
|
|
transform.Rotate(Vector3.up * rotationSpeed * Time.smoothDeltaTime, Space.World);
|
|
}
|
|
|
|
public void Collect(GameObject collector)
|
|
{
|
|
if (isCollected)
|
|
return;
|
|
|
|
isCollected = true;
|
|
|
|
StartCoroutine(AnimateCollection(collector));
|
|
}
|
|
|
|
private IEnumerator AnimateCollection(GameObject collector)
|
|
{
|
|
AudioSource.PlayClipAtPoint(eatSound, transform.position, 10);
|
|
|
|
var duration = 0.2f;
|
|
var collectionRadius = 1.5f;
|
|
var collectionAngle = Random.Range(0.0f, 360.0f);
|
|
var timeLeft = duration;
|
|
|
|
while (collector != null && timeLeft > 0.0f)
|
|
{
|
|
timeLeft -= Time.smoothDeltaTime;
|
|
|
|
var collectionShift = Quaternion.Euler(0, collectionAngle, 0) * Vector3.right;
|
|
|
|
var targetPosition = collector.transform.position + collectionShift + Vector3.up * 4.5f;
|
|
|
|
transform.position = Vector3.Lerp(transform.position, targetPosition, Time.smoothDeltaTime * 5.0f);
|
|
|
|
collectionAngle += Time.smoothDeltaTime * 360.0f;
|
|
collectionRadius = Mathf.MoveTowards(collectionRadius, 0.0f, Time.smoothDeltaTime * 3.5f);
|
|
|
|
yield return null;
|
|
}
|
|
|
|
timeLeft = duration;
|
|
|
|
var initialScale = transform.localScale;
|
|
while (timeLeft >= 0.0f)
|
|
{
|
|
timeLeft -= Time.smoothDeltaTime;
|
|
|
|
transform.localScale = Vector3.Lerp(initialScale, Vector3.zero, 1.0f - (timeLeft / duration));
|
|
|
|
yield return null;
|
|
}
|
|
|
|
transform.localScale = Vector3.zero;
|
|
|
|
Destroy(gameObject);
|
|
}
|
|
}
|
|
} |