【问题标题】:Unity 2D : Collisions detectionUnity 2D:碰撞检测
【发布时间】:2017-04-05 19:41:23
【问题描述】:

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

我应该可以做到,但我不能动。两个对象都有 BoxCollider2D。这是玩家的 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 很陌生

【问题讨论】:

  • 从直觉上看,大小为 1x2 的玩家精灵会与树碰撞(我预计在偏移 1,1 处),这似乎是合乎逻辑的。玩家精灵不应该是 1x1 吗?

标签: c# unity5 unity2d


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    Tutorial

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多