所以我只是在学习C#,你可以看出我不是很擅长它,这是我当前脚本的主要部分,我需要努力:
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。我试着使用这个:
Camera.current.fieldOfView -= 250 * Time.deltaTime;
Camera.current.fieldOfView = 100;但这立即将fieldOfView更改为100 (walkingFoV)
发布于 2020-02-27 17:52:06
你想让FOV在按钮被按下时增大,在未被按下时减小。让我们把它写下来:
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;
}在这种情况下,您只需编写一个if,而不是三个,尽管两个变体都是完全有效的。
最后一段代码可以简化为:
Camera.current.fieldOfView = Mathf.Clamp(Camera.current.fieldOfView, 100, 110)发布于 2020-02-27 13:01:33
它不流畅的原因是因为这段代码:
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)
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;
}
}https://stackoverflow.com/questions/60424531
复制相似问题