как это впринцепе универсальный скрипт и с помощью него можно делать как автоматы так и пистолеы. Улучшить его я
хочуследующим образом:
1) Добавить в скрипт AudioClip'ы
-Звук выстрела [СДЕЛАНО]
-Звук перезарядки [СДЕЛАНО]
-Звук холостого бойка (когда в магазине нет патронов)
-Звук доставания оружия [СДЕЛАНО]
2) Добавить в скрипт Animation'ы
-Покоя (потому что в реале человек не может неподвижно, не шевеля, что либо держать )
-Выстрела
-Перезарядки
-Активации оружия (когда достаем оружие)
Дополнительно/в будущем:
Скрытый текст:
---------------------------------------------------------------------------------------------------------------------------
-------
И так начинаем.
Что необходимо реализовать:
-Расставить куда нужно все команды анимации (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;
}
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;
}
Звук смены оружия это просто звуковой файл который нужно кинуть дочерним к нашему оружию.
И так, друзья кто может реализовать задачи огромная просьба, реализуйте и скиньте код, а то я уже теряю силы =)