【问题标题】:Unity 2D collider is not behaving properly. I cant move through/on the one block below the 2D colliderUnity 2D 对撞机的行为不正常。我无法通过/在 2D 对撞机下方的一个方块上移动
【发布时间】:2021-06-24 06:26:17
【问题描述】:

所以我试图做一个瓦片基础运动,突然遇到了 collider2D 的这个问题。 所以我在图像中为那个极点设置了一个平铺大小的 2D 对撞机,但是出现了一个问题。 我突然注意到我无法通过或在 2D 碰撞器下方的一个图块/块上移动。

请注意,角色没有任何 2d 碰撞器或 2d 刚体。 角色依靠函数private bool notBlocked(Vector3 movePosition) 来阻止我的角色移动并在被阻止时停止动画。

我突出显示了我无法移动的块/图块。那里没有对撞机,所以我不知道为什么我的角色不能穿过/在上面

但是当我在碰撞器顶部的块上尝试它时,它的工作原理与碰撞器周围的左右瓷砖/块相同。

所以这是我在碰撞时用于移动和停止移动的代码。

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

public class PlayerController : MonoBehaviour
{
    private float moveSpeed;
    public LayerMask SolidObjectLayer;

    private bool isMoving;
    private Vector2 input;
    private Animator animator;

    private void Update()
    {
        InputMove();
    }

    private void Awake()
    {
        animator = GetComponent<Animator>();
    }

    private void InputMove()
    {
        if (!isMoving)
        {

            input.x = Input.GetAxisRaw("Horizontal");
            input.y = Input.GetAxisRaw("Vertical");

            if (input.x != 0) input.y = 0;

            if (input != Vector2.zero)
            {
                animator.SetFloat("Horizontal", input.x);
                animator.SetFloat("Vertical", input.y);

                var movePos = transform.position;
                movePos.x += input.x;
                movePos.y += input.y;

                if (notBlocked(movePos))
                    StartCoroutine(Move(movePos));
            }
        }

        if (Input.GetKey(KeyCode.LeftShift))
        {
            moveSpeed = 6f;
            animator.speed = 1.5f;
        }

        else
        {
            moveSpeed = 4f;
            animator.speed = 1f;
        }
        animator.SetBool("isMoving", isMoving);
    }

    IEnumerator Move(Vector3 movePos)
    {
        isMoving = true;
        while((movePos - transform.position).sqrMagnitude > Mathf.Epsilon)
        {
            transform.position = Vector3.MoveTowards(transform.position, movePos, moveSpeed * Time.deltaTime);
            yield return null;
        }
        transform.position = movePos;
        isMoving = false;
    }

    private bool notBlocked(Vector3 movePosition)
    {
        if(Physics2D.OverlapCircle(movePosition, 0.2f, SolidObjectLayer) != null)
        {
            return false;
        }

        return true;
    }
}

我不知道它是否与“private bool isBlocked()”有关,但它是我用来阻止角色在被阻止时进一步移动的函数。

【问题讨论】:

  • 你的角色对撞机有多大?看起来头部正在与柱子相撞
  • 我的角色上没有碰撞器。它使用OverlapCircle 阻止角色移动穿过具有 2D 对撞机的对象

标签: unity3d 2d-games collider


【解决方案1】:

您角色上的对撞机似乎太大了。如果对撞机覆盖了整个角色,那么头部就会与柱子发生碰撞。要解决此问题,您可以单击此按钮: 并编辑对撞机,使其只有脚所在的底部正方形。这样可以防止头部与柱子发生碰撞。

【讨论】:

  • 问题是……我的角色没有任何 Collider 2D。所以它依靠OverlapCircle 不移动任何具有 collider2D 的对象
  • 哦。然后当你说var movePos = transform.position时,你应该说var movePos = transform.position - (Vector3.up * -0.5f),这样你就可以将玩家站立的底部方块的位置插入到你的检查函数中。
【解决方案2】:

好的,所以我设法弄清楚如何解决它。 所以角色只能在没有碰撞器的方块上移动

所以这意味着如果那个黄色点直接穿过对撞机,那么它将阻止我的角色移动。所以看起来像是从角色中心或轴心投射的 OverlapCircle,所以我将角色的轴心调低了一点。

如您所见,问题在于 OverLapCircle 正试图进入对撞机 但随后脚本阻止它发生并阻止我在瓷砖下方的时间移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多