我的2D角色根本没有跳跃

时间:2017-09-17 02:01:40

标签: c# unity2d rigid-bodies

我的角色问题根本没有跳跃。我是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;
    }
}

}

Player GameObject的Inspector窗口

Player

Ground GameObject的巡视窗口

Ground/Cube

2 个答案:

答案 0 :(得分:0)

您的问题是您没有标记Ground GameObject。所以在OnCollisionEnter2D中,角色会检测到碰撞,但if (coll.transform.tag == "Ground")永远不会成立。所以这意味着角色不能是grounded

由于接地是检查玩家是否按下跳转键的第一个条件。它不可能跳过

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

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

enter image description here

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 variable。

  • 您将使用Physics2D.Linecast代替OnTriggerEnter 将从角色的位置到其下方的一条线 脚(你应该放置在中提到的变换) 前一步)如果在中间有一个元素 groundLayer,这意味着角色将被接地。

如果有任何不清楚或者您发现了一些错误,请告诉我。

答案 1 :(得分:0)

如前所述,你的问题很遗憾,你遗失了标记地面物体的对象:)

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

void Update(){

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

}