Hello everyone.
I’m making an FPS game and I recently added the function in the game that allows the player to switch between weapons. But I keep getting one weird problem that I can’t seem to solve… When I switch to the next weapon I disable the current weapon GameObject and I enable the new one, but the problem is that if I switch to the new weapon while the animation is currently playing (e.g. ‘Attack’ animation or ‘Ready’ animation) I get weird position / rotation problems… I thinks it’s a bug in unity, but I’m not sure… I included the gif file of the problem and I also provided the weapon switch script.
Can someone help me with this? Any help is really appreciated! Thank you!
GIF File: Imgur: The magic of the Internet
Script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using PauseSystem;
using GameFunction.Binoculars;
public class WeaponsSwitch : MonoBehaviour
{
public int currentWeapon = 0;
public int maxWeapons = 2;
[SerializeField] private float switchingTime = 1.15f;
[SerializeField]
private string[] WeaponName;
public string currentWeaponName;
[SerializeField]
private Image[] SI;
[SerializeField]
private Color SI_Hover;
[SerializeField]
private Color SI_Default;
[SerializeField]
private GameObject SI_Holder;
public Animator theAni;
public GameObject[] weaponsList;
public GameObject[] weaponsList_Ani;
public AudioClip[] ReadySound;
public AudioSource ReadyAudio;
public Image bulletsIcon;
public Sprite[] Bullets_Icons;
public AudioClip SwitchSound;
public AudioSource SwitchAudio;
public Text BulletsText_left;
public Text BulletsText_current;
public bool isSwitching;
[SerializeField]
private GameObject[] Weapon_list;
public GameObject Weapon_inHand;
private PauseSystem.PauseSystem pauseSystem;
private GameFunction.Binoculars.useBinoculars binoculars;
[SerializeField] private LayerMask weaponsMask;
[SerializeField] private LayerMask nothingMask;
private Camera weaponCam;
void Start ()
{
pauseSystem = GameObject.Find ("GameManager").GetComponent<PauseSystem.PauseSystem> ();
binoculars = GameObject.FindObjectOfType<GameFunction.Binoculars.useBinoculars> ();
weaponCam = GameObject.Find ("WeaponsCamera").GetComponent<Camera> ();
//currentWeapon = 0;
SelectWeapon(currentWeapon);
SI_Holder.SetActive (false);
}
void Update ()
{
if(!GameManager.GameManager.gameManager.cantUseWeapons && !Weapon_inHand.gameObject.GetComponent<Weapon>().isShooting && !isSwitching && !GameManager.GameManager.gameManager.inGameFunction && !weaponsList_Ani [currentWeapon].GetComponent<Weapon>().isReloading)
{
if(Input.GetAxis("Next Weapon") > 0)
{
if(currentWeapon + 1 <= maxWeapons)
{
currentWeapon++;
}
else
{
currentWeapon = 0;
}
SelectWeapon(currentWeapon);
}
else if (Input.GetAxis("Previous Weapon") < 0)
{
if(currentWeapon - 1 >= 0)
{
currentWeapon--;
}
else
{
currentWeapon = maxWeapons;
}
SelectWeapon(currentWeapon);
}
if(currentWeapon == maxWeapons + 1)
{
currentWeapon = 0;
}
if(currentWeapon == -1)
{
currentWeapon = maxWeapons;
}
if(Input.GetKeyDown(KeyCode.Alpha1) && currentWeapon != 0)
{
currentWeapon = 0;
SelectWeapon(currentWeapon);
}
if(Input.GetKeyDown(KeyCode.Alpha2) && currentWeapon != 1)
{
currentWeapon = 1;
SelectWeapon(currentWeapon);
}
if(Input.GetKeyDown(KeyCode.Alpha3) && currentWeapon != 2)
{
currentWeapon = 2;
SelectWeapon(currentWeapon);
}
if(Input.GetKeyDown(KeyCode.Alpha4) && currentWeapon != 3)
{
currentWeapon = 3;
SelectWeapon(currentWeapon);
}
}
}
public void HideWeapon ()
{
weaponCam.cullingMask = nothingMask;
}
public void ShowWeapon ()
{
weaponCam.cullingMask = weaponsMask;
}
public void SelectWeapon (int index)
{
if (Weapon_inHand != null)
{
Weapon_inHand.GetComponent<Animator> ().Rebind ();
StopCoroutine(Weapon_inHand.GetComponent<Weapon> ().waitTillAble ());
Weapon_inHand.GetComponent<Weapon> ().canSwing = true;
}
Weapon_inHand = Weapon_list [index];
if (Weapon_inHand.gameObject.GetComponent<Weapon> ().isShooting) return;
SI_Holder.SetActive (true);
StopAllCoroutines ();
StartCoroutine (switching ());
DisableAll ();
weaponsList [index].SetActive (true);
currentWeaponName = WeaponName [index];
SI [index].color = SI_Hover;
bulletsIcon.sprite = Bullets_Icons [index];
ReadyAudio.clip = ReadySound [index];
ReadyAudio.Play ();
SwitchAudio.clip = SwitchSound;
SwitchAudio.Play ();
theAni = weaponsList_Ani [index].GetComponent<Animator> ();
weaponsList_Ani [index].GetComponent<Weapon> ().isReloading = false;
theAni.CrossFadeInFixedTime ("Ready", 0.01f);
if(currentWeaponName != "Melee")
{
BulletsText_left.text = weaponsList_Ani [index].GetComponent<Weapon> ().bulletsLeft.ToString();
BulletsText_current.text = weaponsList_Ani [index].GetComponent<Weapon> ().currentBullets.ToString();
}
else if(currentWeaponName == "Melee")
{
BulletsText_left.text = "";
BulletsText_current.text = "";
}
// CHECK CURRENT AMMO DATA AND DISPLAY TEXT EFFECTS
textEffects();
modeDisplay ();
}
private void textEffects ()
{
Weapon_inHand.gameObject.GetComponent<Weapon> ().textEffects ();
}
public void DisableAll()
{
foreach (GameObject weapon in weaponsList)
{
weapon.SetActive (false);
}
foreach (Image SelectIcons in SI)
{
SelectIcons.color = SI_Default;
}
}
void modeDisplay ()
{
Weapon_inHand.gameObject.GetComponent<Weapon> ().displayModeInfo ();
}
IEnumerator switching ()
{
//isSwitching = true;
yield return new WaitForSeconds (switchingTime);
//isSwitching = false;
SI_Holder.SetActive (false);
}
}