首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果播放器停止按LeftShift (GetKeyUp),如何平滑地降低数值?

如果播放器停止按LeftShift (GetKeyUp),如何平滑地降低数值?
EN

Stack Overflow用户
提问于 2020-02-27 08:19:55
回答 2查看 80关注 0票数 0

所以我只是在学习C#,你可以看出我不是很擅长它,这是我当前脚本的主要部分,我需要努力:

代码语言:javascript
复制
if (Input.GetKeyDown(KeyCode.LeftShift))
{
    speed = 10f;
    flySpeed = 6;
}

if (Input.GetKey(KeyCode.LeftShift))
{
    Camera.current.fieldOfView += 80 * Time.deltaTime;
}

if (Input.GetKeyUp(KeyCode.LeftShift))
{
    speed = 7f;
    flySpeed = 4;

    Camera.current.fieldOfView -= 250 * Time.deltaTime;
    Camera.current.fieldOfView = 100;
}

if (Camera.current.fieldOfView >= 110)
{
    Camera.current.fieldOfView = 110;
} 
else if (Camera.current.fieldOfView <= 100)
{
    Camera.current.fieldOfView = 100;
}

我想做的是在按下LeftShift时增加当前摄像头上的fieldOfView,并在LeftShift释放时平滑地降低fieldOfView。我试着使用这个:

代码语言:javascript
复制
Camera.current.fieldOfView -= 250 * Time.deltaTime;
Camera.current.fieldOfView = 100;

但这立即将fieldOfView更改为100 (walkingFoV)

EN

回答 2

Stack Overflow用户

发布于 2020-02-27 17:52:06

你想让FOV在按钮被按下时增大,在未被按下时减小。让我们把它写下来:

代码语言:javascript
复制
if (Input.GetKey(KeyCode.LeftShift))
    Camera.current.fieldOfView += 80 * Time.deltaTime;
else
    Camera.current.fieldOfView -= 250 * Time.deltaTime;

您可能希望在此处添加默认逻辑,而不是捕获按钮按下和释放:

代码语言:javascript
复制
if (Input.GetKey(KeyCode.LeftShift))
{
    Camera.current.fieldOfView += 80 * Time.deltaTime;
    speed = 10f;
    flySpeed = 6;
}
else
{
    Camera.current.fieldOfView -= 250 * Time.deltaTime;
    speed = 7f;
    flySpeed = 4;
}

在这种情况下,您只需编写一个if,而不是三个,尽管两个变体都是完全有效的。

最后一段代码可以简化为:

代码语言:javascript
复制
Camera.current.fieldOfView = Mathf.Clamp(Camera.current.fieldOfView, 100, 110)
票数 1
EN

Stack Overflow用户

发布于 2020-02-27 13:01:33

它不流畅的原因是因为这段代码:

代码语言:javascript
复制
speed = 7f;
flySpeed = 4;
Camera.current.fieldOfView -= 250 * Time.deltaTime;
Camera.current.fieldOfView = 100;

所有的get都在同一个框架中执行(参见https://docs.unity3d.com/ScriptReference/Input.GetKeyUp.html)。

换句话说,它只被调用一次,所以相机的视场立即被设置为100。

我写了一些代码,应该能够替换你的旧代码,应该可以按照你想要的方式工作。另一个(可能更好的)选择是使用Unity的动画系统,通过设置动画来放大和缩小相机,并从脚本中设置触发器。(参见https://learn.unity.com/tutorial/controlling-animation#5c7f8528edbc2a002053b4e3)

代码语言:javascript
复制
Coroutine zoom;
float timer = 0f;

public Camera main;
public float zoomedOutValue = 110f;
public float zoomedInValue = 100f;
public float zoomDuration = 0.2f;

void Update()
{
    if (Input.GetKeyDown(KeyCode.LeftShift))
    {
        if(zoom != null)
        {
            StopCoroutine(zoom);
        }

        zoom = StartCoroutine(ZoomCamera());
    }

    if (Input.GetKeyUp(KeyCode.LeftShift))
    {
        if(zoom != null)
        {
            StopCoroutine(zoom);
        }

        zoom = StartCoroutine(ZoomCamera(false));
    }
}

IEnumerator ZoomCamera(bool zoomIn = true)
{
    if(zoomIn)
    {
        while(timer < zoomDuration)
            {
                main.fieldOfView = Mathf.Lerp(zoomedOutValue, zoomedInValue, timer/zoomDuration);
                timer += Time.deltaTime;
                yield return null;
            }
        timer = zoomDuration;
        main.fieldOfView = zoomedInValue;
    }
    else
    {
        while(timer > 0f)
            {
                main.fieldOfView = Mathf.Lerp(zoomedOutValue, zoomedInValue, timer/zoomDuration);
                timer -= Time.deltaTime;
                yield return null;
            }
        timer = 0;
        main.fieldOfView = zoomedOutValue;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60424531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档