Скрипт стрельбы (C#) - Форум Игроделов
Пт, 17 Май 2024, 09:20 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » СКРИПТИНГ » Скрипт стрельбы (C#)
Скрипт стрельбы (C#)
chapaeffДата: Вт, 23 Июн 2015, 21:37 | Сообщение # 1
 
Сообщений: 48
Награды: 0
Репутация: 12
Статус: Offline
Переписал свой скрипт стрельбы под c#, вдруг кому пригодится
Код
//-------------------By CHapaeFF------------------------
//---------------zheka20012@yandex.ru-------------------
//---------------Creative Commons CC 0------------------
//-----------------------2015---------------------------

using UnityEngine;
using System.Collections;

[RequireComponent (typeof(AudioSource))]
public class Shoot : MonoBehaviour
{

           public string shootAnimation;
           public string reloadAnimation;
           public float range;
           public float fireRate;
           public float force;
           public int damage;
           public int bulletsPerMag;
           public int magazines;
           public float reloadTime;
           public float accuracy;
           public fireMode currentMode = fireMode.semi;

           public AudioClip soundFire;
           public AudioClip soundReload;
           public AudioClip soundEmpty;
           public GameObject bulletHolePrefab;
           public GameObject bulletHolePrefabWall;
           public GameObject bulletHolePrefabBlood;
           public GameObject bulletHolePrefabMetal;
           public LayerMask layerMask;
           public Renderer muzzleFlash;

           public enum fireMode { none, semi, auto }
           private int bulletsLeft = 0;
           private int allBullets;
           private float nextFireTime = 0.0f;
           private GameObject mainCamera;
           private AudioSource sound;
           private bool reload;
           Animation animation;

           public GUISkin skin;
           public string gunName;

           void Start()
           {

               bulletsLeft = bulletsPerMag;
               allBullets = magazines * bulletsPerMag;
               mainCamera = GameObject.FindWithTag("MainCamera");
               sound = GetComponent<AudioSource>();
               muzzleFlash.enabled = false;
               animation = GetComponentInChildren<Animation>();
           }

           void Update()
           {

               //если не идет перезарядка, то можно стрелять и перезаряжать, иначе нельзя стрелять и перезаряжать пока перезарядка не пройдет.        
               if (reload == false)
               {

                   if (Input.GetKeyDown(KeyCode.R))
                   {
                       Reload();
                   }

                   if (Input.GetMouseButtonDown(0))
                   {
                       if (bulletsLeft > 0)
                       {
                           if (currentMode == fireMode.semi)
                           {
                     Fire();
                           }
                       }
                       else
                       {
                           sound.PlayOneShot(soundEmpty);
                       }
                   }

                   if (Input.GetMouseButton(0))
                   {
                       if (currentMode == fireMode.auto)
                       {
                           Fire();
                       }
                   }
               }

           }

           void Fire()
           {
               if (Time.time - fireRate > nextFireTime)
                   nextFireTime = Time.time - Time.deltaTime;

               while (nextFireTime < Time.time && bulletsLeft != 0)
               {
                   FireOneShot();
                   nextFireTime += fireRate;
               }
           }

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

               Debug.DrawLine(mainCamera.transform.position, direction * range, Color.red); //для отладки        

               // Проверяем попала ли куда-нибудь пуля        
               if (Physics.Raycast(mainCamera.transform.position, direction, out hit, range, layerMask.value))
               {
                   Quaternion rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);

                   // если пуля попадает в физический объект то двигаем его        
                   if (hit.rigidbody)
                       hit.rigidbody.AddForceAtPosition(force * direction, hit.point);

                   // если пуля попала в объект "Untagged" то сделать на нем дырку и приклеить ее к объекту        
                   if (hit.transform.tag == "Untagged")
                   {
                       GameObject bulletHole = Instantiate(bulletHolePrefab, hit.point, rotation) as GameObject;
                       bulletHole.transform.parent = hit.transform;
                       hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
                   }

                   if (hit.transform.tag == "Concrete")
                   {
                       GameObject bulletHoleWall = Instantiate(bulletHolePrefabWall, hit.point, rotation) as GameObject;
                       bulletHoleWall.transform.parent = hit.transform;
                       hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);

                   }

                   if (hit.transform.tag == "Enemy")
                   {
                       GameObject bulletHoleBlood = Instantiate(bulletHolePrefabBlood, hit.point, rotation) as GameObject;
                       bulletHoleBlood.transform.parent = hit.transform;
                       hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);

                   }

                   if (hit.transform.tag == "Metal")
                   {
                       GameObject bulletHoleMetal = Instantiate(bulletHolePrefabMetal, hit.point, rotation) as GameObject;
                       bulletHoleMetal.transform.parent = hit.transform;
                       hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);

                   }

               }

               sound.PlayOneShot(soundFire);

               animation.Rewind(shootAnimation);

               animation.CrossFade(shootAnimation);

               bulletsLeft--;

               StartCoroutine(ShowMuzzleFlash());

           }

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

               if (allBullets > 0 && bulletsLeft != bulletsPerMag)
               {

                   if (allBullets > bulletsPerMag)
                   {

                       reload = true;

                       sound.PlayOneShot(soundReload);

                       animation.CrossFade(reloadAnimation);

                       yield return new WaitForSeconds(reloadTime);

                       allBullets -= bulletsPerMag - bulletsLeft;

                       bulletsLeft = bulletsPerMag;

                       reload = false;

                   }
                   else
                   {

                       reload = true;

                       sound.PlayOneShot(soundReload);

                       yield return new WaitForSeconds(reloadTime);

                       var bullet = Mathf.Clamp(bulletsPerMag, allBullets, bulletsLeft + allBullets);

                       allBullets -= (bullet - bulletsLeft);

                       bulletsLeft = bullet;

                       reload = false;

                   }
               }

           }

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

           void OnGUI()
           {
               GUI.skin = skin;
               GUI.Label(new Rect(Screen.width - 120, Screen.height - 80, 200, 50), "        " + gunName + " : " + bulletsLeft + " / " + allBullets);
           }
}


Создать пустышку, под нее оружие с анимациями, все настроить, потом запускать и играть!


---------------------------------------------------------------------------------------
Throw Exception
(ノಠ益ಠ)ノ彡┻━┻
Catch Exception
┬──┬ ノ( ゜-゜ノ)


Сообщение отредактировал chapaeff - Вт, 23 Июн 2015, 22:56
 
СообщениеПереписал свой скрипт стрельбы под c#, вдруг кому пригодится
Код
//-------------------By CHapaeFF------------------------
//---------------zheka20012@yandex.ru-------------------
//---------------Creative Commons CC 0------------------
//-----------------------2015---------------------------

using UnityEngine;
using System.Collections;

[RequireComponent (typeof(AudioSource))]
public class Shoot : MonoBehaviour
{

           public string shootAnimation;
           public string reloadAnimation;
           public float range;
           public float fireRate;
           public float force;
           public int damage;
           public int bulletsPerMag;
           public int magazines;
           public float reloadTime;
           public float accuracy;
           public fireMode currentMode = fireMode.semi;

           public AudioClip soundFire;
           public AudioClip soundReload;
           public AudioClip soundEmpty;
           public GameObject bulletHolePrefab;
           public GameObject bulletHolePrefabWall;
           public GameObject bulletHolePrefabBlood;
           public GameObject bulletHolePrefabMetal;
           public LayerMask layerMask;
           public Renderer muzzleFlash;

           public enum fireMode { none, semi, auto }
           private int bulletsLeft = 0;
           private int allBullets;
           private float nextFireTime = 0.0f;
           private GameObject mainCamera;
           private AudioSource sound;
           private bool reload;
           Animation animation;

           public GUISkin skin;
           public string gunName;

           void Start()
           {

               bulletsLeft = bulletsPerMag;
               allBullets = magazines * bulletsPerMag;
               mainCamera = GameObject.FindWithTag("MainCamera");
               sound = GetComponent<AudioSource>();
               muzzleFlash.enabled = false;
               animation = GetComponentInChildren<Animation>();
           }

           void Update()
           {

               //если не идет перезарядка, то можно стрелять и перезаряжать, иначе нельзя стрелять и перезаряжать пока перезарядка не пройдет.        
               if (reload == false)
               {

                   if (Input.GetKeyDown(KeyCode.R))
                   {
                       Reload();
                   }

                   if (Input.GetMouseButtonDown(0))
                   {
                       if (bulletsLeft > 0)
                       {
                           if (currentMode == fireMode.semi)
                           {
                     Fire();
                           }
                       }
                       else
                       {
                           sound.PlayOneShot(soundEmpty);
                       }
                   }

                   if (Input.GetMouseButton(0))
                   {
                       if (currentMode == fireMode.auto)
                       {
                           Fire();
                       }
                   }
               }

           }

           void Fire()
           {
               if (Time.time - fireRate > nextFireTime)
                   nextFireTime = Time.time - Time.deltaTime;

               while (nextFireTime < Time.time && bulletsLeft != 0)
               {
                   FireOneShot();
                   nextFireTime += fireRate;
               }
           }

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

               Debug.DrawLine(mainCamera.transform.position, direction * range, Color.red); //для отладки        

               // Проверяем попала ли куда-нибудь пуля        
               if (Physics.Raycast(mainCamera.transform.position, direction, out hit, range, layerMask.value))
               {
                   Quaternion rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);

                   // если пуля попадает в физический объект то двигаем его        
                   if (hit.rigidbody)
                       hit.rigidbody.AddForceAtPosition(force * direction, hit.point);

                   // если пуля попала в объект "Untagged" то сделать на нем дырку и приклеить ее к объекту        
                   if (hit.transform.tag == "Untagged")
                   {
                       GameObject bulletHole = Instantiate(bulletHolePrefab, hit.point, rotation) as GameObject;
                       bulletHole.transform.parent = hit.transform;
                       hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
                   }

                   if (hit.transform.tag == "Concrete")
                   {
                       GameObject bulletHoleWall = Instantiate(bulletHolePrefabWall, hit.point, rotation) as GameObject;
                       bulletHoleWall.transform.parent = hit.transform;
                       hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);

                   }

                   if (hit.transform.tag == "Enemy")
                   {
                       GameObject bulletHoleBlood = Instantiate(bulletHolePrefabBlood, hit.point, rotation) as GameObject;
                       bulletHoleBlood.transform.parent = hit.transform;
                       hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);

                   }

                   if (hit.transform.tag == "Metal")
                   {
                       GameObject bulletHoleMetal = Instantiate(bulletHolePrefabMetal, hit.point, rotation) as GameObject;
                       bulletHoleMetal.transform.parent = hit.transform;
                       hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);

                   }

               }

               sound.PlayOneShot(soundFire);

               animation.Rewind(shootAnimation);

               animation.CrossFade(shootAnimation);

               bulletsLeft--;

               StartCoroutine(ShowMuzzleFlash());

           }

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

               if (allBullets > 0 && bulletsLeft != bulletsPerMag)
               {

                   if (allBullets > bulletsPerMag)
                   {

                       reload = true;

                       sound.PlayOneShot(soundReload);

                       animation.CrossFade(reloadAnimation);

                       yield return new WaitForSeconds(reloadTime);

                       allBullets -= bulletsPerMag - bulletsLeft;

                       bulletsLeft = bulletsPerMag;

                       reload = false;

                   }
                   else
                   {

                       reload = true;

                       sound.PlayOneShot(soundReload);

                       yield return new WaitForSeconds(reloadTime);

                       var bullet = Mathf.Clamp(bulletsPerMag, allBullets, bulletsLeft + allBullets);

                       allBullets -= (bullet - bulletsLeft);

                       bulletsLeft = bullet;

                       reload = false;

                   }
               }

           }

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

           void OnGUI()
           {
               GUI.skin = skin;
               GUI.Label(new Rect(Screen.width - 120, Screen.height - 80, 200, 50), "        " + gunName + " : " + bulletsLeft + " / " + allBullets);
           }
}


Создать пустышку, под нее оружие с анимациями, все настроить, потом запускать и играть!

Автор - chapaeff
Дата добавления - 23 Июн 2015 в 21:37
Форум Игроделов » UNITY3D » СКРИПТИНГ » Скрипт стрельбы (C#)
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024