Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何计算transform.RotateAround的角度,以便最终结果的y==0_C#_Unity3d - Fatal编程技术网

C# 如何计算transform.RotateAround的角度,以便最终结果的y==0

C# 如何计算transform.RotateAround的角度,以便最终结果的y==0,c#,unity3d,C#,Unity3d,所以我需要解决以下难题: 有一个旋转的三维立方体(34,90,23)(或其他一些随机值)。我想绕局部y轴旋转,直到transform.position.y==0。在编辑器中,我可以在y轴上拖动rotate,直到在变换中看到0作为值为止,但是如何使用代码实现这一点呢?(不能仅设置y=0,因为在绕局部y轴旋转时,所有值都会更改) 我正在考虑使用transform.RotateAround(transform.position,transform.up,angle),但我不知道如何正确计算角度,以便在

所以我需要解决以下难题:

有一个旋转的三维立方体(34,90,23)(或其他一些随机值)。我想绕局部y轴旋转,直到transform.position.y==0。在编辑器中,我可以在y轴上拖动rotate,直到在变换中看到0作为值为止,但是如何使用代码实现这一点呢?(不能仅设置y=0,因为在绕局部y轴旋转时,所有值都会更改)

我正在考虑使用transform.RotateAround(transform.position,transform.up,angle),但我不知道如何正确计算角度,以便在RotateAround()之后,transform.rotation.y==0

我不想对拖动本身进行编码,只想对结果进行编码。旋转应该是瞬间的


有人能为此编写工作代码吗?

transform.eulerAngles=newvector3(transform.eulerAngles.x,0.0f,transform.eulerAngles.z)

如果这不起作用,请尝试使用带有小写a的eulerAngles


这将直接将您的y值设置为0,并使其他值与以前相同。

我猜您要查找的是一个“动画”,它将影响
transform.localEulerAngles.y
值。为了实现这一点,我建议使用协同程序(您可以找到Unity教程)

它看起来是这样的:

private IEnumerator RotateAroundY(float rotationTime)
{
    float timer = 0.0f;
    Vector3 startLocalEulerAngles = transform.localEulerAngles;
    Vector3 deltaLocalEulerAngles = new Vector3(0.0f, Mathf.DeltaAngle(startLocalEulerAngles.y, 0.0f), 0.0f);

    while (timer < rotationTime)
    {
        timer += Time.deltaTime;
        transform.localEulerAngles = startLocalEulerAngles + deltaLocalEulerAngles * (timer / rotationTime);
        yield return new WaitForEndOfFrame();
    }

    transform.localEulerAngles = startLocalEulerAngles + deltaLocalEulerAngles;
}
private IEnumerator RotateAroundY(浮点旋转时间)
{
浮动定时器=0.0f;
Vector3 StartOcalueLangles=transform.localEulerAngles;
矢量3三角形三角形=新矢量3(0.0f,数学三角形(0.0f,0.0f),0.0f);
while(计时器<旋转时间)
{
timer+=Time.deltaTime;
transform.localEulerAngles=startOcalueLangles+deltalOcalueLangles*(计时器/旋转时间);
返回新的WaitForEndOfFrame();
}
transform.localEulerAngles=startOcalueLangles+deltalOcalueLangles;
}
您可以使用
startcroutine(RotateAroundY(4.0f))调用它

如果您要进入Unity,我强烈建议您熟悉协同程序:)

编辑:
很抱歉没有注意到您不需要动画:如果您只是想围绕本地
transform.up
向量旋转,您可以更改
transform.localeuleranges.y

可以这样做
transform.localEulerAngles.y=newvector3(transform.localEulerAngles.x,0.0f,transform.localEulerAngles.z)


希望这有帮助,

这不会产生相同的结果。绕轴旋转与设置y值不同。当围绕transform.up旋转(且x和z不是0)时,所有x、y和z都会更改。因此,在给定的示例中:如果执行transform.RotateAround(transform.position,transform.up,-90),则不会得到(34,0,23)Ok,因此您正在查找编辑器中的旋转,而不是更改y值?为什么不能使用while循环;使用问题中的代码保持围绕y轴旋转,如果transform.eulerAngles.y=0,则停止围绕y轴旋转与更改y值不同。这仅在x和z为0时有效。我可以做一个循环,但是速度太慢了,因为我是在更新函数中做的。不,transform.rotation.y不能代表角度。解决方案比这更复杂。您可能需要亲自尝试一下,看看原因。此网站不提供代码编写服务。像“有人可以为此编写工作代码吗?”这样的请求是不需要的。什么是“y轴”?坐标系的y轴还是立方体的局部y轴?托马斯:我没有其他方法来解释我的问题。不知道我怎么能不问代码就问我的问题。。。如果可以用其他方法解释,我完全可以。Y轴是指transform.upNo,我不想要动画。正如我所说:“只是为了说明,我不想对拖动本身进行编码,只想对结果进行编码。旋转应该是即时的。”很抱歉没有注意到“只是为了说明,我不想对拖动本身进行编码,只想对结果进行编码。旋转应该是即时的。”句子:我只接受了“我想绕局部y轴旋转,直到transform.position.y==0。“考虑到这句话,我希望你们同意,感觉你们需要一个动画。。。无论如何,围绕本地
transform.up
旋转等于更改
transform.localeuleranges.y
值,所以我想您只需编写
transform.localeuleranges=new Vector3(transform.localeuleranges.x,0.0f,transform.localeuleranges.z)