c# - tutorial - Mueve GameObject con el tiempo
unity script español (3)
La respuesta de git1 es buena, pero hay otra solución si no desea usar couritines.
Puede usar
InvokeRepeating
para activar repetidamente una función.
float duration; //duration of movement
float durationTime; //this will be the value used to check if Time.time passed the current duration set
void Start()
{
StartMovement();
}
void StartMovement()
{
InvokeRepeating("MovementFunction", Time.deltaTime, Time.deltaTime); //Time.deltaTime is the time passed between two frames
durationTime = Time.time + duration; //This is how long the invoke will repeat
}
void MovementFunction()
{
if(durationTime > Time.time)
{
//Movement
}
else
{
CancelInvoke("MovementFunction"); //Stop the invoking of this function
return;
}
}
Estoy aprendiendo Unity desde un fondo Swift SpriteKit donde mover la posición x de un sprite es tan sencillo como ejecutar una acción como se muestra a continuación:
let moveLeft = SKAction.moveToX(self.frame.width/5, duration: 1.0)
let delayAction = SKAction.waitForDuration(1.0)
let handSequence = SKAction.sequence([delayAction, moveLeft])
sprite.runAction(handSequence)
Me gustaría saber una forma equivalente o similar de mover un sprite a una posición específica por una duración específica (por ejemplo, un segundo) con un retraso que no tiene que ser llamado en la función de actualización.
La respuesta de gjttt1 es cercana pero le faltan funciones importantes y el uso de
WaitForSeconds()
para mover
GameObject
es inaceptable.
Debe usar la combinación de
Lerp
,
Coroutine
y
Time.deltaTime
.
Debe comprender estas cosas para poder hacer animación desde Script en Unity.
public GameObject objectectA;
public GameObject objectectB;
void Start()
{
StartCoroutine(moveToX(objectectA.transform, objectectB.transform.position, 1.0f));
}
bool isMoving = false;
IEnumerator moveToX(Transform fromPosition, Vector3 toPosition, float duration)
{
//Make sure there is only one instance of this function running
if (isMoving)
{
yield break; ///exit if this is still running
}
isMoving = true;
float counter = 0;
//Get the current position of the object to be moved
Vector3 startPos = fromPosition.position;
while (counter < duration)
{
counter += Time.deltaTime;
fromPosition.position = Vector3.Lerp(startPos, toPosition, counter / duration);
yield return null;
}
isMoving = false;
}
Pregunta similar: SKAction.scaleXTo
Puedes usar co-rutinas para hacer esto.
Para hacer esto, cree una función que devuelva el tipo
IEnumerator
e incluya un bucle para hacer lo que desee:
private IEnumerator foo()
{
while(yourCondition) //for example check if two seconds has passed
{
//move the player on a per frame basis.
yeild return null;
}
}
Entonces puede llamarlo usando
StartCoroutine(foo())
Esto llama a la función cada fotograma,
pero
continúa donde lo dejó la última vez.
Entonces, en este ejemplo, se detiene en el
yield return null
en un cuadro y luego comienza nuevamente en el siguiente: por lo tanto, repite el código en el ciclo while en cada cuadro.
Si desea pausar durante un cierto período de tiempo, puede usar el
yield return WaitForSeconds(3)
para esperar 3 segundos.
¡También puede
yield return
otras co-rutinas!
Esto significa que la rutina actual hará una pausa y ejecutará una segunda rutina y luego retomará una vez que la segunda rutina haya finalizado.
Recomiendo revisar los docs ya que hacen un trabajo muy superior al explicar esto de lo que podría hacer aquí