有人可以告诉我此代码有效的问题是什么,但是我的播放器飞向天空。我刚刚开始编码,但是请帮助我。
此代码的开头从这里开始:
using System.Collections;
使用System.Collections.Generic;使用UnityEngine;
公共类PlayerController:MonoBehaviour{
private Rigidbody2D rb;
public float speed;
public float jumpForce;
private float moveInput;
private bool isGrounded;
public Transform feetPos;
public float checkRadius;
public LayerMask whatIsGround;
private float jumpTimeCounter;
public float jumpTime;
private bool isJumpimg;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
private void FixedUpdate()
{
moveInput = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
}
void Update()
{
isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround);
if (isGrounded == true && Input.GetKeyDown(KeyCode.Space))
isJumpimg = true;
jumpTimeCounter = jumpTime;
rb.velocity = Vector2.up * jumpForce;
{
}
if (Input.GetKey(KeyCode.Space) && isJumpimg == true)
if (jumpTimeCounter > 0)
{
rb.velocity = Vector2.up * jumpForce;
jumpTimeCounter -= Time.deltaTime;
} else
isJumpimg = false;
{
{
}
}
{
if (Input.GetKeyUp(KeyCode.Space))
{
isJumpimg = false;
}
}
}
}
如果复制并粘贴了此代码,我会看到您的问题。如果不是这样,可能只是格式问题。
让我们逐行浏览此部分。
if (isGrounded == true && Input.GetKeyDown(KeyCode.Space))
isJumpimg = true;
jumpTimeCounter = jumpTime;
rb.velocity = Vector2.up * jumpForce;
{
}
{}
大括号打开范围。您取一个缩进。当使用if语句执行此操作时,就是说只有一行与if语句相关。第一行之后的所有内容都将被视为总是会发生。 jumpTimeCounter
变量,如果它在if语句中,通常会很好。 Vector2.up * jumpForce
。每一帧都会发生这种情况,因为它不在if语句中,因此您一加载就飞起来。{}
打开和关闭一个作用域,但其中没有任何内容,并且没有附加到循环或if语句。解决方案:将以上部分更改为此。
if (isGrounded == true && Input.GetKeyDown(KeyCode.Space))
{
isJumpimg = true;
jumpTimeCounter = jumpTime;
rb.velocity = Vector2.up * jumpForce;
}
并且要更加谨慎地将仅在特定条件下发生的逻辑放入由if语句或循环控制的作用域内。别担心,这是学习者的常见错误。但是现在您可能会更清楚地知道{}
,()
和;
之类的所有语法都可以帮助您告诉编译器您打算执行的代码。