- Home /
Spawning 2 bullets when I want 1
Hello. When I fire off a bullet in my game, the ammo count goes down by one, meaning there is one trigger. However, in the Debug.Log it shows that there were two simultaneous collisions. The bullets seem to be stacked, so my enemies are taking double damage.
Code for bullet prefab:
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Bullet : MonoBehaviour {
// Start is called before the first frame update
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.name == "Crate")
{
Destroy(gameObject);
}
if (collision.gameObject.name == "Zombie")
{
Destroy(gameObject);
collision.GetComponent<EnemyHealth>().currentHealth = collision.GetComponent<EnemyHealth>().currentHealth - GameObject.Find("Player").GetComponent<PlayerEquipment>().Weapon.GetComponent<Gun>().damage;
Debug.Log(collision.GetComponent<EnemyHealth>().currentHealth);
}
if (collision.gameObject.name == "Midground")
{
Destroy(gameObject);
}
Debug.Log(collision);
}
}
Code for bullet Instantiation:
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Bullet : MonoBehaviour {
// Start is called before the first frame update
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.name == "Crate")
{
Destroy(gameObject);
}
if (collision.gameObject.name == "Zombie")
{
Destroy(gameObject);
collision.GetComponent<EnemyHealth>().currentHealth = collision.GetComponent<EnemyHealth>().currentHealth - GameObject.Find("Player").GetComponent<PlayerEquipment>().Weapon.GetComponent<Gun>().damage;
Debug.Log(collision.GetComponent<EnemyHealth>().currentHealth);
}
if (collision.gameObject.name == "Midground")
{
Destroy(gameObject);
}
Debug.Log(collision);
}
}
Answer by logicandchaos · Jan 23, 2020 at 01:37 AM
You should put Destroy (gameObject); outside the if because you call it regardless of what you hit, and you can also call it with a delay, I do just in case there are still things running, Destroy(gameObject,.25f); anyways that won't affect anything it's probably the instantiation code that is the issue, or the button click, but you posted the wrong code there :P you got the same code twice :P you should look into object pooling for your bullets, it's really easy in unity. You make a List bullets; then in your bullet code you put OnEnable(){ bullets.Remove(gameObject);} and OnDisable(){ bullets.Add(gameObject);} then instead of instantiating a new bullet you just get the bullet at bullets[0].
Answer by MaksimumYT · Jan 23, 2020 at 04:41 AM
using UnityEngine;
public class Gun : MonoBehaviour { public Transform firePoint; public GameObject bulletPrefab; public float bulletForce; public float fireRate; public int damage; public int maxAmmo;
private float nextFire;
private int ammo;
// Start is called before the first frame update
void Start()
{
ammo = maxAmmo;
firePoint = GameObject.Find("Firepoint").GetComponent<Transform>();
}
// Update is called once per frame
void Update()
{
if (Input.GetButton("Fire1") && Time.time > nextFire && fireRate > 0 && ammo > 0)
{
//I added "&& fireRate > 0", because if not, this will run if the user decides
//to hold the button, as "GetButtonDown" only returns true the frame the button
//is pressed, and while its hold, is false, so the "else" will run, and so will this.
//If you have ammo
nextFire = Time.time + fireRate;
Shoot();
ammo--; //Explained by itself
Debug.Log(ammo + " bullets remaining.");
}
if (Input.GetKeyDown("r") && ammo != maxAmmo)
{
ammo = maxAmmo;
Debug.Log("Reloading...");
}
}
void Shoot()
{
GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
rb.AddForce(firePoint.up * bulletForce, ForceMode2D.Impulse);
}
}
Edit: Other script, pasted other twice