Mover GameObject ao longo do tempo

Eu estou aprendendo Unity a partir de um fundo Swift SpriteKit onde mover a posição x de um sprite é tão direto quanto executar uma ação como abaixo:

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) 

Eu gostaria de saber uma maneira equivalente ou similar de mover um sprite para uma posição específica por uma duração específica (digamos, um segundo) com um atraso que não precisa ser chamado na function de atualização.

    A resposta de gjttt1 está próxima mas está faltando funções importantes e o uso de WaitForSeconds() para mover GameObject é inaceitável. Você deve usar a combinação de Lerp , Time.deltaTime e Time.deltaTime . Você deve entender essas coisas para poder fazer animações a partir do Script em 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; } 

    Pergunta semelhante: SKAction.scaleXTo

    A resposta do git1 é boa, mas há outra solução se você não quiser usar as cortes.

    Você pode usar InvokeRepeating para triggersr repetidamente uma function.

     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; } } 

    Você pode usar co-rotinas para fazer isso. Para fazer isso, crie uma function que retorne o tipo IEnumerator e inclua um loop para fazer o que você deseja:

     private IEnumerator foo() { while(yourCondition) //for example check if two seconds has passed { //move the player on a per frame basis. yeild return null; } } 

    Então você pode chamá-lo usando StartCoroutine(foo())

    Isso chama a function de cada quadro, mas ele pega de onde parou da última vez. Portanto, neste exemplo, ele pára no yield return null em um quadro e, em seguida, começa novamente no seguinte: assim, ele repete o código no loop while em cada quadro.

    Se você quiser pausar por um determinado período de tempo, pode usar o yield return WaitForSeconds(3) para aguardar 3 segundos. Você também pode yield return outras co-rotinas! Isso significa que a rotina atual irá pausar e executar uma segunda co-rotina e depois retomar uma vez que a segunda co-rotina tenha terminado.

    Eu recomendo verificar os documentos como eles fazem um trabalho muito superior de explicar isso do que eu poderia aqui