繁体   English   中英

如何在 Unity 中创建 X 秒内的 180 度相机轨道?

[英]How to create a 180 degree camera orbit over X seconds in Unity?

我有一个围绕屏幕上一个点运行的相机。 单击并左右拖动鼠标将围绕焦点运行,释放鼠标将使相机保持在该角度。

我正在尝试创建一个功能,可以平滑地将相机旋转 180 度。 因此,例如,如果相机在“玩家”的后面并且这个函数被调用,相机将在 X 秒的过程中绕到玩家的前面,并停在它开始位置的完全相反的位置。

这是我目前用于基于鼠标单击和拖动进行相机旋转的代码:

Quaternion camTurnAngle =
    Quaternion.AngleAxis(Input.GetAxis("Mouse X") * rotationSpeed, Vector3.up);

this.cameraOffset = camTurnAngle * this.cameraOffset;

Vector3 newPos = this.currentFocusPoint + this.cameraOffset;
transform.position = Vector3.Slerp(transform.position, newPos, smoothFactor);
transform.LookAt(this.currentFocusPoint);

我试图用一个 UI 按钮(又名,单个函数调用)替换这个基于鼠标拖动的相机旋转,该按钮将在短时间内完全围绕相机旋转 180 度,然后如果再次按下它会向后旋转。 这是一张 MS 绘画图,以防我的解释令人困惑:

在此处输入图片说明

我不确定如何处理这样的事情。 这听起来类似于使用Vector3.Slerp ,但我找不到有效的解决方案。 我离解决方案还很远,我真的没有任何合理的代码可以发布。 我只想说到目前为止我已经尝试了两种方法:

1)我试过使用transform.RotateAround ,我传入的角度是rotateSpeed * Time.deltaTime 我的问题是我不知道如何检查结束条件,如果没有,我的相机将永远旋转。

2)我试过搞乱Quaternion.Slerp ,但看到的结果不是我所期望的。

我怎样才能实现平滑的 180 度相机轨道,这需要预定的时间才能完成?

这是协程的教科书用法。 基本上,启动跟踪有多少时间在轨道上留下,然后可以更新协程cameraOffset基于剩下的时间或Time.deltaTime ,不管是短。

private IEnumerator RotateCam(float rotateDuration)
{
    float timeLeft = rotateDuration;

    // possibly - disable control of camera here

    while (timeLeft > 0)
    {
        yield return null;

        float elapsedRotationTime = Mathf.Min(timeLeft, Time.deltaTime);
        float angleThisFrame = 180f * elapsedRotationTime / rotateDuration;

        Quaternion camTurnAngle = Quaternion.AngleAxis(angleThisFrame, Vector3.up);

        this.cameraOffset = camTurnAngle * this.cameraOffset;
        transform.position = this.currentFocusPoint + this.cameraOffset;
        transform.LookAt(this.currentFocusPoint);

        timeLeft -= Time.deltaTime;
    }

    // possibly - re-enable control of camera here
}

然后,当您要开始旋转时:

// private Coroutine rotateCoroutine

this.rotateCoroutine = StartCoroutine(RotateCam(2f));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM