gpt4 book ai didi

c# - Unity3d 随时间围绕特定点旋转

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:28 25 4
gpt4 key购买 nike

我正在编写一个函数,它可以在一段时间内慢慢精确地旋转 90 度。到目前为止一切正常,我只需要弄清楚如何让它围绕一个点旋转而不是围绕变换中心旋转。

protected bool _isRotating = false;
public IEnumerator RotateWithEasing(GameHelper.Axis axis, Vector3 isolatedAxisPoint, float inTime)
{
if(_isRotating)
{
yield break;
}

_isRotating = true;

var degrees = this.GetDegreesFromAxis(axis);

Quaternion fromAngle = transform.rotation;
Quaternion toAngle = Quaternion.Euler(transform.eulerAngles + degrees);
for (float t = 0f; t < 1f; t += Time.deltaTime / inTime)
{
transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t);
yield return null;
}

_isRotating = false;
}

任何人都可以帮我指明正确的方向,我如何修改它以使其围绕指定的 isolatedAxisPoint 旋转?

最佳答案

这是一个 Unity 补间的实际示例,恰好在文本编辑器中显示另一个窗口!

如果您想旋转某些东西,只需在 IEnumerator 的循环中使用 deltaTime 并调整 eulerAngles 或调用 Rotate 即可。 (永远不要在 Unity 中出于任何原因使用四元数。)在这个例子中,我只调用 Rotate。

这是 Unity 中的一个非常基本的模式

这是 Unity 中的补间的基本模式。您将在 Unity 中执行此操作 1000 次!

  1. 计算结束时间
  2. 执行一个 while 循环直到到达该时间
  3. 每一帧、幻灯片(或其他任何内容)按适当的分数。

请注意,当然是你

 yield return null;

在循环内部,意思是“等到下一帧”。

(请注意,与任何补间一样,最好在最后强制设置最终值,这样您就知道它是完美的。请注意,在此示例中,我只是在最后设置了 eulerAngles当循环结束时。)

private IEnumerator _roll( Vector3 delta )
{
rollBegins.Invoke();

Vector3 begin = transform.eulerAngles;

float rollSecs = 2f; // speed of the roll

float startTime = Time.time;
float endTime = startTime+rollSecs;

while (Time.time < endTime)
{
Vector3 d = delta * ( Time.deltaTime / rollSecs );
transform.Rotate(d, Space.World );
yield return null;
}

transform.eulerAngles = .. perfectly correct end values;

busy = false;

rollComplete.Invoke();
}

{请注意,在该实际代码示例中,“delta”被理解为仅在一个轴上;不用担心,这只是一个使用协程的补间示例。

注意 - 当然有“两种方式”进入循环。您可以计算少量您应该在该帧中移动它。或者,您可以只计算当时的新位置。由你决定。许多程序员认为后者更合乎逻辑,如果是这样,就那样做。另请注意,您可以执行 while 循环直到特定时间过去,或者,您可以执行 while 循环直到到达目的地! (要非常小心 float 相等性。)选择权在你。

请注意,您经常对此类补间使用 Lerp 或更好的 SmoothStep。它在 Unity 中无处不在。一旦掌握了基本模式,就可以进行试验。

请注意,在我的示例中,代码使用 UnityEvent 来标记动画的开始和结束。这是非常普遍的。毕竟通常情况下,一旦某个 Action 完成,您就必须继续做其他事情。另一个很好的例子是,当某些东西正在动画时,用户被阻止说转向或游戏中的任何情况。

UnityEvent 的精彩介绍 https://stackoverflow.com/a/36249404/294884请投票:)


备案。

Unity 中的 Tweeng。

Unity 中真正先进的补间方式是补间:

Basic Tweeng code base appears in this question.

掌握它需要一段时间,但它非常强大。令人难以置信的是,tweeng 扩展只有几行代码。

关于c# - Unity3d 随时间围绕特定点旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37212184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com