我正在尝试编写一个平台游戏,因为现在我的角色模型可以做的就是无限跳跃或根本不跳跃。我想使用一个for循环,这样我的角色在接地时可以跳一个,而在空中时可以跳一次,但是我想不出如何使它在两次跳一次后停止并在角色再次撞到地面时重新设置。请帮忙!
public class SimplePlatformController : MonoBehaviour
{
[HideInInspector]
public bool facingRight = true;
[HideInInspector]
public bool jump = false;
public float moveForce = 365f;
public float maxSpeed = 5f;
public float jumpForce = 1000f;
public Transform groundCheck;
private bool grounded = false;
private Animator anim;
private Rigidbody2D rb2d;
// Use this for initialization
void Awake()
{
anim = GetComponent<Animator>();
rb2d = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
for (int i = 0; i <= 1; i++)
{
grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground"));
if (Input.GetButtonDown("Jump") && grounded)
{
i = 0;
jump = true;
}
if (Input.GetButtonDown("Jump") && !grounded)
{
jump = true;
i = i + 1;
}
}
}
void FixedUpdate()
{
float h = Input.GetAxis("Horizontal");
anim.SetFloat("Speed", Mathf.Abs(h));
if (h * rb2d.velocity.x < maxSpeed)
rb2d.AddForce(Vector2.right * h * moveForce);
if (Mathf.Abs(rb2d.velocity.x) > maxSpeed)
rb2d.velocity = new Vector2(Mathf.Sign(rb2d.velocity.x) * maxSpeed, rb2d.velocity.y);
if (h > 0 && !facingRight)
Flip();
else if (h < 0 && facingRight)
Flip();
if (jump)
{
anim.SetTrigger("Jump");
rb2d.AddForce(new Vector2(0f, jumpForce));
jump = false;
}
}
void Flip()
{
facingRight = !facingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
答案 0 :(得分:1)
for
循环对此是不合适的,因为您只想在跳跃时前进计数器。并且需要在帧结束时离开循环。从理论上讲,您可以通过while
中的Coroutine
循环来实现它,但这不必要地复杂。
更好的选择是根据双跳状态将计数器保留为类字段并适当地对其进行更新。
此外,由于在每个帧上都到达了if语句,因此您必须在两次跳转之前检查是否还有其他空中跳转。
如果您希望仅在离开平台后就可以进行两次跳转,则随时可以将0
设置为{{1}时将跳转计数器设置为grounded
}。
结合所有这些建议可能看起来像这样:
true