猿问

随时间移动游戏对象

随时间移动游戏对象

我正在从Swift SpriteKit背景中学习UnityofSpriteKit,其中移动一个精灵的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)

我想知道一种等效或类似的方法,可以在特定的时间内(例如,第二次)将sprite移动到一个特定的位置,并且在UPDATE函数中不需要调用这个延迟。


SMILET
浏览 420回答 3
3回答

幕布斯7119047

gjttt 1的答案是接近的,但缺少重要的功能和使用WaitForSeconds()用于移动游戏对象是不能接受的。您应该使用Lerp,&nbsp;Coroutine和Time.deltaTime..你必须了解这些东西,才能从统一脚本中制作动画。public&nbsp;GameObject&nbsp;objectectA;public&nbsp;GameObject&nbsp;objectectB;void&nbsp;Start(){ &nbsp;&nbsp;&nbsp;&nbsp;StartCoroutine(moveToX(objectectA.transform,&nbsp;objectectB.transform.position,&nbsp;1.0f));}bool&nbsp;isMoving&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;IEnumerator&nbsp;moveToX(Transform&nbsp;fromPosition,&nbsp;Vector3&nbsp;toPosition,&nbsp;float&nbsp;duration){ &nbsp;&nbsp;&nbsp;&nbsp;//Make&nbsp;sure&nbsp;there&nbsp;is&nbsp;only&nbsp;one&nbsp;instance&nbsp;of&nbsp;this&nbsp;function&nbsp;running &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isMoving) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;break;&nbsp;///exit&nbsp;if&nbsp;this&nbsp;is&nbsp;still&nbsp;running &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;isMoving&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;counter&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;//Get&nbsp;the&nbsp;current&nbsp;position&nbsp;of&nbsp;the&nbsp;object&nbsp;to&nbsp;be&nbsp;moved &nbsp;&nbsp;&nbsp;&nbsp;Vector3&nbsp;startPos&nbsp;=&nbsp;fromPosition.position; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(counter&nbsp;<&nbsp;duration) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter&nbsp;+=&nbsp;Time.deltaTime; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fromPosition.position&nbsp;=&nbsp;Vector3.Lerp(startPos,&nbsp;toPosition,&nbsp;counter&nbsp;/&nbsp;duration); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;isMoving&nbsp;=&nbsp;false;}类似的问题:SKAction.ScaleXto

慕莱坞森

git 1的答案是好的,但是如果您不想使用礼貌,还有另一个解决方案。你可以用InvokeRepeating反复触发一个函数。float&nbsp;duration;&nbsp;//duration&nbsp;of&nbsp;movementfloat&nbsp;durationTime;&nbsp;//this&nbsp;will&nbsp;be&nbsp;the&nbsp;value&nbsp;used&nbsp;to&nbsp;check&nbsp;if&nbsp;Time. time&nbsp;passed&nbsp;the&nbsp;current&nbsp;duration&nbsp;setvoid&nbsp;Start(){ &nbsp;&nbsp;&nbsp;&nbsp;StartMovement();}void&nbsp;StartMovement(){ &nbsp;&nbsp;&nbsp;&nbsp;InvokeRepeating("MovementFunction",&nbsp;Time.deltaTime,&nbsp;Time.deltaTime);&nbsp;//Time.deltaTime&nbsp;is&nbsp;the&nbsp;time&nbsp;passed&nbsp;between&nbsp;two&nbsp;frames &nbsp;&nbsp;&nbsp;&nbsp;durationTime&nbsp;=&nbsp;Time.time&nbsp;+&nbsp;duration;&nbsp;//This&nbsp;is&nbsp;how&nbsp;long&nbsp;the&nbsp;invoke&nbsp;will&nbsp;repeat}void&nbsp;MovementFunction(){ &nbsp;&nbsp;&nbsp;&nbsp;if(durationTime&nbsp;>&nbsp;Time.time) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Movement &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CancelInvoke("MovementFunction");&nbsp;//Stop&nbsp;the&nbsp;invoking&nbsp;of&nbsp;this&nbsp;function &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP
我要回答