la función se ve así:
private void Shrink(Animation anim) { AnimationClip clip = new AnimationClip(); clip.legacy = true; char[] c = { 'x', 'y', 'z' }; float rot = Random.value * 360 - 180; Vector3 toPosition = transform.position + (Random.value * radius * 5 / 6 + radius / 6) * new Vector3(Mathf.Cos(rot), Mathf.Sin(rot)); float scaleMul = Random.value / 4 + 1.0f / 2.0f; float duration = (transform.position - toPosition).magnitude / speed; for (int i = 0; i < 3; i++) { Keyframe[] keys; keys = new Keyframe[2]; keys[0] = new Keyframe(0.0f, transform.position[i]); keys[1] = new Keyframe(duration, toPosition[i]); curve = new AnimationCurve(keys); clip.SetCurve("", typeof(Transform), "localPosition." + c[i], curve); } for (int i = 0; i < 3; i++) { Keyframe[] keys; keys = new Keyframe[2]; keys[0] = new Keyframe(0.0f, transform.localScale[i]); keys[1] = new Keyframe(duration, transform.localScale[i] * scaleMul); curve = new AnimationCurve(keys); clip.SetCurve("", typeof(Transform), "localScale." + c[i], curve); } // now animate the GameObject anim.AddClip(clip, clip.name); anim.Play(clip.name); }todo lo que hace es animar la reducción de un borde y moverlo a una ubicación aleatoria dentro de un radio. la función funciona bien si la llamo sola, pero quiero que la función se llame cada x segundos, así que escribí esta rutina:
IEnumerator ShrinkCR(float time) { for (int i = 0; i < 3; i++) { yield return new WaitForSeconds(time); Shrink(anim); } }y simplemente lo llamó dentro de update():
private void Update() { StartCoroutine(ShrinkCR(10)); }pero cuando hago eso, el borde se vuelve loco y, en cambio, va a una ubicación aleatoria dentro de un radio, simplemente acelera hacia la derecha indefinidamente. ¿¿¿¿Qué hice mal????
La Update se llama cada cuadro, por lo que está iniciando la rutina 60 veces por segundo aproximadamente. Es por eso que estás teniendo ese comportamiento. Llámalo una vez donde y cuando lo necesites, no en la actualización.