Unity3d随着时间的推移在特定点周围旋转

joh*_*y 5 1 c# interpolation unity-game-engine

我正在写一个功能,在一段时间内慢慢转动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;
}
Run Code Online (Sandbox Code Playgroud)

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

Fat*_*tie 5

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

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

这是Unity中非常基本的模式.

这是Unity中补间基本模式.你将在Unity中完成这1000次!

  1. 计算结束时间
  2. 做一个while循环,直到达到那个时间
  3. 每个框架,滑动(或任何)适当的分数.

请注意,你当然

 yield return null;
Run Code Online (Sandbox Code Playgroud)

在循环内部,它意味着"等到下一帧".

(请注意,与任何补间一样,最好在最后强制设置最终值,这样你才能知道它是完美的.请注意,在这个例子中,我只需在循环结束时设置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();
    }
Run Code Online (Sandbox Code Playgroud)

{注意,在实际的代码示例中,"delta"被理解为仅在一个轴上; 不要担心这个,它只是一个使用协程的补间的例子.}

注意 - 当然循环中有"两种方式".你可以计算你应该移动那个帧的少量.或者,您可以计算当时新职位应该是什么.由你决定.许多程序员认为后者更合乎逻辑,如果是这样,就这样做.另请注意,您可以执行while循环直到某个时间过去,或者,您可以执行while循环直到到达目的地!(对浮动平等非常小心.)选择是你的.

请注意,您经常使用Lerp或更好的SmoothStep与此类补间.它在Unity中无处不在.掌握基本模式后,请进行实验.

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

UnityEvent的优秀介绍/sf/answers/2537458311/请投票:)


作为记录.

Unity中的Tweeng.

在Unity中补间的真正高级方法是tweeng:

基本的Tweeng代码库出现在这个问题中.

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