Почему пуля не летит по направлению оружия?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Почему пуля не летит по направлению оружия?

Сообщение evelyn 20 янв 2018, 17:11

Привет.
Вот скрипт стрельбы -
Синтаксис:
Используется csharp
    public int Ammo;
    public int MaxAmmo;
    public int HaveAmmo;
    public GameObject Bullet;
    public Transform BulletSpawn;
    public float CountdownTime;
    public bool InCountdown;

    void Start()
    {
        Ammo = MaxAmmo;
    }

    void Update()
    {
        if(Ammo > 0 && Input.GetButtonDown("Fire") && !InCountdown)
        {
            Shot();
        }
    }

    void Shot()
    {
        Instantiate(Bullet, BulletSpawn.position, BulletSpawn.rotation);
        Ammo--;
        StartCoroutine(ShotCountdown());
    }

    IEnumerator ShotCountdown()
    {
        InCountdown = true;
        yield return new WaitForSeconds(CountdownTime);
        InCountdown = false;
    }
 

Скрипт пули -
Синтаксис:
Используется csharp
    public float Speed;
    public void FixedUpdate()
    {
        gameObject.GetComponent<Rigidbody>().AddForce(Vector3.forward * Speed);
    }
 

Почему пули летят в одну сторону, а не в направлении игрока?
Вот демонстрация - https://imgur.com/a/oY914
evelyn
UNец
 
Сообщения: 22
Зарегистрирован: 05 дек 2017, 20:38

Re: Почему пуля не летит по направлению оружия?

Сообщение samana 20 янв 2018, 19:23

evelyn писал(а):Почему пули летят в одну сторону, а не в направлении игрока?

Потому что вы их сами пускаете в одну сторону ;) , логическая ошибка вот здесь:
Синтаксис:
Используется csharp
gameObject.GetComponent<Rigidbody>().AddForce(Vector3.forward * Speed);
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Почему пуля не летит по направлению оружия?

Сообщение evelyn 20 янв 2018, 20:05

samana писал(а):
evelyn писал(а):Почему пули летят в одну сторону, а не в направлении игрока?

Потому что вы их сами пускаете в одну сторону ;) , логическая ошибка вот здесь:
Синтаксис:
Используется csharp
gameObject.GetComponent<Rigidbody>().AddForce(Vector3.forward * Speed);

Нужно получить направление спавнпоинта?
evelyn
UNец
 
Сообщения: 22
Зарегистрирован: 05 дек 2017, 20:38

Re: Почему пуля не летит по направлению оружия?

Сообщение samana 20 янв 2018, 21:58

При создании пули, вы поворачиваете её сразу, как вам нужно, вот здесь:
Синтаксис:
Используется csharp
Instantiate(Bullet, BulletSpawn.position, BulletSpawn.rotation);


но летит она уже просто в направлении forward в мировых координатах:
Синтаксис:
Используется csharp
gameObject.GetComponent<Rigidbody>().AddForce(Vector3.forward * Speed);


Вам нужно придавать направление для пули не мировое, а её локальное, то-есть изменить строчку выше на:
Синтаксис:
Используется csharp
gameObject.GetComponent<Rigidbody>().AddForce(transform.forward * Speed);


p.s. компоненты надо кешировать, потому что запись GetComponent каждый кадр производит поиск компонента и это нагружает лишний раз вашу игру. Да и сам transform тоже лучше закешировать.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Почему пуля не летит по направлению оружия?

Сообщение evelyn 20 янв 2018, 23:41

samana писал(а):При создании пули, вы поворачиваете её сразу, как вам нужно, вот здесь:
Синтаксис:
Используется csharp
Instantiate(Bullet, BulletSpawn.position, BulletSpawn.rotation);


но летит она уже просто в направлении forward в мировых координатах:
Синтаксис:
Используется csharp
gameObject.GetComponent<Rigidbody>().AddForce(Vector3.forward * Speed);


Вам нужно придавать направление для пули не мировое, а её локальное, то-есть изменить строчку выше на:
Синтаксис:
Используется csharp
gameObject.GetComponent<Rigidbody>().AddForce(transform.forward * Speed);


p.s. компоненты надо кешировать, потому что запись GetComponent каждый кадр производит поиск компонента и это нагружает лишний раз вашу игру. Да и сам transform тоже лучше закешировать.

Спасибо.
evelyn
UNец
 
Сообщения: 22
Зарегистрирован: 05 дек 2017, 20:38

Re: Почему пуля не летит по направлению оружия?

Сообщение evelyn 21 янв 2018, 14:04

А я правильно делаю разброс?
Синтаксис:
Используется csharp
public void Start()
    {
        RB = gameObject.GetComponent<Rigidbody>();
        Scatter = Random.Range(-Scatter, Scatter);
    }

    public void FixedUpdate()
    {
        RB.AddForce(transform.forward + new Vector3(Scatter, Scatter)  * Speed);
    }
 

А то что-то пули летят с разбросом даже когда Scatter равен нулю.
evelyn
UNец
 
Сообщения: 22
Зарегистрирован: 05 дек 2017, 20:38

Re: Почему пуля не летит по направлению оружия?

Сообщение evelyn 21 янв 2018, 17:54

samana писал(а):При создании пули, вы поворачиваете её сразу, как вам нужно, вот здесь:
Синтаксис:
Используется csharp
Instantiate(Bullet, BulletSpawn.position, BulletSpawn.rotation);


но летит она уже просто в направлении forward в мировых координатах:
Синтаксис:
Используется csharp
gameObject.GetComponent<Rigidbody>().AddForce(Vector3.forward * Speed);


Вам нужно придавать направление для пули не мировое, а её локальное, то-есть изменить строчку выше на:
Синтаксис:
Используется csharp
gameObject.GetComponent<Rigidbody>().AddForce(transform.forward * Speed);


p.s. компоненты надо кешировать, потому что запись GetComponent каждый кадр производит поиск компонента и это нагружает лишний раз вашу игру. Да и сам transform тоже лучше закешировать.

Сделал так -
Синтаксис:
Используется csharp
 void Shot()
    {
        Spread = Random.Range(-Spread, Spread) * 2;

        Instantiate(Bullet, BulletSpawn.position , BulletSpawn.rotation = Quaternion.Euler( new Vector3 (Spread, Spread, 0)));
        Ammo--;
        StartCoroutine(ShotCountdown());
    }
 

В скрипт с оружием добавил разброс, но теперь та же проблема, пули летят в одном направлении, но уже с разбросом...
evelyn
UNец
 
Сообщения: 22
Зарегистрирован: 05 дек 2017, 20:38

Re: Почему пуля не летит по направлению оружия?

Сообщение samana 21 янв 2018, 23:53

Вам достаточно [u]единожды[/u ] повернуть правильно пулю при её создании (обычно "направление взгляда" у объекта считается его ось Z, то-есть его transform.forward), а потом просто двигать эту пулю в этом направлении (transform.forward) и всё.

Правда вы почему-то сначала создаёте пулю с одним разбросом в повороте, а в самом скрипте пули (если я правильно понял) в Start-e заново высчитываете какой-то разброс.. зачем же, если пуля уже создана и была повёрнута.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot] и гости: 35