首页 > 解决方案 > Unity在自由落体时旋转播放器不起作用

问题描述

我有一个从斜坡上发射的球员。在那之前一切正常。

当玩家离开坡道时,他们会向上看,所以我想做的是平滑地改变玩家(X,Y,Z)的旋转;从当前的一个到一个新的。

我总是需要 y = -180

我总是需要 z = 0

我需要 x = (MinAngle, MaxAngle) -> 也许这些值 (-30, 30)

X 的原因(MinAngle,MaxAngle)

我试图弄清楚如何在某个轴上平滑地旋转播放器并以某个角度停止,以便可以在此处应用它,并可能与播放器按钮(上/下)一起应用

transform.rotation 线导致问题

rotCur = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;

transform.rotation = Quaternion.Lerp(Quaternion.Euler(30,-180,0), rotCur, Time.deltaTime * 5);

标签: unity3drotationquaternionsraycastinglerp

解决方案


你的问题到底是什么?您只说它“不起作用”-但究竟会发生什么?

你试过这个:

transform.rotation = Quaternion.Lerp(rotCur, Quaternion.Euler(30,-180,0), Time.deltaTime * 5);

交换第一个和第二个参数

我假设 rotCur 的意思是“当前旋转”,在 Quaternion.Lerp 中,第一个参数是“from”,第二个是“to”

编辑:你试过这个:

transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(30,-180,0), Time.deltaTime * 5);

编辑2:我知道你的问题是什么!

您正在使用 Time.deltaTime 而不是 Time.time (或任何其他计时器)

deltaTime 永远不是 0 或 1 - 它总是相同的,例如 0.2

lerp 在 0 和 1 之间进行插值,您必须将参数从 0 增加到 1 才能使其工作

尝试这个:

一开始,只有一次:

float interpolationProgress = 0.0f;
bool interpolating = true;

然后每一帧:

if(interpolating) {
    interpolationProgress += 0.1f * Time.deltaTime;
    transform.rotation = Quaternion.Lerp(from, to, interpolationProgress);
    if(interpolationProgress >= 1.0f) {
        interpolating = false;
    }
}

推荐阅读