2D PlayerController统一

问题描述 投票:0回答:1

有人可以告诉我此代码有效的问题是什么,但是我的播放器飞向天空。我刚刚开始编码,但是请帮助我。

此代码的开头从这里开始:

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;
        }     
    }
}

}

c unity3d 2d sharp
1个回答
0
投票

如果复制并粘贴了此代码,我会看到您的问题。如果不是这样,可能只是格式问题。

让我们逐行浏览此部分。

if (isGrounded == true && Input.GetKeyDown(KeyCode.Space))
    isJumpimg = true;
jumpTimeCounter = jumpTime;
    rb.velocity = Vector2.up * jumpForce;
{

}
  • 您要进行if条件检查您是否接地以及是否按下了跳转键
  • 您不会用{}大括号打开范围。您取一个缩进。当使用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语句或循环控制的作用域内。别担心,这是学习者的常见错误。但是现在您可能会更清楚地知道{}();之类的所有语法都可以帮助您告诉编译器您打算执行的代码。

© www.soinside.com 2019 - 2024. All rights reserved.