随着时间的推移移动GameObject

我从一个Swift SpriteKit背景学习Unity,在这个背景下,移动一个精灵的x位置就像运行一个动作一样简单,如下所示:

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) 

我想知道一个等同的或类似的方法,将一个精灵移动到一个特定的位置一段特定的时间(比如说一秒),而不必在更新函数中调用这个延迟。

gjttt1的答案是接近的,但是缺less重要的函数,使用WaitForSeconds()移动GameObject是不可接受的。 你应该使用LerpCoroutineTime.deltaTime组合。 你必须理解这些东西,才能够从Unity中的脚本来做animation。

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

类似的问题: SKAction.scaleXTo

你可以使用co-routines来做到这一点。 为此,创build一个返回IEnumeratortypes的函数,并包含一个循环来执行你想要的操作:

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

然后你可以使用StartCoroutine(foo())来调用它

这将每帧都调用函数, 但是它会从上次停止的地方开始。 所以在这个例子中,它在一帧上yield return null时停止,然后在下一个时间再次开始:因此它在每个帧中重复while循环中的代码。

如果你想暂停一段时间,那么你可以使用yield return WaitForSeconds(3)等待3秒钟。 你也可以yield return其他的例程! 这意味着当前程序将暂停并运行第二个协程,然后在第二个协程完成后再次拾取。

我build议检查文档,因为他们在这方面的工作比我在这里做的解释要好得多

git1的答案是好的,但如果你不想使用couritines,还有另一种解决scheme。

您可以使用InvokeRepeating重复触发一个函数。

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