боеприпасы для FPS

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

боеприпасы для FPS

Сообщение Dragon-FAST 16 авг 2016, 13:51

Здравствуйте! Нужна помощь с созданием скрипта на пополнение боезопаса в тот момент когда я дотрагиваюсь до префаба, а также чтобы этот префаб исчезал после этого и снова появлялся через определённое время.

если будет полезен для ответа, вот мой скрипт стрельбы:
Синтаксис:
Используется javascript
var range = 100.0;
var fireRate = 0.05;
var force = 100.0;
var damage = 5.0;
var bulletsPerClip = 17;
var clips = 2;
var reloadTime = 0.7;
var accuracy = 1;
var currentMode = fireMode.semi;

var soundFire : AudioClip;
var soundReload : AudioClip;
var soundEmpty : AudioClip;
var bulletHolePrefab : GameObject;
var layerMask : LayerMask;
var muzzleFlash : Renderer;


enum fireMode { none, semi, auto}
private var bulletsLeft : int = 0;
private var allBullets;
private var nextFireTime = 0.0;
private var mainCamera;
private var sound : AudioSource;
private var reload : boolean;

function Start () {
        bulletsLeft = bulletsPerClip;
        allBullets = clips*bulletsPerClip;
        mainCamera = GameObject.FindWithTag("MainCamera");
        sound = gameObject.transform.parent.GetComponent.<AudioSource>();
}

function Update() {

//если не идет перезарядка, то можно стрелять и перезаряжать, иначе нельзя стрелять и перезаряжать пока перезарядка не пройдет.
        if (reload==false) {
       
                if (Input.GetKeyDown("r")){
                        Reload();
                }
               
                if (Input.GetButtonDown("Fire1")){
                        if (bulletsLeft >0) {
                                if (currentMode == fireMode.semi) {
                                        Fire();
                                }
                        } else {
                        sound.PlayOneShot(soundEmpty);
                        }
                }
       
                if (Input.GetButton("Fire1")){
                        if (currentMode == fireMode.auto) {
                                Fire();
                        }
                }
        }

print(Mathf.Ceil(parseFloat(allBullets)/parseFloat(bulletsPerClip)) +"/"+ bulletsLeft);

}


function Fire () {
       
        // If there is more than one bullet between the last and this frame
        // Reset the nextFireTime
        if (Time.time - fireRate > nextFireTime)
                nextFireTime = Time.time - Time.deltaTime;
       
        // Keep firing until we used up the fire time
        while( nextFireTime < Time.time && bulletsLeft != 0) {
                FireOneShot();
                nextFireTime += fireRate;
        }
}

function FireOneShot () {
        //var direction = transform.TransformDirection(Vector3.forward);
        var direction = transform.TransformDirection(Vector3(Random.Range(-0.01, 0.01) * accuracy, Random.Range(-0.01, 0.01) * accuracy,1));
        var hit : RaycastHit;

        //Debug.DrawLine(mainCamera.transform.position,direction*range,Color.red); //для отладки
       
       
        // Проверяем попала ли РєСѓРґР°-РЅРёР±СѓРґСЊ пуля
        if (Physics.Raycast (mainCamera.transform.position, direction, hit, range,layerMask.value)) {
                var rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
               
                // если пуля попадает РІ физический объект то двигаем его
                if (hit.rigidbody)
                        hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
                       

                // если пуля попала РІ объект "Untagged" то сделать РЅР° нем дырку Рё приклеить ее Рє объекту
                if (hit.transform.tag == "Untagged") {
                        var bulletHole : GameObject = Instantiate (bulletHolePrefab, hit.point, rotation);
                        bulletHole.transform.parent = hit.transform;
                        hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
                }      
                       
        }
       
        sound.PlayOneShot(soundFire);
       
        bulletsLeft--;
       
        StartCoroutine(ShowMuzzleFlash());
               
}

// перезарядка
function Reload () {

                if (allBullets >0 && bulletsLeft != bulletsPerClip) {
               
                        if (allBullets > bulletsPerClip) {
                       
                                reload = true;
                       
                                sound.PlayOneShot(soundReload);

                                yield WaitForSeconds(reloadTime);
                               
                                allBullets-= bulletsPerClip-bulletsLeft;
                               
                                bulletsLeft =bulletsPerClip;
                               
                                reload = false;
                               
                        } else {
                       
                                reload = true;
                       
                                sound.PlayOneShot(soundReload);

                                yield WaitForSeconds(reloadTime);
                       
                                var bullet = Mathf.Clamp(bulletsPerClip,allBullets,bulletsLeft+allBullets);
                       
                                allBullets -= (bullet-bulletsLeft);
                       
                                bulletsLeft = bullet;
                               
                                reload = false;
                       
                        }
                }

        }
       
// показать вспышку от выстрела
function ShowMuzzleFlash () {
        muzzleFlash.transform.localRotation *= Quaternion.Euler(0, 0, Random.Range(-360, 360));
        //muzzleFlash.transform.localRotation = Quaternion.AngleAxis(Random.value * 360, Vector3.forward);
        muzzleFlash.enabled = true;
        yield WaitForSeconds(0.05f);
        muzzleFlash.enabled = false;
}

 

буду очень благодарен за помощь!!!
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29

Re: боеприпасы для FPS

Сообщение samana 16 авг 2016, 16:59

Создайте пустой геймОбжект с каким нибудь коллайдером-триггером. Положите в этот геймОбжект префаб патрона. Получился патрон в контейнере. У контейнера создайте скрипт, который имеет ссылку на этот патрон внутри себя, и так же умеет просто делать именно этот патрон видимым и невидимым (setActive(true/false)). Так же добавьте у контейнера метод на вхождения в триггер, где проверяйте кто вошел в него и если это ваш персонаж и патрон видимый, то просто увеличивайте у персонажа кол-во патронов и тут же делайте патрон невидимым. Затем включайте таймер на нужное время, через которое снова делайте патрон видимым.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: боеприпасы для FPS

Сообщение Dragon-FAST 16 авг 2016, 23:53

samana писал(а):Создайте пустой геймОбжект с каким нибудь коллайдером-триггером. Положите в этот геймОбжект префаб патрона. Получился патрон в контейнере. У контейнера создайте скрипт, который имеет ссылку на этот патрон внутри себя, и так же умеет просто делать именно этот патрон видимым и невидимым (setActive(true/false)). Так же добавьте у контейнера метод на вхождения в триггер, где проверяйте кто вошел в него и если это ваш персонаж и патрон видимый, то просто увеличивайте у персонажа кол-во патронов и тут же делайте патрон невидимым. Затем включайте таймер на нужное время, через которое снова делайте патрон видимым.

Спасибо большое!!!
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29


Вернуться в Editor

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

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