Не проигрывается анимация перезарядки
Добавлено: 18 ноя 2018, 09:30
Создал скрипт на систему стрельбы из оружия и в нем же написал код на перезарядку. Вот фрагмент:
На пистолете например всё работает отлично, то есть если текущее кол-во патронов в магазине = 0, то проигрывается анимация перезарядки. Но почему-то в случае с автоматом и дробовиком если я нахожусь в состоянии стрельбы, левая кнопка мыши нажата, и при этом кончаются патроны в магазине, то анимация не проигрывается. И что самое обидное, она проигрывается если вы медленно отстрелите все патроны.
Возможно дело в том, что в аниматоре на автомат и дробовик добавлена анимация стрельбы(bool Shooting), но я написал, что при перезарядке она будет равна false и всё равно такая же история!
Чтобы было понятнее, вот целый скрипт:
Синтаксис:
Используется csharp
if (Input.GetKeyDown(KeyCode.R) || CurAmmo == 0 & AmmoCount != 0 & controller.OnAim == true )
{
GetComponent<AudioSource>().PlayOneShot(Reload);
ReloadTimer = ReloadSpeed;
AmmoCount -= Ammo;
CurAmmo = Ammo;
if (AmmoCount < 0) AmmoCount = 0;
{
if (ShootTimer > 0)
{
ShootTimer -= Time.deltaTime;
}
}
Personazh.GetComponent<Animator>().SetBool("Shooting", false);
if (orsenal.Gun.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("GunReload", true);
}
else if (orsenal.M4A4.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("Shoot", true);
}
else if (orsenal.Shotgun.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("ReloadShot", true);
}
}
else
{
Personazh.GetComponent<Animator>().SetBool("GunReload", false);
Personazh.GetComponent<Animator>().SetBool("Shoot", false);
Personazh.GetComponent<Animator>().SetBool("ReloadShot", false);
}
{
GetComponent<AudioSource>().PlayOneShot(Reload);
ReloadTimer = ReloadSpeed;
AmmoCount -= Ammo;
CurAmmo = Ammo;
if (AmmoCount < 0) AmmoCount = 0;
{
if (ShootTimer > 0)
{
ShootTimer -= Time.deltaTime;
}
}
Personazh.GetComponent<Animator>().SetBool("Shooting", false);
if (orsenal.Gun.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("GunReload", true);
}
else if (orsenal.M4A4.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("Shoot", true);
}
else if (orsenal.Shotgun.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("ReloadShot", true);
}
}
else
{
Personazh.GetComponent<Animator>().SetBool("GunReload", false);
Personazh.GetComponent<Animator>().SetBool("Shoot", false);
Personazh.GetComponent<Animator>().SetBool("ReloadShot", false);
}
На пистолете например всё работает отлично, то есть если текущее кол-во патронов в магазине = 0, то проигрывается анимация перезарядки. Но почему-то в случае с автоматом и дробовиком если я нахожусь в состоянии стрельбы, левая кнопка мыши нажата, и при этом кончаются патроны в магазине, то анимация не проигрывается. И что самое обидное, она проигрывается если вы медленно отстрелите все патроны.
Возможно дело в том, что в аниматоре на автомат и дробовик добавлена анимация стрельбы(bool Shooting), но я написал, что при перезарядке она будет равна false и всё равно такая же история!
Чтобы было понятнее, вот целый скрипт:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AK : MonoBehaviour {
GameObject ment;
public ParticleSystem flash;
public Transform pistol;
public Text Text_ak;
public Image crosshair;
public AudioClip NullAmmo;
public AudioClip Reload;
public Animator_controller controller;
public GameObject metalHit;
public GameObject sandHit;
public GameObject stoneHit;
public GameObject[] meatHit;
public GameObject woodHit;
public GameObject Personazh;
public MyOrsenal orsenal;
public float ReloadTimer = 0.0f;
public float ShootTimer = 0.0f;
public float ShootSpeed;
public float ReloadSpeed;
public int AmmoCount = 420;
public int CurAmmo = 30;
public int Ammo = 30;
void Start ()
{
ment = GameObject.FindGameObjectWithTag("Police");
}
void Update ()
{
Ray ray1 = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0f));
RaycastHit hit1;
if (Physics.Raycast(ray1, out hit1))
{
if(hit1.transform.gameObject.tag == "Police")
{
crosshair.color = new Color(1, 0, 0, 1);
}
else
{
crosshair.color = new Color(1, 1, 1, 1);
}
}
Text_ak.text = CurAmmo + "/" + AmmoCount;
if (Input.GetMouseButton(0) & CurAmmo > 0 & ReloadTimer <= 0 & ShootTimer <= 0 & controller.OnAim == true)
{
CurAmmo = CurAmmo - 1;
GetComponent<AudioSource>().PlayOneShot(NullAmmo);
flash.Play();
ShootTimer = ShootSpeed;
Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0f));
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
string Materialname = hit.collider.sharedMaterial.name;
switch(Materialname)
{
case "Metal":
SpawnDecal(hit, metalHit);
break;
case "Sand":
SpawnDecal(hit, sandHit);
break;
case "Stone":
SpawnDecal(hit, stoneHit);
break;
case "Wood":
SpawnDecal(hit, woodHit);
break;
case "Meat":
SpawnDecal(hit, meatHit[Random.Range(0, meatHit.Length)]);
break;
}
Personazh.GetComponent<Animator>().SetBool("Shooting", true);
Ment ment = hit.collider.GetComponent<Ment>();
if (ment != null)
{
ment.HealthPolice -= 10;
}
Rigidbody r = hit.transform.gameObject.GetComponent<Rigidbody>();
if (r != null)
{
r.AddForceAtPosition(-hit.normal * 100f, hit.point);
}
}
}
else
{
Personazh.GetComponent<Animator>().SetBool("Shooting", false);
}
if (ShootTimer > 0)
{
ShootTimer -= Time.deltaTime;
}
if (Input.GetKeyDown(KeyCode.R) || CurAmmo == 0 & AmmoCount != 0 & controller.OnAim == true )
{
GetComponent<AudioSource>().PlayOneShot(Reload);
ReloadTimer = ReloadSpeed;
AmmoCount -= Ammo;
CurAmmo = Ammo;
if (AmmoCount < 0) AmmoCount = 0;
{
if (ShootTimer > 0)
{
ShootTimer -= Time.deltaTime;
}
}
Personazh.GetComponent<Animator>().SetBool("Shooting", false);
if (orsenal.Gun.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("GunReload", true);
}
else if (orsenal.M4A4.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("Shoot", true);
}
else if (orsenal.Shotgun.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("ReloadShot", true);
}
}
else
{
Personazh.GetComponent<Animator>().SetBool("GunReload", false);
Personazh.GetComponent<Animator>().SetBool("Shoot", false);
Personazh.GetComponent<Animator>().SetBool("ReloadShot", false);
}
if (ReloadTimer > 0)
{
ReloadTimer -= Time.deltaTime;
}
}
public void SpawnDecal(RaycastHit hit, GameObject decal)
{
GameObject spawnDecal = GameObject.Instantiate(decal, hit.point, Quaternion.LookRotation(hit.normal));
spawnDecal.transform.SetParent(hit.collider.transform);
Destroy(spawnDecal.gameObject, 30f);
}
}
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AK : MonoBehaviour {
GameObject ment;
public ParticleSystem flash;
public Transform pistol;
public Text Text_ak;
public Image crosshair;
public AudioClip NullAmmo;
public AudioClip Reload;
public Animator_controller controller;
public GameObject metalHit;
public GameObject sandHit;
public GameObject stoneHit;
public GameObject[] meatHit;
public GameObject woodHit;
public GameObject Personazh;
public MyOrsenal orsenal;
public float ReloadTimer = 0.0f;
public float ShootTimer = 0.0f;
public float ShootSpeed;
public float ReloadSpeed;
public int AmmoCount = 420;
public int CurAmmo = 30;
public int Ammo = 30;
void Start ()
{
ment = GameObject.FindGameObjectWithTag("Police");
}
void Update ()
{
Ray ray1 = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0f));
RaycastHit hit1;
if (Physics.Raycast(ray1, out hit1))
{
if(hit1.transform.gameObject.tag == "Police")
{
crosshair.color = new Color(1, 0, 0, 1);
}
else
{
crosshair.color = new Color(1, 1, 1, 1);
}
}
Text_ak.text = CurAmmo + "/" + AmmoCount;
if (Input.GetMouseButton(0) & CurAmmo > 0 & ReloadTimer <= 0 & ShootTimer <= 0 & controller.OnAim == true)
{
CurAmmo = CurAmmo - 1;
GetComponent<AudioSource>().PlayOneShot(NullAmmo);
flash.Play();
ShootTimer = ShootSpeed;
Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0f));
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
string Materialname = hit.collider.sharedMaterial.name;
switch(Materialname)
{
case "Metal":
SpawnDecal(hit, metalHit);
break;
case "Sand":
SpawnDecal(hit, sandHit);
break;
case "Stone":
SpawnDecal(hit, stoneHit);
break;
case "Wood":
SpawnDecal(hit, woodHit);
break;
case "Meat":
SpawnDecal(hit, meatHit[Random.Range(0, meatHit.Length)]);
break;
}
Personazh.GetComponent<Animator>().SetBool("Shooting", true);
Ment ment = hit.collider.GetComponent<Ment>();
if (ment != null)
{
ment.HealthPolice -= 10;
}
Rigidbody r = hit.transform.gameObject.GetComponent<Rigidbody>();
if (r != null)
{
r.AddForceAtPosition(-hit.normal * 100f, hit.point);
}
}
}
else
{
Personazh.GetComponent<Animator>().SetBool("Shooting", false);
}
if (ShootTimer > 0)
{
ShootTimer -= Time.deltaTime;
}
if (Input.GetKeyDown(KeyCode.R) || CurAmmo == 0 & AmmoCount != 0 & controller.OnAim == true )
{
GetComponent<AudioSource>().PlayOneShot(Reload);
ReloadTimer = ReloadSpeed;
AmmoCount -= Ammo;
CurAmmo = Ammo;
if (AmmoCount < 0) AmmoCount = 0;
{
if (ShootTimer > 0)
{
ShootTimer -= Time.deltaTime;
}
}
Personazh.GetComponent<Animator>().SetBool("Shooting", false);
if (orsenal.Gun.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("GunReload", true);
}
else if (orsenal.M4A4.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("Shoot", true);
}
else if (orsenal.Shotgun.activeSelf)
{
Personazh.GetComponent<Animator>().SetBool("ReloadShot", true);
}
}
else
{
Personazh.GetComponent<Animator>().SetBool("GunReload", false);
Personazh.GetComponent<Animator>().SetBool("Shoot", false);
Personazh.GetComponent<Animator>().SetBool("ReloadShot", false);
}
if (ReloadTimer > 0)
{
ReloadTimer -= Time.deltaTime;
}
}
public void SpawnDecal(RaycastHit hit, GameObject decal)
{
GameObject spawnDecal = GameObject.Instantiate(decal, hit.point, Quaternion.LookRotation(hit.normal));
spawnDecal.transform.SetParent(hit.collider.transform);
Destroy(spawnDecal.gameObject, 30f);
}
}