Как заставить кинематическое жесткое тело обнаруживать столкновения с 2d-столкновением tilemap?

#c# #unity3d #2d #tile

Вопрос:

Я делаю игру типа Пакмана, просто для развлечения, и у меня проблема. Я создал персонажа и сделал карту с картами. Я добавил tilemap collider 2d к tilemap и box collider 2d и жесткое тело(кинематическое) для персонажа. Вот мой код для перемещения:

 public class PlayerController : MonoBehaviour
{
    [SerializeField]
    private float _speed = 3.0f;
    private Vector2 _direction = Vector2.zero;


    private void Start()
    {
     
    }

    private void Update()
    {
        Move();

        CheckInput();
    }

    private void CheckInput()
    {
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            _direction = Vector2.left;
        } else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            _direction = Vector2.right;
        } else if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            _direction = Vector2.up;
        } else if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            _direction = Vector2.down;
        }
    }

    private void Move()
    {
        transform.localPosition  = (Vector3)(_direction * _speed) * Time.deltaTime;
    }
}
 

Я изменил «Режим контактных пар», но это не сработало. Вот фотография моей проблемы:
проблема столкновения

Ответ №1:

Кинематические жесткие тела не допускают столкновения. Они предназначены для использования для стен и прочего. Было бы лучше использовать динамический Rigidbody2D и отключить гравитацию и любые другие силы, которые вам не нужны.

Динамическое жесткое тело-это еще одна вещь, которую вы можете выбрать вместо кинематической в раскрывающемся меню. Очень важно, чтобы вы установили его на динамический, потому что динамический позволяет воздействовать на объект силами.

Кроме того, при использовании твердого тела вы не хотите перемещать его с помощью преобразования.

Я бы двигал его со скоростью, чтобы он обнаружил столкновение.

 Rigidbody2D rb;
private void Start()
{
    rub = GetComponent<Rigidbody2D>();
}

private void Update()
{
    Move();

    CheckInput();
}

private void CheckInput()
{
    if (Input.GetKeyDown(KeyCode.LeftArrow))
    {
        _direction = Vector2.left;
    } else if (Input.GetKeyDown(KeyCode.RightArrow))
    {
        _direction = Vector2.right;
    } else if (Input.GetKeyDown(KeyCode.UpArrow))
    {
        _direction = Vector2.up;
    } else if (Input.GetKeyDown(KeyCode.DownArrow))
    {
        _direction = Vector2.down;
    }
}

private void Move()
{
    rb.velocity = _direction * _speed * Time.deltaTime;
    //set all of the drag variables on the Rigidbody
    //to very high, so it slows down when they stop moving.
}