减速并停在特定点的物体
Object that slows down and stops at a specific point
在我的项目中,我有一辆车,上面附有一个脚本,用于驾驶。在我的世界里有红绿灯,如果它是红色的,就会产生一个物体(不可见的,命名为停止),如果它在那里,它会使汽车停下来,如果它不在,它会继续以特定变量(速度)行驶。我如何编写减速和加速脚本?
尝试使用 Wait for Seconds 和外部协程来管理它,但没有任何效果。在更新无效:
Ray disray = new Ray(transform.position, transform.forward);
RaycastHit dishit;
if (Physics.Raycast(disray, out dishit, 8) && dishit.transform.tag == "stop")
{
if (dishit.distance < carrange)
{
transform.Translate(0, 0, 0);
}
}
else
{
transform.Translate(0, 0, speed * Time.deltaTime);
}
谢谢!
您可能需要以如下方式减少 speed
:
speed = speed * (1 - f(Time.deltaTime));
f
看起来像:
private float f(int ms)
{
float amountOfMsUntilStop = 2000.0;
if(ms > amountOfMsUntilStop)
return 1
if(ms < 0)
return 0
return ms / amountOfMsUntilStop;
}
当然,这不是一个绝对的答案,但我认为你可以发挥价值来实现你想要的。
这可能会使速度变得像:
如果我理解你的代码,你可以这样修改它:
// Here we either have to brake, or to stop
if (Physics.Raycast(disray, out dishit, 8) && dishit.transform.tag == "stop")
{
// Here we have to stop
if (dishit.distance < carrange)
{
transform.Translate(0, 0, 0);
}
// Here we have to brake
else
{
speed = speed * (1 - f(Time.deltaTime));
transform.Translate(0, 0, speed * Time.deltaTime);
}
}
// Here we can keep on driving
else
{
transform.Translate(0, 0, speed * Time.deltaTime);
}
编辑
虽然我将它命名为amountOfMsUntilStop
,但这并不意味着它会在 2 秒内停止使用该值。这意味着如果由于某种原因,Time.deltaTime
恰好是 2000 毫秒,那么汽车将从 speed
行驶到 0
。
话虽这么说,你想让你的车刹车越厉害,你应该把这个值设置得越小。
在我的项目中,我有一辆车,上面附有一个脚本,用于驾驶。在我的世界里有红绿灯,如果它是红色的,就会产生一个物体(不可见的,命名为停止),如果它在那里,它会使汽车停下来,如果它不在,它会继续以特定变量(速度)行驶。我如何编写减速和加速脚本? 尝试使用 Wait for Seconds 和外部协程来管理它,但没有任何效果。在更新无效:
Ray disray = new Ray(transform.position, transform.forward);
RaycastHit dishit;
if (Physics.Raycast(disray, out dishit, 8) && dishit.transform.tag == "stop")
{
if (dishit.distance < carrange)
{
transform.Translate(0, 0, 0);
}
}
else
{
transform.Translate(0, 0, speed * Time.deltaTime);
}
谢谢!
您可能需要以如下方式减少 speed
:
speed = speed * (1 - f(Time.deltaTime));
f
看起来像:
private float f(int ms)
{
float amountOfMsUntilStop = 2000.0;
if(ms > amountOfMsUntilStop)
return 1
if(ms < 0)
return 0
return ms / amountOfMsUntilStop;
}
当然,这不是一个绝对的答案,但我认为你可以发挥价值来实现你想要的。
这可能会使速度变得像:
如果我理解你的代码,你可以这样修改它:
// Here we either have to brake, or to stop
if (Physics.Raycast(disray, out dishit, 8) && dishit.transform.tag == "stop")
{
// Here we have to stop
if (dishit.distance < carrange)
{
transform.Translate(0, 0, 0);
}
// Here we have to brake
else
{
speed = speed * (1 - f(Time.deltaTime));
transform.Translate(0, 0, speed * Time.deltaTime);
}
}
// Here we can keep on driving
else
{
transform.Translate(0, 0, speed * Time.deltaTime);
}
编辑
虽然我将它命名为amountOfMsUntilStop
,但这并不意味着它会在 2 秒内停止使用该值。这意味着如果由于某种原因,Time.deltaTime
恰好是 2000 毫秒,那么汽车将从 speed
行驶到 0
。
话虽这么说,你想让你的车刹车越厉害,你应该把这个值设置得越小。