如何使某物在一定的时间内旋转一定的量

我试图让一架飞机在2秒内水平旋转一定的角度和180度。

基本上我希望它把飞机1秒旋转到一个水平的角度,然后把另一秒旋转180度左右面对另一个方向。

我目前使用的公式是:

//If you're rotating, lower the speed and rotate the plane. if (rotate == 1 && rotationPhase > 0) { //If in phase 0, figure out which phase you need too go to. if (angle > 90 && rotationPhase == 1) { //Rotation phase 2 = rotating down rotationPhase = 2; rotationAngleTime = angle - 90; } else if (rotationPhase == 1) { //Rotation phase 3 = rotating up rotationPhase = 3; rotationAngleTime = 90 - angle; } //After phase 0, if in phase 1 begin rotating down, if in phase 2 begin rotating up. if (angle > 90 && rotationPhase == 2) { transform.Rotate(0, 0, -rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2))); angle -= rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2)); if (angle > 89 && angle < 91) { angle = 90; rotationPhase = 4; rotationAngleTime = 180; } } else if (rotationPhase == 3) { transform.Rotate(0, 0, rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2))); angle += rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2)); if (angle > 89 && angle < 91) { angle = 90; rotationPhase = 4; rotationAngleTime = 180; } } //After you have rotated to horizontal in phase 1/2, rotate around to face the other direction. if (rotationPhase == 4) { transform.Rotate(rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2)), 0, 0); rotationAngle += rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2)); if (rotationAngle > 179) { rotationAngle = 0; rotationPhase = 0; rotationAngleTime = 0; } } } 

我尝试了很多不同的东西,但我不知道该怎么做。

编辑:这似乎是Time.deltaTime的问题。 我可以让飞机正确地旋转,但由于某种原因,它不会旋转适当的时间。 我有一个计时器被Time.deltaTime减去,并且这个animation发生了,并且animation在计时器用完之前总是完成大约半秒钟。

使用该行:

 transform.Rotate(Vector3.up, horizontalAngle*Time.deltaTime); 

进行水平旋转1秒钟以上。 然后使用该行:

 transform.Rotate(Vector3.right, verticalAngle*Time.deltaTime); 

进行轮换的第二阶段。 您可以使用类似于您发布的方法( rotationPhasevariables)的方法跟踪您应该使用哪个轮转,但是我建议使用enum来提高可读性:

 enum RotationPhase { Horizontal, Vertical }; public RotationPhase currentPhase = RotationPhase.Horizontal; 

最后,如果你想创建一个更平滑的旋转,你可以看看Vector3.SmoothDamp函数; 文档在这里 。 为了使用这种方法,首先需要计算每次旋转的平面的前向量。 那个vector变成你的“目标”vector。 然后,通过检查当前vector与目标vector之间的角度,可以检查是否完成了旋转:

 transform.forward = Vector3.SmoothDamp(transform.forward, target, ref vel, 1.0f, /*maxSpeed*/); if(Vector3.Angle(transform.forward, target) < 1.0f) { // move on to next phase of rotation } 

请注意,您需要设置一个variables来存储操作的当前速度(在我的示例中为vel )。

为了得到多less我们需要旋转每毫秒假设timedelta是在毫秒也。

 total_ticks = 1000 * seconds rotation_per_tick = angle / total_ticks 

在更新中,我们旋转,直到经过的时间到了

 if (total_ticks != 0) { if (total_ticks > Time.deltaTime) { transform.Rotate(rotation_per_tick * Time.deltaTime) total_ticks -= Time.deltaTime } else { transform.Rotate(rotation_per_tick * total_ticks) } } 

我强烈建议看一下,这是免费的,有能力在一个单一的行,做一个“旋转x 180度2秒,在调用程序y之前”。 即使是移动性能也不错。

一个例子可能是:

 Vector3 customRotation = new Vector3(0f,0.5f,0f); iTween.RotateBy(myGameObject, customRotation, 2f) 

注意到旋转是正常化的,所以1.0f == 360度。

iTween也有一个替代的语法,为这种旋转打开了一个额外的选项范围,例如添加缓动曲线或在例程完成的时候callback的可能性。

 Vector3 customRotation = new Vector3(0f,0.5f,0f); iTween.RotateBy(myGameObject, iTween.Hash("Amount",customRotation,"EaseType",iTween.EaseType.EaseOutCubic,"OnComplete","RunThisMethodNext"); 

编辑:这使得animation运行正常,但它仍然没有在正确的时间运行。

我想出了如何自己解决这个问题,解决办法是:

 //If you're rotating, lower the speed and rotate the plane. if (rotate == 1 && rotationPhase > 0) { //If in phase 0, figure out which phase you need too go to. if (angle > 90 && rotationPhase == 1) { //Rotation phase 2 = rotating down rotationPhase = 2; rotationAngleTime = angle - 90; } else if (rotationPhase == 1) { //Rotation phase 3 = rotating up rotationPhase = 3; rotationAngleTime = 90 - angle; } //After phase 0, if in phase 1 begin rotating down, if in phase 2 begin rotating up. if (angle > 90 && rotationPhase == 2) { transform.Rotate(0, 0, -rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2))); angle -= rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2)); if (angle > 89 && angle < 91) { angle = 90; rotationPhase = 4; rotationAngleTime = 180; } } else if (rotationPhase == 3) { transform.Rotate(0, 0, rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2))); angle += rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2)); if (angle > 89 && angle < 91) { angle = 90; rotationPhase = 4; rotationAngleTime = 180; } } //After you have rotated to horizontal in phase 1/2, rotate around to face the other direction. if (rotationPhase == 4) { transform.Rotate(rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2)), 0, 0); rotationAngle += rotationAngleTime * (Time.deltaTime * (rotationSpeed / 2)); if (rotationAngle > 179) { rotationAngle = 0; rotationPhase = 0; rotationAngleTime = 0; } } }