unity tutorial sintaxis script español c# unity3d unity5

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í