Улучшение скрипта оружия

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

Улучшение скрипта оружия

Сообщение Deatrocker 02 авг 2011, 08:28

Всем привет! Дело вот в чем - Я решил (думаю многим это тоже будет полезно) улучшить скрипт MachineGun из fps tutorial, так
как это впринцепе универсальный скрипт и с помощью него можно делать как автоматы так и пистолеы. Улучшить его я
хочуследующим образом:

1) Добавить в скрипт AudioClip'ы
-Звук выстрела [СДЕЛАНО]
-Звук перезарядки [СДЕЛАНО]
-Звук холостого бойка (когда в магазине нет патронов)
-Звук доставания оружия [СДЕЛАНО]

2) Добавить в скрипт Animation'ы
-Покоя (потому что в реале человек не может неподвижно, не шевеля, что либо держать )
-Выстрела
-Перезарядки
-Активации оружия (когда достаем оружие)

Дополнительно/в будущем:
Скрытый текст:
3) Добавить разнос пуль

4) Добавить в скрипт реакцию систем частиц при попадании в различные физические объекты.(искры от металла, щепки от дерева
и тд)

5) Перезарядка по нажатию кнопки R

6) Свет от оружия при выстреле [СДЕЛАНО]

7) Добавить отверстия туда, куда попала пуля


---------------------------------------------------------------------------------------------------------------------------

-------
И так начинаем.


Что необходимо реализовать:

-Расставить куда нужно все команды анимации (4 штуки всего) и сделать чтобы они работали.
-Реализовать нажатие когда магазин пустой, и звук этого
-Перезарядку по нажатию какойнибудь кнопки (по принципу "Fire1") тоесть мы можем установить что это за кнопка (впринцепе
представляю как это можно сделать но мозги уже кипят)


Собственно сам мой код с реализованным:
-3 из 4 звука работают
-Свет от выстрела


Синтаксис:
Используется javascript
var range = 100.0;
var fireRate = 0.05;
var force = 10.0;
var damage = 5.0;
var bulletsPerClip = 40;
var clips = 20;
var reloadTime = 0.5;
private var hitParticles : ParticleEmitter;
var muzzleFlash : Renderer;
private var bulletsLeft : int = 0;
private var nextFireTime = 0.0;
private var m_LastFrameShot = -1;
//Звуки
public var weaponSnd_fire:AudioClip;    //Звук выстрела
public var weaponSnd_reload:AudioClip;  //Звук перезарядки
public var weaponSnd_switch:AudioClip;   //Звук когда достаем оружие
public var weaponSnd_nofire:AudioClip;   //Звук пустого магазина
//Анимация
public var weapon_fire:AnimationClip;   //Анимация выстрела
public var weapon_reload:AnimationClip;   //Анимация перезарядки (!НУЖНО СДЕЛАТЬ СКОРОСТЬ ЭТОЙ АНИМАЦИИ равной Скорости установленной reloadTime в скрипте!)
public var weapon_activate:AnimationClip; //Анимация доставания оружия
//Освещение от выстрела
public var shot_light:Light;


//Начало
function Start () {
        hitParticles = GetComponentInChildren(ParticleEmitter);
       
        // Система частиц появляется только тогда, когда мы во чтото попадаем
        if (hitParticles)
                hitParticles.emit = false;
        bulletsLeft = bulletsPerClip;
}

function LateUpdate() {
        if (muzzleFlash) {
                // Когда мы стреляем, появляется вспышка (muzzleFlash) и пространство освещается (shot_light)
                if (m_LastFrameShot == Time.frameCount) {
                        muzzleFlash.transform.localRotation = Quaternion.AngleAxis(Random.value * 360, Vector3.forward);
                        muzzleFlash.enabled = true; //Вспышка включаем
                        shot_light.enabled=true;//Свет включаем
                } else {
                // We didn't, disable the muzzle flash
                        muzzleFlash.enabled = false; //Вспышка отключаем
                        shot_light.enabled=false; //Свет отключаем
                        enabled = false;
                       
//Это проигрывает звук переключения оружия. Убедитесь что в обьекте на звуке отмечено галочкой PlayOnAwake
                        if (audio)
                        {
                                audio.loop = false;
                        }
                }
        }
}

//Выстрел
function Fire () {

        if (bulletsLeft == 0)
                return;
        // Тут логика выстрела
        if (Time.time - fireRate > nextFireTime)
                nextFireTime = Time.time - Time.deltaTime;
       
        // Пока есть пули и позволяет время
        while( nextFireTime < Time.time && bulletsLeft != 0) {
                FireOneShot();
                animation.Play("weapon_fire");     //АНИМАЦИЯ ВЫСТРЕЛА
                audio.PlayOneShot(weaponSnd_fire); //ЗВУК ВЫСТРЕЛА
                nextFireTime += fireRate;
        }
}

function FireOneShot () {
        var direction = transform.TransformDirection(Vector3.forward);
        var hit : RaycastHit;
       
        // Проверяем - попали ли мы во что либо?
        if (Physics.Raycast (transform.position, direction, hit, range)) {
                // Применяем силу к regidbody в который попали
                if (hit.rigidbody)
                        hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
               
                // Помещаем нашу систему частиц в плоскость в которую мы попали
                // Собственно и спауним эту систему
                if (hitParticles) {
                        hitParticles.transform.position = hit.point;
                        hitParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
                        hitParticles.Emit();
                }

                // Отправляем сообщение о уроне тому в кого попали             
                hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
        }
       
        bulletsLeft--;

        // Регистрируем что мы в этом кадре стреляем
        // вспышка и свет появляются в этом кадре
        m_LastFrameShot = Time.frameCount;
        enabled = true;
       
        // Проверяем количество пуль на равность нулю
        if (bulletsLeft == 0) //если пули равны нулю, то перезаряжаемся
                Reload();
                               
}

//ПЕРЕЗАРЯДКА
function Reload () {
//Если у нас есть обойма для перезарядки то играем анимацию и звук перезарядки
if (clips>0){
animation.Play("weapon_reload"); //АНИМАЦИЯ ПЕРЕЗАРЯДКИ ! НУЖНО СДЕЛАТЬ ЧТОБ ЕЕ СКОРОСТЬ БЫЛА РАВНА reloadTime
audio.PlayOneShot(weaponSnd_reload); //ЗВУК ПЕРЕЗАРЯДКИ
}

        // Ждем установленное время перезарядки и потом добавляем пули
        yield WaitForSeconds(reloadTime); //Ждем это время
       
        // Если обоим больше нуля, значит пополняем запас патронов
        if (clips > 0) {
                clips--;
                bulletsLeft = bulletsPerClip;
        }
}

function GetBulletsLeft () {
        return bulletsLeft;
}


Звук смены оружия это просто звуковой файл который нужно кинуть дочерним к нашему оружию.

И так, друзья кто может реализовать задачи огромная просьба, реализуйте и скиньте код, а то я уже теряю силы =)
Tauren chieftain
Аватара пользователя
Deatrocker
UNITрон
 
Сообщения: 186
Зарегистрирован: 07 июл 2011, 00:04
Откуда: Ростов-на-Дону
  • Сайт

Re: Улучшение скрипта оружия

Сообщение Deatrocker 02 авг 2011, 08:35

Еще бы просто замечательно было реализовать выброс гильз (чтоб обладали физ.свойствами), и публичную переменную которая указывает количество допустимых гильз до того как они начнут удалятся
Tauren chieftain
Аватара пользователя
Deatrocker
UNITрон
 
Сообщения: 186
Зарегистрирован: 07 июл 2011, 00:04
Откуда: Ростов-на-Дону
  • Сайт

Re: Улучшение скрипта оружия

Сообщение Левш@ 02 авг 2011, 11:07

Что необходимо реализовать:

-Расставить куда нужно все команды анимации (4 штуки всего) и сделать чтобы они работали.
-Реализовать нажатие когда магазин пустой, и звук этого
-Перезарядку по нажатию какойнибудь кнопки (по принципу "Fire1") тоесть мы можем установить что это за кнопка (впринцепе
представляю как это можно сделать но мозги уже кипят)


Собственно сам мой код с реализованным:
-3 из 4 звука работают
-Свет от выстрела


http://gamecreatingcommunity.ru/forum/71-2691-1
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт


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

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

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