0

我正在尝试制作口袋妖怪游戏,但碰撞检测有问题。例如,如果我想在这里右转:

试图向右走

我应该可以做到,但我不能动。两个对象都有 BoxCollider2D。这是玩家的 BoxCollider:

玩家的 BoxCollider

树有一个大小为 1, 1 和偏移量为 0, 0 的 boxcollider。

这是我的代码:

    void Update()
{
    input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
    actualSpeed = Input.GetKey(KeyCode.LeftShift) ? walkingVelocity : runingVelocity;

    if (input != Vector2.zero && p == transform.position)
    {
        anim.SetBool("isMoving", true);

        if (Mathf.Abs(input.x) > Mathf.Abs(input.y))
        {
            if (input.x > 0)
            {
                if (direction.Equals(Direction.Este) && canMove())
                {
                    p += Vector3.right;
                }else
                {
                    direction = Direction.Este;
                }                   
            }
            else
            {
                if (direction.Equals(Direction.Oeste) && canMove()) {
                    p -= Vector3.right;
                }
                else{
                    direction = Direction.Oeste;
                }
            }
        }
        else
        {
            if (input.y > 0)
            {
                if (direction.Equals(Direction.Norte) && canMove())
                {
                    p += Vector3.up;
                }else
                {
                    direction = Direction.Norte;
                }

            }
            else
            {
                if (direction.Equals(Direction.Sur) && canMove())
                {
                    p -= Vector3.up;
                }
                else
                {
                    direction = Direction.Sur;
                }

            }
        }
        anim.SetFloat("input_x", input.x);
        anim.SetFloat("input_y", input.y);

    }
    else if (input == Vector2.zero)
    {
        anim.SetBool("isMoving", false);
    }
    transform.position = Vector3.MoveTowards(transform.position, p, actualSpeed * Time.deltaTime);
}

bool canMove()
{
    bool b = true;
    Ray2D r;
    if (direction.Equals(Direction.Norte))
    {
        r = new Ray2D(transform.position, Vector3.up);
    }
    else if (direction.Equals(Direction.Sur))
    {
        r = new Ray2D(transform.position, Vector3.down);
    }
    else if (direction.Equals(Direction.Este))
    {
        r = new Ray2D(transform.position, Vector3.right);
    }
    else
    {
        r = new Ray2D(transform.position, Vector3.left);
    }

    Debug.DrawRay(r.origin, r.direction);

    RaycastHit2D hit = Physics2D.Raycast(r.origin, r.direction, 1f , 1 << 8);
    if (hit.collider != null)
    {
        if (hit.collider.CompareTag("Obstacle"))
        {
            b = false;
        }
    }
    return b;
}

我怎样才能让玩家在树上移动?

谢谢!PD。我对 Unity2D 很陌生

4

2 回答 2

0

这个问题是由两个对撞机之间的摩擦引起的,您应该创建一个 Physics Material 2D 并将其摩擦设置为 0 并将其添加到 Box Collider 2D 材质中。

还可以考虑在障碍物(树)上使用圆形对撞机而不是框,因为它是圆形的。

于 2017-04-05T19:53:12.710 回答
0

您遇到的问题可能是由游戏对象的边界引起的,它们可能仍然相交。解决此问题的一种方法是将绑定体的大小设置为 (0.9, 0.9),而不是 (1, 1),但是您需要添加一个额外的脚本来检查您是否可以在不运行对象的情况下进行移动.

因为你有一个基于瓷砖的游戏(就像我猜的口袋妖怪一样),这应该是一个很好的方法。如果您对统一引擎没有那么深入,您应该查看他们网站上的初学者教程。这是 Roguelike 教程的链接,其中包含您可能想要的完全相同的动作。一切都解释得很好,你可以复制他们在教程中编写的所有脚本;)只要看看它,也许你会发现你还不知道的新事物。

教程

于 2017-04-06T10:13:58.980 回答