Эффекты выстрела вместе с лучами. Время. [РЕШЕНО]

Программирование на Юнити.

Эффекты выстрела вместе с лучами. Время. [РЕШЕНО]

Сообщение ВерховныйНоуНейм 09 фев 2020, 12:48

У меня есть пистолет, который стреляет лучами. Регистрация попаданий и создание эффектов попадания происходит через луч, но для эффектности выстрела так-же генерируется физическая пуля с TrailRenderer, которая летит быстро, но все-же медленней, чем "моментально". Проблема в том, что когда происходит попадание, физическая пуля никуда не девается и происходит пробитие любых объектов. Игра в 2D и это очень даже видно.

Ну так вот, как справиться с данной ситуацией? Я знаю, что в лучи можно впихнуть время и привязывать как-то к каждому лучу пулю, но я не могу сообразить.
Через коллайдеры не получиться, слишком высокие скорости. И еще есть под-проблема - если использовать авто-дробовики с 5-ю дробинками, то fps приседает от 5 до 25. Тоже хз, как оптимизировать.
Последний раз редактировалось ВерховныйНоуНейм 14 фев 2020, 20:13, всего редактировалось 1 раз.
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

Re: Эффекты выстрела вместе с лучами. Проблема с препятствиями.

Сообщение triska 10 фев 2020, 01:31

Как реализован выстрел?
Ничего не понятно, кода нет, как вы надеятесь получить помощь?
А наверно мы, должны читать ваши мысли и видеть сквозь вселенную, как же у вас там, что реализовано.
Вряд-ли тут, есть телепаты или экстрасенсы.
triska
UNIт
 
Сообщения: 64
Зарегистрирован: 08 фев 2020, 09:42

Re: Эффекты выстрела вместе с лучами. Проблема с препятствиями.

Сообщение ВерховныйНоуНейм 10 фев 2020, 18:07

Конечно, держите. (убрал свисто-перделки, которые не нужны сейчас)
Код функции выстрела. Воспроизводится каждый раз, когда происходит выстрел.
Синтаксис:
Используется csharp
for (int i = 0; i < shotsInBull; i++)
            {
                Vector3 forward = new Vector3(Fire_Bulls[0].transform.forward.x, Fire_Bulls[0].transform.forward.y + (Random.Range(-Accuracy, Accuracy) * (AccuracyFromHeating * GetComponentInParent<CharacterWeaponBullsControl>().Heating + 1)), Fire_Bulls[0].transform.forward.z);
                hit = Physics2D.Raycast(Fire_Bulls[0].transform.position, forward, distance * 2);
                if (BullViev != null)
                {
                    GameObject bull_cloned;
                    bull_cloned = Instantiate(BullViev, Fire_Bulls[0].transform.position, GetComponentInParent<CharacterMoveControlClassic>().WeaponHand.transform.rotation);
                    bull_cloned.GetComponent<BullDestroy>().timeDestroy = 0.5f;
                    Destroy(bull_cloned.GetComponent<BoxCollider2D>());
                    Rigidbody2D rigi = bull_cloned.GetComponent<Rigidbody2D>();
                    rigi.AddForce(forward * ShootImpulse * 5, ForceMode2D.Impulse);
                }
                if (hit.collider != null)
                {
                    if (hit.collider.tag == "eviled" || hit.collider.tag == "Player")
                    {
                        if (hit.collider.gameObject.GetComponent<HealStorage>() && !hit.collider.gameObject.GetComponent<HealStorage>().invincible)
                        {
                            if (hit.collider.gameObject.GetComponent<HealStorage>().shieldHeal > 0)
                            {
                                float Damage = ((Random.Range(StatsNum[0], StatsNum[1]) * damegeMultiplier) / shotsInBull);
                                hit.collider.gameObject.GetComponent<HealStorage>().shieldHeal -= Damage * Mathf.InverseLerp(distance, distance * 0.5f, hit.point.x - Fire_Bulls[0].transform.position.x);
                                GameObject sc = Instantiate(Resources.Load("DamageCloudShield") as GameObject, new Vector3(hit.point.x + Random.Range(-3, 3), hit.point.y + Random.Range(2, 6), 2), new Quaternion(0, 0, 0, 0));
                                sc.GetComponent<TextMesh>().text = Mathf.Round(Damage * Mathf.InverseLerp(distance, distance * 0.5f, hit.point.x - Fire_Bulls[0].transform.position.x)).ToString();
                            }
                        }
                    }
                }
            }

Физическая пуля - это объект с таймером на отключение, физикой, спрайтом и TrailRenderer'ом. Коллайдеров на пуле нет.
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

Re: Эффекты выстрела вместе с лучами. Проблема с препятствиями.

Сообщение seaman 10 фев 2020, 22:20

Внутри if (hit.collider != null) рассчитываете время, которое будет лететь пуля до точки столкновения. Запускаете корутину, которая по истечении этого времени удалит пулю
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Эффекты выстрела вместе с лучами. Время. [РЕШЕНО]

Сообщение ВерховныйНоуНейм 14 фев 2020, 20:17

Долговато отвечал. Времени не было. В общем спасибо seaman за наводку. Вот код:
Объявил переменную GameObject bull в шапке.
Синтаксис:
Используется csharp
if (BullViev != null)
                    {
                        GameObject bull_cloned;
                        bull_cloned = Instantiate(BullViev, Fire_Bulls[0].transform.position, GetComponentInParent<CharacterMoveControlClassic>().WeaponHand.transform.rotation);
                        bull_cloned.GetComponent<BullDestroy>().timeDestroy = 0.5f;
                        Destroy(bull_cloned.GetComponent<BoxCollider2D>());
                        Rigidbody2D rigi = bull_cloned.GetComponent<Rigidbody2D>();
                        rigi.AddForce(forward * ShootImpulse * 5, ForceMode2D.Impulse);
                        bull = bull_cloned;
                    }
                    if (hit.collider != null)
                    {
                        StartCoroutine(Destr(bull, hit));
                    }

Сам выстрел. Перенес полностью в корутину.
Синтаксис:
Используется csharp
public IEnumerator Destr (GameObject b, RaycastHit2D hit)
    {
        yield return new WaitForSeconds(Vector2.Distance(b.transform.position, hit.transform.position) / (ShootImpulse * 5));
        Instantiate(Resources.Load("Walls_Particles") as GameObject, new Vector3(hit.point.x, hit.point.y, 12 + Random.Range(-1f, 1f)), new Quaternion(0, 0, 0, 0));
        if (hit.collider.tag == "eviled" || hit.collider.tag == "NPC" || hit.collider.tag == "Player")
        {
            if (hit.collider.gameObject.GetComponent<HealStorage>() && !hit.collider.gameObject.GetComponent<HealStorage>().invincible)
            {
                if (hit.collider.gameObject.GetComponentInChildren<ChShieldRegen>())
                    hit.collider.gameObject.GetComponentInChildren<ChShieldRegen>().timer = 5;
                if (hit.collider.gameObject.GetComponent<HealStorage>().shieldHeal > 0)
                {
                    float Damage = ((Random.Range(StatsNum[0], StatsNum[1]) * damegeMultiplier) / shotsInBull);
                    hit.collider.gameObject.GetComponent<HealStorage>().shieldHeal -= Damage * Mathf.InverseLerp(distance, distance * 0.5f, hit.point.x - Fire_Bulls[0].transform.position.x);
                    GameObject sc = Instantiate(Resources.Load("DamageCloudShield") as GameObject, new Vector3(hit.point.x + Random.Range(-3, 3), hit.point.y + Random.Range(2, 6), 2), new Quaternion(0, 0, 0, 0));
                    sc.GetComponent<TextMesh>().text = Mathf.Round(Damage * Mathf.InverseLerp(distance, distance * 0.5f, hit.point.x - Fire_Bulls[0].transform.position.x)).ToString();
                }
                else
                {
                    float Damage = ((Random.Range(StatsNum[0], StatsNum[1]) * damegeMultiplier) / shotsInBull);
                    hit.collider.gameObject.GetComponent<HealStorage>().heal -= Damage * Mathf.InverseLerp(distance, distance * 0.5f, hit.point.x - Fire_Bulls[0].transform.position.x);
                    GameObject sc = Instantiate(Resources.Load("DamageCloud") as GameObject, new Vector3(hit.point.x + Random.Range(-3, 3), hit.point.y + Random.Range(2, 6), 2), new Quaternion(0, 0, 0, 0));
                    sc.GetComponent<TextMesh>().text = Mathf.Round(Damage * Mathf.InverseLerp(distance, distance * 0.5f, hit.point.x - Fire_Bulls[0].transform.position.x)).ToString();
                }
            }
            if (hit.collider.gameObject.GetComponent<HitZone>() && !hit.collider.gameObject.GetComponentInParent<HealStorage>().invincible && hit.collider.gameObject.GetComponentInParent<HealStorage>().shieldHeal <= 0)
            {
                if (hit.collider.gameObject.GetComponentInChildren<ChShieldRegen>())
                    hit.collider.gameObject.GetComponentInChildren<ChShieldRegen>().timer = 5;

                float Damage = ((Random.Range(StatsNum[0], StatsNum[1]) * damegeMultiplier) / shotsInBull);
                hit.collider.gameObject.GetComponentInParent<HealStorage>().heal -= Damage * Mathf.InverseLerp(distance, distance * 0.5f, hit.point.x - Fire_Bulls[0].transform.position.x) * hitDamageMultiplier;
                GameObject sc = Instantiate(Resources.Load("DamageCloudCrit") as GameObject, new Vector3(hit.point.x + Random.Range(-3, 3), hit.point.y + Random.Range(2, 6), 2), new Quaternion(0, 0, 0, 0));
                sc.GetComponent<TextMesh>().text = Mathf.Round(Damage * Mathf.InverseLerp(distance, distance * 0.5f, hit.point.x - Fire_Bulls[0].transform.position.x) * hitDamageMultiplier).ToString();
            }
        }
        if (hit.collider.gameObject.GetComponentInParent<Rigidbody2D>())
        {
            Vector3 forwar = new Vector3(Fire_Bulls[0].transform.forward.x, Fire_Bulls[0].transform.forward.y, Fire_Bulls[0].transform.forward.z);
            hit.collider.gameObject.GetComponentInParent<Rigidbody2D>().AddForce(forwar * EnemysImpulse * 10, ForceMode2D.Impulse);
        }
        if (hit.collider.gameObject.GetComponentInChildren<Rigidbody2D>())
        {
            Vector3 forwar = new Vector3(Fire_Bulls[0].transform.forward.x, Fire_Bulls[0].transform.forward.y, Fire_Bulls[0].transform.forward.z);
            hit.collider.gameObject.GetComponentInChildren<Rigidbody2D>().AddForce(forwar * EnemysImpulse * 10, ForceMode2D.Impulse);
        }
        b.SetActive(false);
    }
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

Re: Эффекты выстрела вместе с лучами. Время. [РЕШЕНО]

Сообщение ВерховныйНоуНейм 14 фев 2020, 21:09

Исправление: (1-ая строчка в корутине)
Синтаксис:
Используется csharp
yield return new WaitForSeconds(Vector2.Distance(b.transform.position, hit.point) / (ShootImpulse * 5));
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6