所以我试图在按键上旋转一个物体(如果我按下“a”向左旋转90度,如果我按“d”向右旋转90度)。 我不能让它工作,我已经尝试了一些东西,但我最终没有解决问题。正如您将在下一个示例中看到的那样,我只想出如何旋转到90度,而不是更多或更少,我实际上想要将对象旋转90度,从当前的任何程度开始。例如: 从90度到180度 从23度到113度等等...... 这是我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ModuleBehaviour : MonoBehaviour {
public bool rotating = false;
private void Update()
{
if (rotating)
{
RotatePlatform();
}
}
private void RotatePlatform()
{
Vector3 target = new Vector3(0,0,90);
if (transform.eulerAngles.z > 90)
{
transform.rotation = Quaternion.Euler(target);
}
transform.Rotate(target * Time.deltaTime);
}
}
(不要担心rotating
变量,我在另一个脚本中更改它,每当我按下“d”键时它都是真的。我只需要知道如何向正确的方向旋转,之后我会弄明白如何申请左转)
谢谢;
答案 0 :(得分:2)
这将做你想要的:
private IEnumerator RotatePlatform(float dir) {
Vector3 target = new Vector3(0, 0, (transform.eulerAngles.z + dir + 360) % 360);
while(Mathf.Abs(transform.eulerAngles.z - target.z) >= Mathf.Abs(dir * Time.deltaTime * 2)) {
transform.Rotate(new Vector3(0,0,dir) * Time.deltaTime);
yield return null;
}
transform.eulerAngles = target;
rotating = false;
}
要从中剔除的关键事项是,我将其封装为“#34;使其具有动画效果"将代码转换为协程,以便对象从任何开始旋转旋转到所需方向 方向上的任何旋转。这样做的原因是协同程序的局部变量在迭代之间保持其状态(Unity计划任务系统将停止在yield
指令上执行代码并在以后恢复:在这种情况下,{ {1}}表示它将在下一帧继续)。通过这种方式,我们可以存储起始旋转和目标旋转,而无需做任何疯狂的事情。
通过获取当前旋转,添加旋转量,然后使该值位于0-360:null
内来实现此目的。 transform.eulerAngles.z + dir + 360) % 360
已经是[0,360],减去 90将离开[-90,270],然后加上360我们确保该值始终大于0(不影响结果)角度),然后transform.eulerAngles.z
有效地减去任何多余的360.
% 360
语句检查我们还没有旋转"距离"是"大于我们将按"旋转的数量。有一些缓冲:我们不想超越,并且我们需要走多远#34;是358度!
另一个重要的变化是,我们希望使用Mathf.Abs(transform.eulerAngles.z - target.z) >= Mathf.Abs(dir * Time.deltaTime * 2)
而不是new Vector3(0,0,dir)
作为我们的值来旋转 ,以便速度保持不变。
最后2条指令确保旋转实际上达到了所需的值,当然,切换回bool跟踪是否按键做任何事情(我们只需要1个协程实例)。
然后是我用来控制它的target
方法:
Update()
答案 1 :(得分:0)
要向另一个方向旋转,请减去90。
void Update()
{
if (Input.GetKeyDown(KeyCode.D))
transform.Rotate(0, 0, transform.rotation.z + 90);
}