我的 2D 角色根本不跳

My 2D Character is not jumping at all

我的角色有问题,根本不跳。我是 Unity 的新手,但我确保将脚本应用到播放器并调整速度,我没有接触 Rigidbody 2D。如果有人可以帮助我解决问题,将不胜感激。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

public float moveSpeed;
public float jumpSpeed;
public bool grounded = false;
private Rigidbody2D rb;

void Start() {
    rb = GetComponent<Rigidbody2D>();
}

void Update () {

    transform.Translate (Input.GetAxisRaw ("Horizontal") * moveSpeed * Time.deltaTime, 0, 0);

    if (grounded) 
    {
        if (Input.GetButtonDown ("Jump"))
        {
            rb.AddForce (Vector2.up * jumpSpeed);
            grounded = false;
        }
    }
}


void OnCollisionEnter2D (Collision2D coll){
    if (coll.transform.tag == "Ground") 
    {
        grounded = true;
    }
}

}

玩家游戏对象的检查员window

地面游戏对象的检查员window

你的问题是你没有这样标记地面游戏对象。所以在 OnCollisionEnter2D 中角色检测到碰撞,但 if (coll.transform.tag == "Ground") 永远不会是真的。所以这意味着字符不能是 grounded

因为接地是检查玩家是否按下跳跃键的第一个条件。永远不可能跳下去

if (grounded) 
    {
        if (Input.GetButtonDown ("Jump"))
        {
            rb.AddForce (Vector2.up * jumpSpeed);
            grounded = false;
        }
    }

要解决此问题:您需要这样标记地面游戏对象。如果您不确定如何操作,请在 Tag 菜单上创建(如果尚不存在)一个名为 Ground 的新标签。然后在同一菜单中将 Ground Tag 分配给 Ground GameObject。如果您需要视觉参考,您可以在这里了解如何操作:

https://docs.unity3d.com/Manual/Tags.html

编辑:如果一切都失败了,您可以试试这个脚本。它应该工作。前段时间我用过我自己,我清理了代码,只留下你需要在 x 和 y 轴上移动角色的东西。希望包含您需要的一切:

public class CharacterController2D : MonoBehaviour {

    // LayerMask to determine what is considered ground for the player
    public LayerMask whatIsGround;

    // Transform just below feet for checking if player is grounded
    public Transform groundCheck;

    // store references to components on the gameObject
    Transform transform;
    Rigidbody2D rigidbody;

    bool isGrounded = false;

    float vy;
    float vx;

    public float jumpForce = 600f;

    void Awake () {
        transform = GetComponent<Transform> ();
        rigidbody = GetComponent<Rigidbody2D> ();
    }


    void Update()
    {

        // determine horizontal velocity change based on the horizontal input
        vx = Input.GetAxisRaw ("Horizontal");
        vy = rigidbody.velocity.y;

        // Check to see if character is grounded by raycasting from the middle of the player
        // down to the groundCheck position and see if collected with gameobjects on the
        // whatIsGround layer
        isGrounded = Physics2D.Linecast(transform.position, groundCheck.position, whatIsGround);

        if(isGrounded && Input.GetButtonDown("Jump")) // If grounded AND jump button pressed, then allow the player to jump
        {
            DoJump();
        }

        // Change the actual velocity on the rigidbody
        rigidbody.velocity = new Vector2(_vx * MoveSpeed, _vy);

    }

    //Make the player jump
    void DoJump()
    {
        // reset current vertical motion to 0 prior to jump
        vy = 0f;
        // add a force in the up direction
        rigidbody.AddForce (new Vector2 (0, jumpForce));

    }
}

所以要考虑的事项:

  • 您无需标记地面,而是创建一个图层,其中包含您需要的所有内容 考虑地面。这将包括可能的平台角色 可能会跳过。将该层作为参数传递给脚本中的 检查员

  • 您需要在角色脚下放置一个空的GameObject。 您将把编辑器中的 GameObject 拖放到 groundCheck public 变量。

  • 您将使用 Physics2D.Linecast 而不是 OnTriggerEnter 将从角色的位置到其下方的一条线 脚(你应该在哪里放置 Transform 中提到的 上一步),如果在中间有一个元素 groundLayer,表示角色会被接地

如果有任何不清楚的地方或发现错误,请告诉我。

如前所述,您的问题显然是您没有标记地面物体 :)

提示:当我遇到这样的问题时,我喜欢做的是使用 unitys Debug.Log() 来定位问题所在。它会让您在控制台中轻松了解哪些代码是 运行,哪些不是。尝试执行以下操作:

void 更新 () {

transform.Translate (Input.GetAxisRaw ("Horizontal") * moveSpeed * Time.deltaTime, 0, 0);

if (grounded) 
{
    Debug.Log("Is grounded");

    if (Input.GetButtonDown ("Jump"))
    {
        Debug.Log("Jump clicked");
        rb.AddForce (Vector2.up * jumpSpeed);
        grounded = false;
    }
}

}