最近我开始和联合公司合作,这是我第一次尝试建立一个二维平台。
由于某些原因,当我按下跳转按钮,有一个随机的机会,它实际上将使球员跳跃。大概是每50人中就有1人会跳起来。
我只是搞不懂它为什么这么做。你知道我在这里做错了什么吗?
using UnityEngine;
public class Player : MonoBehaviour
{
public float movespeed = 5f;
public float jumpforce = 5f;
public Rigidbody2D player;
public LayerMask layerMaskPlatforms;
private float movementHorizontalInput;
private bool jumpInput;
private float lastTimeOnGroundInSeconds = 0f;
private float lastTimePressedJump = 0f;
void OnBecameInvisible()
{
// todo: restart game
}
void Update()
{
movementHorizontalInput = Input.GetAxisRaw("Horizontal");
jumpInput = Input.GetButtonDown("Jump");
}
void FixedUpdate()
{
if (jumpInput)
{
AttemptJump();
lastTimePressedJump = 0.2f;
}
else if (lastTimePressedJump > 0)
{
AttemptJump();
lastTimePressedJump -= Time.deltaTime;
}
if (IsOnGround())
{
lastTimeOnGroundInSeconds = 0.2f;
}
else if (lastTimeOnGroundInSeconds > 0)
{
lastTimeOnGroundInSeconds -= Time.deltaTime;
}
player.velocity = new Vector2(movementHorizontalInput * movespeed * Time.deltaTime * 50f, player.velocity.y);
}
private void AttemptJump()
{
if (lastTimeOnGroundInSeconds > 0)
{
player.AddForce(new Vector2(0, jumpforce), ForceMode2D.Impulse);
lastTimeOnGroundInSeconds = 0;
}
}
private bool IsOnGround()
{
Vector2 groundedCheckPosition = (Vector2)transform.position + new Vector2(0, -0.01f);
var overlapBox = Physics2D.OverlapBox(groundedCheckPosition, transform.localScale, 0, layerMaskPlatforms);
return overlapBox;
}
}发布于 2020-09-14 00:49:11
一个主要问题是跳转输入被轮询每帧(更新),但是跳转代码每隔几个帧( FixedUpdate )执行一次,所以如果按跳转,很可能FixedUpdate方法永远不会看到跳转,解释了为什么很少发生跳转。
您需要保存跳转状态(可能是布尔值),所以固定更新发生时,它知道发生了跳转。然后将跳转设置为false,并执行跳转逻辑。
https://stackoverflow.com/questions/63871250
复制相似问题