Question by
coolalan2016 · Mar 19, 2020 at 07:50 AM ·
prefabsweaponrespawnammo
I created a script what controls ammo, but after my player dies and respawns, the pistol refuses to reload the ammo when it reaches zero
As the title suggests, in my weapon script, I created an ammo system. Whenever ammo reaches 0, it will start reloading. The code is working completely fine, until the player dies and the game manager spawns the player's prefab. The game refuses to reload the pistol after it reaches zero, and I made sure that I hit apply already on my player prefab. Here is the code of my weapon and game manager. Weapon script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Weapon : MonoBehaviour
{
public float fireRate = 0; //the fire rate of the weapon
public int Damage = 10; //damage of the weapon
public LayerMask whatToHit; //to tell the weapon to not hit what
public Transform BulletTrailPrefab; //referencing the bullet trail
public Transform MuzzleFlashPrefab; //referencing muzzle flash
public Transform HitPrefab; //referencing the particle created when hit
float timeToSpawnEffect = 0;
public float effectSpawnRate = 10;
float timeToFire = 0;
Transform firePoint;
//handle camera shaking
public float camShakeAmt = 0.05f;
public float camShakeLength = 0.1f;
CameraShake camShake;
private static int AmmoAmount = 150;
private static int Ammo;
public static int Ammo_
{
get { return Ammo; }
}
public GameObject ReloadingUI;
void Awake()
{
firePoint = transform.Find ("FirePoint");
if (firePoint == null)
{
Debug.LogError("No firepoint? WHAT!");
}
}
void Start()
{
camShake = GameMaster.gm.GetComponent<CameraShake>();
if (camShake == null)
Debug.LogError("No CameraShake script found on GM object");
Ammo = AmmoAmount;
}
// Update is called once per frame
void Update()
{
if (fireRate == 0) //single burst gun
{
if (Input.GetButtonDown("Fire1"))
{
if (Ammo > 0)
{
Shoot();
Ammo = Ammo - 1;
if (Ammo <= 0)
{
ReloadingUI.SetActive(true);
Invoke("Reload", 2f);
}
}
}
}
else
{
if (Input.GetButton("Fire1") && Time.time > timeToFire)
{
if (Ammo > 0)
{
timeToFire = Time.time + 1 / fireRate;
Shoot();
Ammo = Ammo - 1;
if (Ammo <= 0)
{
ReloadingUI.SetActive(true);
Invoke("Reload", 3.5f);
}
}
}
}
}
void Shoot()
{
Vector2 mousePosition = new Vector2(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y);
Vector2 firePointPosition = new Vector2(firePoint.position.x, firePoint.position.y);
RaycastHit2D hit = Physics2D.Raycast(firePointPosition, mousePosition - firePointPosition, 100, whatToHit);
Debug.DrawLine(firePointPosition, (mousePosition - firePointPosition) * 100, Color.cyan);
if (hit.collider != null) //if we hit something, turn the raycast into a different colour
{
Debug.DrawLine(firePointPosition, hit.point, Color.red);
Enemy enemy = hit.collider.GetComponent<Enemy>();
if (enemy != null)
{
enemy.DamageEnemy(Damage);
}
}
if (Time.time >= timeToSpawnEffect)
{
Vector3 hitPos;
Vector3 hitNormal;
if (hit.collider == null)
{
hitPos = (mousePosition - firePointPosition) * 30;
hitNormal = new Vector3(9999, 9999, 9999);
}
else
{
hitPos = hit.point;
hitNormal = hit.normal;
}
Effect(hitPos, hitNormal);
timeToSpawnEffect = Time.time + 1 / effectSpawnRate;
}
}
void Effect(Vector3 hitPos, Vector3 hitNormal)
{
Transform trail = Instantiate(BulletTrailPrefab, firePoint.position, firePoint.rotation) as Transform;
//referencing line renderer
LineRenderer lr = trail.GetComponent<LineRenderer>();
if (lr != null)
{
//SET POSITIONS
lr.SetPosition(0, firePoint.position);
lr.SetPosition(1, hitPos);
}
Destroy(trail.gameObject, 0.02f);
if (hitNormal != new Vector3(9999, 9999, 9999))
{
Transform hitParticle = Instantiate(HitPrefab, hitPos, Quaternion.FromToRotation(Vector3.forward, hitNormal)) as Transform;
Destroy(hitParticle.gameObject, 1f);
}
Transform clone = Instantiate(MuzzleFlashPrefab, firePoint.position, firePoint.rotation) as Transform;
clone.parent = firePoint;
float size = Random.Range(0.6f, 0.9f);
clone.localScale = new Vector3(size, size, size);
Destroy(clone.gameObject, 0.02f);
camShake.Shake(camShakeAmt, camShakeLength);
}
void Reload()
{
Ammo = AmmoAmount;
ReloadingUI.SetActive(false);
}
}
And this is my game manager:
using UnityEngine;
using System.Collections;
public class GameMaster : MonoBehaviour
{
public static GameMaster gm;
[SerializeField] private int maxLives = 3;
private static int _remainingLives;
public static int RemainingLives
{
get { return _remainingLives; }
}
void Awake()
{
if (gm == null)
{
gm = GameObject.FindGameObjectWithTag("GM").GetComponent<GameMaster>();
cameraShake = GameMaster.gm.GetComponent<CameraShake>();
}
}
void Start()
{
_remainingLives = maxLives;
}
public Transform playerPrefab;
public Transform spawnPoint;
public float spawnDelay = 2;
public Transform spawnPrefab;
public Transform enemyDeathParticles;
public CameraShake cameraShake;
[SerializeField] private GameObject gameOverUI;
public float shakeAmt = 0.1f;
public float shakeLength = 0.1f;
public IEnumerator RespawnPlayer()
{
GetComponent<AudioSource>().Play();
yield return new WaitForSeconds(spawnDelay);
Instantiate(playerPrefab, spawnPoint.position, spawnPoint.rotation);
Transform clone = Instantiate(spawnPrefab, spawnPoint.position, spawnPoint.rotation) as Transform;
Destroy(clone, 3f);
}
public static void KillPlayer(Player player)
{
Destroy(player.gameObject);
_remainingLives -= 1;
if (_remainingLives <= 0)
{
gm.EndGame();
}
else
{
gm.StartCoroutine(gm.RespawnPlayer());
}
}
public void EndGame()
{
Debug.Log("Endgame");
gameOverUI.SetActive(true);
}
public static void KillEnemy(Enemy enemy)
{
gm._KillEnemy(enemy);
}
public void _KillEnemy(Enemy _enemy)
{
Destroy(_enemy.gameObject);
cameraShake.Shake(shakeAmt, shakeLength);
GameObject _clone = Instantiate(_enemy.deathParticles.gameObject, _enemy.transform.position, Quaternion.identity) as GameObject;
Destroy(_clone.gameObject, 5f);
}
}
Comment
Your answer
Follow this Question
Related Questions
Destroy a spawning enemy prefab with an weapon prefab 0 Answers
destroying a collected coin 2 Answers
Problem with my Weapon Recharge script 0 Answers
Change only prefab to change all objects 0 Answers
How do I instantiate UI prefabs 0 Answers