Как можно реализовать стрельбу через укрытия Unity 2D

Рейтинг: 0Ответов: 2Опубликовано: 04.08.2023

Всех приветствую! Хотел бы спросить как можно реализовать стрельбу через укрытие, для понимания вопроса объясню суть проблемы, есть точка firepoint из которой вылетают пули и расположена она на конце ствола, поэтому она зависит от вида оружия, укрытия у меня все одного размера, поэтому через некоторые виды оружия не могу стрелять через укрытие т.к пули просто врезаются в коллайдер, есть вариант отключить соприкосновение пуль и укрытия но этот вариант меня не устраивает, потому что пули будут пролетать когда персонаж даже не находиться у укрытия, поэтому хотел бы спросить как можно реализовать стрельбу чтобы пули не врезались в укрытие когда персонаж рядом с укрытием. Попрошу прощение, я новичок в этом деле, но буду благодарен за любую помощь!

Ответы

▲ 0Принят

В ходе попыток, и рассмотренных вариантов и предложенных, я реализовал это по системе отступа коллайдера, что мне и нужно было, то есть я могу регулировать отступ коллайдера у укрытия, чтобы пули могли проходить по периметру объекта, но так же он зависит от слоя в моём случае от Cover, благодарю всех за оказанную помощь!

public float coverOffset = 0.1f;               // Отступ коллайдера укрытия

...

// Raycast для проверки, попала ли пуля в укрытие
RaycastHit2D hit = Physics2D.Raycast(firepoint.position, rb.velocity.normalized, Range, LayerMask.GetMask("Cover"));
if (hit.collider != null)
{
    // Параметр  влияющий за отступ коллайдера при стрельбе, зависит от float coverOffset
    Vector2 hitPoint = hit.point + rb.velocity.normalized * coverOffset;

    bullet.transform.position = hitPoint;
}
▲ 0

если я правильно понял, то у тебя пули бьются об укрытие, а не летят насквозь. если это так то попробуй в момент выстрела выключать укрытие - aka

Укрытие.SetActive(false);
Shot();
Укрытие.SetActive(true);

также если надо чтобы так работало только если игрок рядом с укрытием, то включай эту функцию если игрок рябом с объектом (можно тригером или через Vector2.Distance)