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