recursiva - recursividad c#
Llamada recursiva a buff/desactualización? C#Unity3D (1)
Tenga en cuenta, la clave aquí es que
1. Usted tiene el buff / desaire en el otro objeto.
Simplemente llama al otro objeto desde el objeto ''jefe''. No coloque el código real buff / desatar en su objeto ''jefe''. Solo "pide un buff".
En otras palabras: siempre tenga el código buff / desatar en la cosa misma que está puliendo / desactivándolo.
2. Para los temporizadores en Unity simplemente use "Invoke" o "invokeRepeating".
Es realmente así de simple.
Un buff / unbuff es así de simple:
OnCollision()
{
other.GetComponent<SlowDown>().SlowForFiveSeconds();
}
en el objeto que quieres ralentizar ...
SlowDown()
{
void SlowForFiveSeconds()
{
speed = slow speed;
Invoke("NormalSpeed", 5f);
}
void NormalSpeed()
{
speed = normal speed;
}
}
Si quieres "reducir la velocidad lentamente", no lo hagas. Es imposible notar eso en un videojuego.
En teoría, si realmente quieres "reducir la velocidad lentamente" ...
SlowDown()
{
void SlowlySlowForFiveSeconds()
{
InvokeRepeating("SlowSteps", 0f, .5f);
Invoke("NormalSpeed", 5f);
}
void SlowSteps()
{
speed = speed * .9f;
}
void NormalSpeed()
{
CancelInvoke("SlowSteps");
speed = normal speed;
}
}
Es así de simple.
Mi objetivo es realizar una sola detección de colisión que disminuya la velocidad de movimiento del objeto con el que colisionó durante un tiempo específico.
Lo que intenté hasta ahora:
//Class that detects the collision
if (other.gameObject.tag == "enemy")
{
EnemyMovement enemyMove = other.GetComponent <EnemyMovement> ();
if (enemyMove.slowMove != 1) {
return;
}
enemyMove.Slow (2, 0.5f, true);
//....
//Class that handles the Enemy-Movement
//The slowfactor gets multiplied with the Vector3 that handles the movementspeed of the Character
void FixedUpdate ()
{
Movement();
}
void Movement()
{
gegnerRigid.MovePosition (transform.position + (gegnerMove * slowMove));
}
public void Slow (float duration, float slowFactor, bool slowed)
{
if (slowed)
{
if (duration > 0) {
duration -= Time.deltaTime;
slowMove = slowFactor;
Slow (duration, slowFactor, slowed); //this recursive Call leads to huge performance issues, but how to keep the function going?
} else {
slowMove = 1;
slowed = false;
}
}
}
Entonces, ¿qué quería que ocurriera? Llame a la función lenta si ocurre una colisión y hágala invocar hasta que la duración sea 0.