Почему мой символ в unity застревает в tilemap?

#unity3d #game-engine #game-physics

#unity3d #игровой движок #игра-физика

Вопрос:

В моем Unity мой игрок каждый раз застревает в коллайдере, когда у него большая сила (если он падает с высоты, шкала гравитации или его сила прыжка высока). На картинке вы можете видеть коллайдеры и средство визуализации.Компоненты платформыИгрок застрял на платформе Только один компонент не включен на экране в platformcomponents, Tilemap. Вот мой код для Playermovement:

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



public class Player : MonoBehaviour
{


    [SerializeField] private LayerMask platformsLayerMask;
    private Rigidbody2D rigidbody2d;
    private BoxCollider2D boxCollider2d;






    private void Awake()
    {
        
        rigidbody2d = transform.GetComponent<Rigidbody2D>();
        boxCollider2d = transform.GetComponent<BoxCollider2D>();
    }


    private void Update()
    {
        if (IsGrounded() amp;amp; Input.GetKeyDown(KeyCode.Space))
        {
            float jump_power = 17.5f;
            rigidbody2d.velocity = Vector2.up * jump_power;
    
    
        }

        HandleMovement();
       

    }


    private bool IsGrounded()
    {
        RaycastHit2D raycastHit2d = Physics2D.BoxCast(boxCollider2d.bounds.center, boxCollider2d.bounds.size, 0f, Vector2.down, .1f, platformsLayerMask);
        return raycastHit2d.collider != null;
    }

    private void HandleMovement()
    {
        float moveSpeed = 10f;

        if (Input.GetKey(KeyCode.A))
        {
            rigidbody2d.velocity = new Vector2(-moveSpeed, rigidbody2d.velocity.y);
    
        }

        else if (Input.GetKey(KeyCode.D))
        {
            rigidbody2d.velocity = new Vector2( moveSpeed, rigidbody2d.velocity.y);
        }
    
        else
        {
            rigidbody2d.velocity = new Vector2(0, rigidbody2d.velocity.y);
        }                   

    }            

}
 

Комментарии:

1. Не совсем уверен. Избавьтесь от этого else Handle Movement , вы всегда назначаете новую скорость жесткому телу, даже если ни одна кнопка не нажата. После того, как вы прыгнете один раз, вы устанавливаете скорость. y, но никогда не сбрасывайте его. Поэтому HandleMovement продолжает применять направление y, когда прыжок должен быть завершен.

2. @jiveturkey Остальное в «HandleMovement» необходимо, иначе игрок будет скользить. Жесткое тело 2d.скорость. вы в «HandleMovement» просто говорите, что на него это не влияет.

3. Правильно. Вам нужно найти другой способ, чтобы игрок мог остановить движение. Возможно, установите флаг для первого «нажатия клавиши», а затем сбросьте y.

4. @jiveturkey Я нуб, не могли бы вы объяснить это немного подробнее, пожалуйста?

5. Возможно, когда символ перемещается с помощью A или D, установите флаг isMoving = true . Затем вместо просто вашего else предложения скажите else if (isMoving) , затем сделайте то, что у вас есть, И установите isMoving = false;

Ответ №1:

Вы пробовали установить непрерывное обнаружение столкновений жесткого тела плеера? Если для обнаружения столкновений установлено значение дискретности, очень легко столкнуться с такого рода проблемами при использовании встроенной физической системы