Задать вопрос
@armageddon234

Пули в Unity 2D?

У меня есть Префаб Bullet и Tilemap. Tilemap имеет коллайдер. Пуля имеет коллайдер прямоугольный, Rigibody с физическим материалом где трение 0 и упругость 0. у меня есть код и пуля отскакивает от стен нормально(но я уверен что это сильный говнокод, так как я новичок). Но есть одна проблема. Иногда пуля отбивается от стены но всего на один пиксель и не меняя направления, дальше делит в эту же стену до тех пор, пока на эту пулю чтонибудь не подействует. Так же когда пуля влетает в угол Tilemap(вогнутый угол), то моя пуля там может застрять. Как решить эту проблему?
using Unity.VisualScripting;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float speed = 5f;
    public Rigidbody2D rb;
    public Vector2 direction;
    public int countCollision;
    void Start(){
        rb = GetComponent<Rigidbody2D>();
        direction = transform.right;
    }

    void Update(){
        rb.velocity = transform.right * speed;
    }

    void OnCollisionEnter2D(Collision2D col){
        if(col.gameObject.CompareTag("Monster")){
            Destroy(col.gameObject);
        }
        if(countCollision <= 0){
            Destroy(gameObject);
        }
        
        Vector2 normal = col.contacts[0].normal;
        if (col.gameObject.CompareTag("Wall")){     
            if (Vector2.Dot(normal, Vector2.up) > 0.5f){
                direction.y = -direction.y;
            }
            else if (Vector2.Dot(normal, Vector2.down) > 0.5f){
                direction.y = -direction.y;
            }
            else if (Vector2.Dot(normal, Vector2.left) > 0.5f || Vector2.Dot(normal, Vector2.right) > 0.5f){
                direction.x = -direction.x;
            }
            UpdateRotation();
        }
        countCollision -= 1;
    }

    void UpdateRotation(){
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        transform.eulerAngles = new Vector3(0, 0, angle);
    }


    


}
  • Вопрос задан
  • 77 просмотров
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 1
@DrRen7
В 2д не силен, да и для пуль предпочитаю юзать физиккасты а не rb. Но вот проблемы
Rigibody лучше не крутить через код, лучше ему переназначить вектор направления.
Прямоугольный коллайдер будет застревать в лучше взять циркуль
код примерно такой
Vector2 _moveDir;
    Rigidbody2D _rb;
    [SerializeField] float _speed=5f;
    bool _blockMoveUpdate;
    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
        ShootUpdate(transform.right);
    }

    private void ShootUpdate(Vector2 newDir)
    {
        _moveDir = newDir.normalized;
        _rb.velocity = _moveDir*_speed;
        if(_blockMoveUpdate)_blockMoveUpdate = false;
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (!_blockMoveUpdate)
        {
            _blockMoveUpdate = true;
            var coll = collision.contacts[0];
            Vector2 newMove = Vector2.Reflect(_rb.velocity.normalized, coll.normal);
            ShootUpdate(newMove);
        }
           
    }

_blockMoveUpdate тут работать не будет, но можно через FixedUpdate придумать реализацию но надо тестить
ну и настройки Rb
66f44c1e85257625307723.png
интерполяцию какую то точно надо, коллизия думаю у вас и так стоит, ну а основное все в нули
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы