我的玩家的重力在他们跳跃的顶点处减小,但在那之后它并没有改变。我希望重力在顶点之后增加一定的时间量。
如果我在跳跃以及我的 y 速度是否为负值,我将其设置为检测我跳跃的顶点。然后我设置了几个布尔值以在增加的重力和减少的重力之间切换,我使用 if 语句进行切换。我有 if 语句来切换减少和增加重力布尔值,它引用我作为计数器使用的浮点数。当你不跳跃时,计数器重置为 0.2,在确定跳跃顶点的 if 语句中,我有“gravityCounter -= Time.deltaTime”在你到达所述顶点时对其进行倒计时。
无论出于何种原因,计数器似乎从未真正下降过;有人知道怎么了吗?
这是脚本:
{
public bool increaseGravity = false;
public bool decreaseGravity = false;
public float gravityCounter;
public float gravity = 0.2f;
public float gravityModifierDown = 2.75f;
public float gravityModifierUp = 4.25f;
public float normalGravity = 3.5f;
bool highPoint = false;
[SerializeField] private Rigidbody2D rb;
private void Update()
{
if (rb.velocity.y < 0 && this.highPoint == false && gameObject.GetComponent<PlayerMovement>().isJumping == true)
{
this.highPoint = true;
Debug.Log("highPoint");
decreaseGravity = true;
gravityCounter -= Time.deltaTime;
}
else
{
gravityCounter = 0.2f;
}
if (rb.velocity.y > 0f || this.gameObject.GetComponent<PlayerMovement>().IsGrounded())
{
this.highPoint = false;
}
if (gravityCounter < 0f)
{
Debug.Log("Gravity Counter Empty");
decreaseGravity = false;
increaseGravity = true;
}
if (decreaseGravity == true)
{
this.gameObject.GetComponent<Rigidbody2D>().gravityScale = gravityModifierDown;
}
if (increaseGravity == true)
{
this.gameObject.GetComponent<Rigidbody2D>().gravityScale = gravityModifierUp;
}
if (this.gameObject.GetComponent<PlayerMovement>().IsGrounded() || this.gameObject.GetComponent<PlayerMovement>().IsWalled())
{
increaseGravity = false;
decreaseGravity = false;
this.gameObject.GetComponent<Rigidbody2D>().gravityScale = normalGravity;
}
}
}
gravityCounter 不会降低,因为这个语句只发生一次:
gravityCounter -= Time.deltaTime;
该语句块是在条件检查
highpoint
是否等于 true 之后,但是您立即将 highpoint
设置为 false。因此,它只会发生在一个更新调用中,之后的每个调用都会到达 else 块并将gravityCounter
设置回0.2f
。
也许把
gravityCounter -=
行放在if (decreaseGravity == true)
之后(顺便说一句,你不需要“== true”)。
此外,与具体问题无关,但我认为像重力这样的物理相关的东西应该在
FixedUpdate