Unity 2D:碰撞检测

时间:2017-04-05 19:41:23

标签: c# unity5 unity2d

我正在尝试制作一个宠物小精灵游戏,我遇到了碰撞检测问题。 例如,如果我想在这里右转:

Trying to go right

我应该能够做到,但我无法动弹。两个对象都有BoxCollider2D。这是玩家的BoxCollider:

BoxCollider of the player

树有一个大小为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的新手

2 个答案:

答案 0 :(得分:0)

这个问题是由两个碰撞器之间的摩擦引起的, 您应该创建物理材质2D并将其摩擦力设置为0 并将其添加到Box Collider 2D材料中。

另外考虑在障碍物(树)上使用圆形碰撞器而不是盒子,因为它是圆形的。

答案 1 :(得分:0)

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

由于你有一个基于磁贴的游戏(就像我猜的口袋妖怪一样),这应该是一个很好的方法。当你没有深入统一引擎时,你应该查看他们网站上的初学者教程。这是Roguelike教程的链接,其中包含您可能想要的完全相同的运动。一切都得到了很好的解释,你可以在教程中复制他们写的所有脚本;)只要看一下,也许你会找到你尚未知道的新东西。

Tutorial