Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果播放机停止按LeftShift键(GetKeyUp),如何平滑地减小值_C#_Unity3d - Fatal编程技术网

C# 如果播放机停止按LeftShift键(GetKeyUp),如何平滑地减小值

C# 如果播放机停止按LeftShift键(GetKeyUp),如何平滑地减小值,c#,unity3d,C#,Unity3d,所以我只是在学习C#你可以看出我不是很擅长,这是我当前脚本的主要部分,我需要处理: if(Input.GetKeyDown(KeyCode.LeftShift)) { 速度=10f; 飞行速度=6; } if(Input.GetKey(KeyCode.LeftShift)) { Camera.current.fieldOfView+=80*Time.deltaTime; } if(Input.GetKeyUp(KeyCode.LeftShift)) { 速度=7f; 飞行速度=4; Camera

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

if(Input.GetKeyDown(KeyCode.LeftShift))
{
速度=10f;
飞行速度=6;
}
if(Input.GetKey(KeyCode.LeftShift))
{
Camera.current.fieldOfView+=80*Time.deltaTime;
}
if(Input.GetKeyUp(KeyCode.LeftShift))
{
速度=7f;
飞行速度=4;
Camera.current.fieldOfView-=250*Time.deltaTime;
Camera.current.fieldOfView=100;
}
如果(Camera.current.fieldOfView>=110)
{
Camera.current.fieldOfView=110;
} 

else if(Camera.current.fieldOfView它不平滑的原因是因为以下代码:

所有get都在同一帧中执行(请参阅)

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

我编写了一些代码,这些代码应该能够替换旧代码,而旧代码应该按照您希望的方式工作。另一个(可能更好)的替代方法是使用Unity的动画系统,通过设置动画来放大和缩小相机,并从脚本中设置触发器。(请参阅)

Coroutine缩放;
浮动定时器=0f;
公共摄像机;
公共浮动缩放值=110f;
公共浮动zoomedInValue=100f;
公共浮动zoomDuration=0.2f;
无效更新()
{
if(Input.GetKeyDown(KeyCode.LeftShift))
{
如果(缩放!=null)
{
StopCorroutine(缩放);
}
zoom=start例程(ZoomCamera());
}
if(Input.GetKeyUp(KeyCode.LeftShift))
{
如果(缩放!=null)
{
StopCorroutine(缩放);
}
zoom=start例程(ZoomCamera(false));
}
}
IEnumerator ZoomCamera(布尔zoomIn=true)
{
如果(缩放)
{
while(计时器<缩放持续时间)
{
main.fieldOfView=Mathf.Lerp(zoomedOutValue、zoomedInValue、计时器/缩放持续时间);
timer+=Time.deltaTime;
收益返回空;
}
计时器=缩放时间;
main.fieldOfView=zoomedInValue;
}
其他的
{
同时(计时器>0f)
{
main.fieldOfView=Mathf.Lerp(zoomedOutValue、zoomedInValue、计时器/缩放持续时间);
timer-=Time.deltaTime;
收益返回空;
}
定时器=0;
main.fieldOfView=缩放值;
}
}

您希望按下按钮时视野增大,不按下按钮时视野减小。让我们记下来:

if (Input.GetKey(KeyCode.LeftShift))
    Camera.current.fieldOfView += 80 * Time.deltaTime;
else
    Camera.current.fieldOfView -= 250 * Time.deltaTime;
您可能希望在此处添加默认逻辑,而不是捕获按钮按下和释放:

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;
}
在这种情况下,如果
,则只需编写一个
,而不是三个,尽管这两个变体都完全有效

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

Camera.current.fieldOfView = Mathf.Clamp(Camera.current.fieldOfView, 100, 110)

它将其设置为100,因为您告诉它使用
Camera.current.fieldOfView=100;
。它上面使用delta的行是否不足?如果是,请删除将其设置为100的行。您可能需要添加一个条件,以便在字段达到某个值时停止
-=
。它上面的行在而不是100,因为它只有很短的时间多次执行命令,直到它达到100,这意味着它停止执行我希望它做的事情(慢慢减小值,直到它达到100)在107.889处停止。因此,我认为我可以在它慢慢降低到107.889后立即使它变为100,但我意识到它只会执行Camera.current.fieldOfView-=250*Time.deltaTime;一次意味着它立即变为100 FOV。所以不,这是不够的,比如
Input.GetKeyUp(KeyCode.LeftShift)
只触发一次。您可能希望添加一个跟踪状态的变量,可能是布尔值或时间戳,并在触发此键控时设置此变量。然后不要在此处设置FOV,而是在其他位置设置FOV。您可以在该方法的其他位置或其他方法中检查状态,以查看是否设置了该状态,并基于该设置应用
>-=
计算。当你到达100 FOV时,别忘了重置该状态。你的姿势是什么?当keyup触发时向左平稳移动?如果是,你需要设置一个标志来保持运行
Camera.current.fieldOfView-=250*Time.deltaTime;
因为
Input.GetKeyUp(KeyCode.LeftShift)
只触发一次,它无法继续移动。
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;
}
Camera.current.fieldOfView = Mathf.Clamp(Camera.current.fieldOfView, 100, 110)