如何在C#中随时间减小浮点值?

如何在C#中随时间减小浮点值?,c#,unity3d,C#,Unity3d,我正在构建一个统一的游戏,当按下空格键时,我的角色会滑动。他只能在跑步或短跑时滑倒。当玩家开始滑行时,玩家的速度会在一段时间内下降,这意味着他不能永远滑行或者一直以相同的速度滑行 我尝试过做另一个具有常量值的浮动,并随着时间的推移(time.deltaTime)使用该常量降低玩家速度。但是,它只将时间减少了一次该值,它需要每秒钟进行一次 float playerSpeed=5.2f; Update() { if (Input.GetKey(KeyCode.Space) &&am

我正在构建一个统一的游戏,当按下空格键时,我的角色会滑动。他只能在跑步或短跑时滑倒。当玩家开始滑行时,玩家的速度会在一段时间内下降,这意味着他不能永远滑行或者一直以相同的速度滑行

我尝试过做另一个具有常量值的浮动,并随着时间的推移(time.deltaTime)使用该常量降低玩家速度。但是,它只将时间减少了一次该值,它需要每秒钟进行一次

float playerSpeed=5.2f;

Update()
{
    if (Input.GetKey(KeyCode.Space) && (isRunning == true || isSprinting == 1))
    {
        isSliding = true;         
    }      
    else
    {
        isSliding = false;
    }
}
我希望玩家的速度在2秒内从5.2降到0。

看一看

float playerSpeed = 5.2f;
float slideTime = 2f;

/* ... game loop logic, etc... */

if(isSliding && playerSpeed > 0) {
    playerSpeed = Mathf.Lerp(5.2f, 0f,  slideTime);
}

/* ... more game loop logic ... */
编辑:


该函数通过tab之间线性插值,其中ab是数字,t是时间。请参阅此文档:

如果您想在条件为真时每秒钟/每分钟/任何时间段做一件事,您可以查看 下面是对我在另一个问题中的回答的快速改编:

private float timeToDoStuff = 0.0f;
private float slidingDecrease = 0.0f;
void update() {  
    if (Input.GetKey(KeyCode.Space) && (isRunning == true || isSprinting == 1))
    {
        if(!isSliding) slidingDecrease = playerSpeed / 2;
        isSliding = true;         
    }      
    else
    {
        slidingDecrease = 0.0f;
        isSliding = false;
    }
    if(isSliding && Time.time >= timeToDoStuff) {
        playerSpeed -= slidingDecrease; // or whatever
        timeToDoStuff = Time.time + 1.0f; // for 1 seconds
    }
}

现在,当您仅每秒应用它时,它将在2秒内从x减少到0。因此,如果你想将其缩短0.5秒,你显然必须调整滑动减少的计算。

在修改了phantasm的答案后,我想最好自己写一个更完整的答案,即使它使用了那篇文章中提到的概念

您应该能够使用以下内容,并对处于停止状态的精灵进行一些轻微的修改,等等。。。这只是使用的概念的基础

当然,您不需要使用
Mathf.Lerp
来完成您想要做的事情,在这种情况下,最好不要使用它

private float playerSpeed = 5.2f;
private float slideDuration = 2.0f;
private float remainingSlideTime = 2.0f;

void update() {  
    bool isSliding = (Input.GetKey(KeyCode.Space) && (isRunning == true || isSprinting == 1));
    if(isSliding && remainingSlideTime > 0 && playerSpeed > 0) {
        remainingSlideTime -= Time.deltaTime;
        float speedReduction = playerSpeed * (Time.deltaTime/remainingSlideTime);
        playerSpeed = ((remainingSlideTime/slideDuration) > 0) ? playerSpeed - speedReduction : 0;
    }
}

我想对
Mathf.Lerp
方法提供一些解释,
帮助有兴趣的人理解数学过程

下面的脚本可以帮助您找到答案:

float start=5.2f;//可以是任何数字。
浮点结束=0;//也可以是任何数字。
浮动总时间=2;//从起点到目标所需的时间。
浮点数t;//保存当前经过时间的变量。
无效更新(){
t+=时间增量时间;
float T=T/totalTime;//我们的“进度”占totalTime的百分比。
float currentFloat=Mathf.Lerp(开始、结束、T);
Log(currentFloat);
}
lerp的功能是:
start+((end-start)*T)

通过增加夹紧T,您可以在0和1之间提供。
根据我提供的值:
5.2*(1-T)


链接到文档:

您可以在其中加入代码来降低播放器速度吗?较短的代码:
isSliding=Input.GetKey(KeyCode.Space)和&(isRunning | | isSprinting==1)只是一个建议,但我注意到你提到的速度应该“每秒钟”降低。相反,我会在每一个循环中降低速度,在两秒钟的跨度内以百分比的形式将速度降低到0。这将使幻灯片更加平滑。名为
isSprinting
的属性/变量不应该是布尔值吗?这可能提供了问题的部分解决方案,但如果您提供更多关于如何使用此函数的示例,更多地说明此函数的用法,将更有帮助,最后还有一个参考页面的链接。这只会将玩家速度从5.2降低到0。它会慢慢减少。另外,t参数被限制在0和1之间,所以时间最大只能是1,所以我从文档中得到。@Mactadilis您可能应该使用
timeRemainingInSlide
类型的
float
变量,在每次迭代中,该变量的值都会减少
time.deltaTime
,使用该值计算幻灯片中经过的时间百分比。可以表示为0到1之间的值,四舍五入到最接近的10。另外,幻象提出的解决方案,我只是简单地修改了它,以使用他们发布的基本建议。在仍然使用
Mathf.Lerp
方法的情况下,可以进行大量的细化,这将使幻灯片更平滑地停止。这可能是我的错,但当我执行此代码时,即使在玩数字时,也不会发生任何事情。可能是其他变量影响了这一点。@Mactadilis-hm,可能是我在某个地方也犯了一个错误,因为我很快就适应了它。您可以尝试先为slideingDecrease使用一个固定值,然后添加一种动态计算的方法。我发现了冲突的变量,这也是一种工作方法,只需稍加修改。这是有效的,非Mathf.Lerp解决方案。问题在我这边。我有两个以上的球员速度浮动冲突,在现有的条件。我把它们移走,看看发生了什么,它起了作用。谢谢大家的鼓励和很好的建议!
private float playerSpeed = 5.2f;
private float slideDuration = 2.0f;
private float remainingSlideTime = 2.0f;

void update() {  
    bool isSliding = (Input.GetKey(KeyCode.Space) && (isRunning == true || isSprinting == 1));
    if(isSliding && remainingSlideTime > 0 && playerSpeed > 0) {
        remainingSlideTime -= Time.deltaTime;
        float speedReduction = playerSpeed * (Time.deltaTime/remainingSlideTime);
        playerSpeed = ((remainingSlideTime/slideDuration) > 0) ? playerSpeed - speedReduction : 0;
    }
}