我有一个非常简单的移动脚本附加到一个对象,允许我用动量向上,向下,向左或向右移动对象。昨晚我觉得脚本运行正常,没问题。我注意到物体的一些无限小的运动,但是当它被简单地画在每一帧上时,它被丢弃了,或者它被放弃了#34;由于代码。
然而,今天我回到家,把它开了,物体立刻跳了起来,向右移动了很快。经过一些调试,感觉我疯了,因为我没有改变任何东西,我注意到我的笔记本电脑没有插上电源,从而降低了机器的功率,让我知道可能造成的问题错误。
我尝试过使用代码,添加和删除Time.Delta时间来改进它,但似乎无法让问题消失。删除所有的Time.deltaTimes会使它变得更糟,更糟糕的是,将它们放在任何地方都无法解决问题。
虽然时间问题是导致我注意到问题的原因,但我怀疑我的实际问题可能出现在我的移动代码中,因为即使我没有按下按钮,游戏仍会在X和Y上注册一些速度轴让我认为这可能是if,else,else if语句的问题。
任何帮助都将不胜感激。
我的代码如下:
float speedHorz = 0; //Horizontal starting speed.
float maxspHorz = 5; //Horizontal Max speed.
float speedVert = 0;
float maxspVert = 5;
float acceleration = 8; //How fast the object will reach maximum speed.
float deceleration = 12; //How fast the object will return to 0.
void Update ()
{
playerMove();
}
public void playerMove()
{
//Up and Down, Acceleration
if ((Input.GetKey("s")) && (speedVert < maxspVert)) //If you press S and Verticl Speed is less than the max...
{
speedVert = speedVert - acceleration * Time.deltaTime; //Lower speed by acceleration, move down...
}
else if ((Input.GetKey("w")) && (speedVert > -maxspVert))
{
speedVert = speedVert + acceleration * Time.deltaTime;
}
//Up and Down, Deceleration
else
{
if (speedVert > deceleration * Time.deltaTime)
{
speedVert = speedVert - deceleration * Time.deltaTime;
}
else if (speedVert < deceleration * Time.deltaTime)
{
speedVert = speedVert + deceleration * Time.deltaTime;
}
else speedVert = 0 * Time.deltaTime;
}
//Left and Right, Acceleration
if ((Input.GetKey("a")) && (speedHorz < maxspHorz)) //If you are pressing the "a" key and speed is less than max speed...
{
//Move Left
speedHorz = speedHorz - acceleration * Time.deltaTime; //Accelerate negatively on the X axis, ie Move Left.
}
else if ((Input.GetKey("d")) && (speedHorz > -maxspHorz))
{
speedHorz = speedHorz + acceleration * Time.deltaTime;
}
//Left and Right, Deceleration
else
{
if (speedHorz > deceleration * Time.deltaTime)
{
speedHorz = speedHorz - deceleration * Time.deltaTime;
}
else if (speedHorz < deceleration * Time.deltaTime)
{
speedHorz = speedHorz + deceleration * Time.deltaTime;
}
else speedHorz = 0 * Time.deltaTime;
}
transform.position = new Vector2(transform.position.x + speedHorz * Time.deltaTime, transform.position.y + speedVert * Time.deltaTime);
}
答案 0 :(得分:0)
对我而言,显而易见的是,即使您没有提供输入,您的播放器也会移动。除非我遗漏了某些内容,否则加速和减速都不会在您提供的代码段中发生变化。鉴于减速是恒定的,并且自开始游戏以来你没有提供输入,请考虑这部分片段:
else if (speedHorz < deceleration * Time.deltaTime)
{
speedHorz = speedHorz + deceleration * Time.deltaTime;
}
第一次评估这个条件时,speedHoriz为零(你的玩家开始休息,是吗?),减速度是12,而time.DeltaTime可能不是零。这意味着你的if条件评估为0 <0。 12 * [正数],这是真的。 speedHorz将从零变为大于零的东西,即使你没有按任何按钮,你的播放器也会有一点速度。