Страница 1 из 1

Скорость выстрела

СообщениеДобавлено: 17 апр 2013, 22:21
slavut-17
Мне нужно чтобы если нажата кнопка ЛКМ, тогда пули вылетали не подряд, а через несколько секунд, ато при одном удержании они по 10 шт вылетают
Вот сам скрипт

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Weapon1 : MonoBehaviour {

public Transform bullet; //Префаб патрона
public int BulletForce = 5000; //Скорость патрона
public int CurAmmoCount = 10; //Текущее кол-во патронов
public AudioClip Fire; //Аудиоклип воспроизводящийся во время стрельбы
public AudioClip Reload; //Аудиоклип воспроизводящийся во время перезарядки
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update ()
{
if(Input.GetMouseButtonDown(0)) //Если нажата ЛКМ и кол-во патронов больше 0
{
Transform BulletInstance = (Transform) Instantiate(bullet, GameObject.Find("BulletSpawnPoint").transform.position, Quaternion.identity); //Генерится префаб патрона в координатах объекта "BulletSpawnPoint"
BulletInstance.rigidbody.AddForce(transform.forward * BulletForce); //Сгенерированый патрон отправляется вперед со скоростью "BulletForce"
CurAmmoCount = CurAmmoCount - 1; //-1 патрон
audio.PlayOneShot(Fire); //проигрываем звук выстрела
}
        }}

Re: Скорость выстрела

СообщениеДобавлено: 17 апр 2013, 22:32
Tolking
Заведи переменную где засекай время от последнего выстрела. Если времени достаточно прошло, следующий выстрел производи.

Re: Скорость выстрела

СообщениеДобавлено: 17 апр 2013, 23:56
johnquincy
Механизмы реализации подобных вещей интересно смотреть в исходниках других игр, будь то half-life или doom.

Re: Скорость выстрела

СообщениеДобавлено: 18 апр 2013, 08:44
Diab10
johnquincy писал(а):Механизмы реализации подобных вещей интересно смотреть в исходниках других игр, будь то half-life или doom.


Да что там смотреть то? Проверяем сколько времени прошло с последнего выстрела, и стреляем дальше

Re: Скорость выстрела

СообщениеДобавлено: 18 апр 2013, 08:53
nile
Тема избитая

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Fire : MonoBehaviour {
        float t =0F; //таймер
       
        // Update is called once per frame
        void Update () {

                if(Input.GetButton("Fire1"))
                        {
                       
                                if(t==0)fire();  //если таймер на 0, делаем выстрел
                       
                                t+=Time.deltaTime; //запускаем таймер
                                if (t>0.1F)  //если больше 0.1 секунды
                                        {
                                                t=0;     //обнуляем, и как следствие, делаем выстрел
                                        }
                        }
                else t=0;  //при прекращении огня обнуляем таймер, но выстрела не следует, тк не нажата кнопка стрельбы
        }
        void fire()
                        {
                                //обработчик единичного выстрела
                                //логика + анимацмя + звук
                        }
}

 




На счет этого:
BulletInstance.rigidbody.AddForce(transform.forward * BulletForce);

Во первых, если уж на то пошло, BulletInstance.rigidbody.AddForce(transform.forward * BulletForce , ForceMode.Impulse );

Во вторых, физика коллизий по размеру и скорости сравнимых с пулей, не успевает обрабатываться должным образом, при попадании в цели.
Так что в играх часто это просчитывается чистой геометрией + спецэффекты. Понятное дело через RayCast. Если есть баллистика - то для луча у raycast делается поправка по вертикали.

Re: Скорость выстрела

СообщениеДобавлено: 18 апр 2013, 14:21
UNLOCKALL
nile писал(а):Тема избитая

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Fire : MonoBehaviour {
        float t =0F; //таймер
       
        // Update is called once per frame
        void Update () {

                if(Input.GetButton("Fire1"))
                        {
                       
                                if(t==0)fire();  //если таймер на 0, делаем выстрел
                       
                                t+=Time.deltaTime; //запускаем таймер
                                if (t>0.1F)  //если больше 0.1 секунды
                                        {
                                                t=0;     //обнуляем, и как следствие, делаем выстрел
                                        }
                        }
                else t=0;  //при прекращении огня обнуляем тайме
        }
        void fire()
                        {
                                //обработчик единичного выстрела
                                //логика + анимацмя + звук
                        }
}

 




На счет этого:
BulletInstance.rigidbody.AddForce(transform.forward * BulletForce);

Во первых, если уж на то пошло, BulletInstance.rigidbody.AddForce(transform.forward * BulletForce , ForceMode.Impulse );

Во вторых, физика коллизий по размеру и скорости сравнимых с пулей, не успевает обрабатываться.
Так что в играх это просчитывается чистой геометрией + спецэффекты. Понятное дело через RayCast. Если есть баллистика - то для луча у raycast делается поправка по вертикали.

Можно и пулю респить, просто потом пускать луч от предыдущей позиции пули к текущей, а на пуле уже просчитывать перемещение, балистику и т.д. Да и такой скрипт будет более универсальным.

Re: Скорость выстрела

СообщениеДобавлено: 18 апр 2013, 15:06
nile
Можно и пулю респить, просто потом пускать луч от предыдущей позиции пули к текущей, а на пуле уже просчитывать перемещение, балистику и т.д. Да и такой скрипт будет более универсальным.


Кажется примерно понял, у меня тоже были такие мысли. Надо просто попробовать и то и другое, и сделать вывод, какой результат лучше подходит для конкретной задачи.

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

Re: Скорость выстрела

СообщениеДобавлено: 19 апр 2013, 11:55
johnquincy
Diab10 писал(а):Да что там смотреть то?

На все то, из-за чего возникают подобные темы.