【问题标题】:How to make 3D camera zoom with c#如何使用 C# 制作 3D 相机缩放
【发布时间】:2020-05-15 14:33:47
【问题描述】:

所以基本上我写了这段代码:

int zoom = 20;
int normal = 31;
float smooth = 5;

private bool isZoomed = false;
private bool notZoomed = false;

void Update()
{

    if (Input.GetKeyDown(KeyCode.LeftShift))
    {
        isZoomed = !isZoomed;
    }

    if (isZoomed)
    {
        GetComponent<Camera>().fieldOfView = Mathf.Lerp(GetComponent<Camera>().fieldOfView, zoom, Time.deltaTime * smooth);
    }

    if (Input.GetKeyUp(KeyCode.LeftShift))
    {
        notZoomed = !notZoomed;
    }

    if (notZoomed)
    {
        GetComponent<Camera>().fieldOfView = Mathf.Lerp(GetComponent<Camera>().fieldOfView, normal, Time.deltaTime * smooth);
    }
}

这是为了平滑缩放,但效果不是很好,充满了错误等等。 我想做一个类似的“我的世界 Optifine 缩放”(基本上当我按住 shift 时它会缩放,如果我重新调整它会回到正常的相机 fov)请有人修复我的代码或给我发送另一个代码吗?请问我真的需要它。谢谢

【问题讨论】:

  • 不,我们无法修复您的代码,您需要告诉我们错误是什么。 “充满了错误”并没有真正的帮助。你调试了吗?

标签: c# unity3d 3d camera zooming


【解决方案1】:

首先你只需要为你的 if 语句使用一个布尔值,然后你可以在一个布尔值上使用一个 if else。目前正在按下和发布时切换 2 个不同的布尔值,但不能同时切换。

您的另一个问题是使用 lerp,特别是最终参数。从本质上讲,您将永远无法达到目标缩放视野,因为您的计算永远不会导致 1。

为了平滑过渡,您应该存储一个浮点数以用作 lerp 值

float lerp = 0f;
void Update()
{

if (Input.GetKeyDown(KeyCode.LeftShift))
{
    isZoomed = !isZoomed;
}

if (isZoomed)
{
    lerp = Mathf.Max( Time.deltaTime * smooth + lerp, 1f);
    GetComponent<Camera>().fieldOfView = Mathf.Lerp(normal, zoom, lerp);
} else {
    lerp = Mathf.Min( Time.deltaTime * smooth - lerp 1f);
   GetComponent<Camera>().fieldOfView = Mathf.Lerp(normal, zoom, lerp);
}

if (Input.GetKeyUp(KeyCode.LeftShift))
{
    isZoomed = !isZoomed;
}

}

【讨论】:

    猜你喜欢
    • 2022-10-04
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多