Скрипт стрельбы (Анимации+Режим отладки) - Форум Игроделов
Вт, 04 Фев 2025, 03:13 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Скрипт стрельбы (Анимации+Режим отладки)
chapaeffДата: Вс, 02 Мар 2014, 16:24 | Сообщение # 1
 
Сообщений: 48
Награды: 0
Репутация: 12
Статус: Offline
Отличный скрипт, кому надо берите

Код

//Скрипт стрельбы от CHapaeFF
//http://vk.com/pixelfox
]var Model : Animation; //модель с анимациями

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 ShootKey : KeyCode; // кнопка стрельбы
var ReloadKey : KeyCode; // кнопка перезарядки

var soundFire : AudioClip;
var soundReload : AudioClip;
var soundEmpty : AudioClip;
var bulletHolePrefab : GameObject;
var bulletHolePrefabWall : GameObject;
var bulletHolePrefabBlood : GameObject;
var bulletHoleMetal : 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;
//var Crosshair : CrossHair;
var DrawTime = 1;

var guiStyle : GUISkin;
var hud : Texture;
var gunName : String;

function Start () {
yield WaitForSeconds(DrawTime);

bulletsLeft = bulletsPerClip;
allBullets = clips*bulletsPerClip;
mainCamera = GameObject.FindWithTag("Main Camera");
sound = gameObject.transform.parent.audio;
muzzleFlash.enabled = false;

}

function Update() {

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

if (Input.GetKeyDown(ReloadKey)){
Reload();
}

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

if (Input.GetKey(ShootKey)){
if (currentMode == fireMode.auto) {
Fire();
}
}
}

}

function Fire () {

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);
}

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

}

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

}

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

}

}

sound.PlayOneShot(soundFire);

Model.animation.Rewind("fire");

Model.animation.CrossFade("fire");

bulletsLeft--;

StartCoroutine(ShowMuzzleFlash());

}

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

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

if (allBullets > bulletsPerClip) {

//Crosshair.EnableCrosshair = false;

reload = true;

sound.PlayOneShot(soundReload);

Model.animation.CrossFade("reload");

yield WaitForSeconds(reloadTime);

allBullets-= bulletsPerClip-bulletsLeft;

bulletsLeft =bulletsPerClip;

reload = false;

//Crosshair.EnableCrosshair = true;

} 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;
}

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


+ в репу если помог cool


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


Сообщение отредактировал chapaeff - Вс, 02 Мар 2014, 16:24
 
СообщениеОтличный скрипт, кому надо берите

Код

//Скрипт стрельбы от CHapaeFF
//http://vk.com/pixelfox
]var Model : Animation; //модель с анимациями

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 ShootKey : KeyCode; // кнопка стрельбы
var ReloadKey : KeyCode; // кнопка перезарядки

var soundFire : AudioClip;
var soundReload : AudioClip;
var soundEmpty : AudioClip;
var bulletHolePrefab : GameObject;
var bulletHolePrefabWall : GameObject;
var bulletHolePrefabBlood : GameObject;
var bulletHoleMetal : 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;
//var Crosshair : CrossHair;
var DrawTime = 1;

var guiStyle : GUISkin;
var hud : Texture;
var gunName : String;

function Start () {
yield WaitForSeconds(DrawTime);

bulletsLeft = bulletsPerClip;
allBullets = clips*bulletsPerClip;
mainCamera = GameObject.FindWithTag("Main Camera");
sound = gameObject.transform.parent.audio;
muzzleFlash.enabled = false;

}

function Update() {

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

if (Input.GetKeyDown(ReloadKey)){
Reload();
}

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

if (Input.GetKey(ShootKey)){
if (currentMode == fireMode.auto) {
Fire();
}
}
}

}

function Fire () {

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);
}

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

}

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

}

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

}

}

sound.PlayOneShot(soundFire);

Model.animation.Rewind("fire");

Model.animation.CrossFade("fire");

bulletsLeft--;

StartCoroutine(ShowMuzzleFlash());

}

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

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

if (allBullets > bulletsPerClip) {

//Crosshair.EnableCrosshair = false;

reload = true;

sound.PlayOneShot(soundReload);

Model.animation.CrossFade("reload");

yield WaitForSeconds(reloadTime);

allBullets-= bulletsPerClip-bulletsLeft;

bulletsLeft =bulletsPerClip;

reload = false;

//Crosshair.EnableCrosshair = true;

} 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;
}

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


+ в репу если помог cool

Автор - chapaeff
Дата добавления - 02 Мар 2014 в 16:24
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2025