public void Resize (float time, float size) { Resize(time, new Vector2(size, size, size)); }
public void Resize (float time, Vector3 size) { // останавливаем ресайз если он происходит if (_resizeCoroutine != null) StopCoroutine(_resizeCoroutine); // запускаем корутину ресайза _resizeCoroutine = ResizeCoroutine(time, size); StartCoroutine(_resizeCoroutine); }
private IEnumerator ResizeCoroutine (float time, Vector3 target) { float Timer = 0; Vector3 Base = _transform.localScale; while (Timer < time) { _transform.localScale = Vector3.Lerp(Base, target, Timer/time); yield return null; // задержка цикла до следующего кадра Timer += Time.deltaTime; } _transform.localScale = target; _resizeCoroutine = null; } }
Лучше тупо замерять время межну началом измерений и текущим временем. Любые манипуляции со временем упираются в тот веселый факт, что ты работаешь не в системе реального времени и накопление ошибок неизбежно.
private Transform _transform;
private IEnumerator _resizeCoroutine;
private void Start () {
_transform = transform; // кешируем трансформ
Resize(2f, 5);
}
public void Resize (float time, float size) {
Resize(time, new Vector2(size, size, size));
}
public void Resize (float time, Vector3 size) {
// останавливаем ресайз если он происходит
if (_resizeCoroutine != null)
StopCoroutine(_resizeCoroutine);
// запускаем корутину ресайза
_resizeCoroutine = ResizeCoroutine(time, size);
StartCoroutine(_resizeCoroutine);
}
private IEnumerator ResizeCoroutine (float time, Vector3 target) {
float Timer = 0;
Vector3 Base = _transform.localScale;
while (Timer < time) {
_transform.localScale = Vector3.Lerp(Base, target, Timer/time);
yield return null; // задержка цикла до следующего кадра
Timer += Time.deltaTime;
}
_transform.localScale = target;
_resizeCoroutine = null;
}
}