Hi everyone, im new to Unity and encounter some problems with my HealthCollision script.
In my game, I have a Boss spawning bullets in a fan shape towards player that has 5 hearts. When a bullet collider hits player’s collider, player’s hearts will decrease by 1.
The HealthCollision script works perfectly fine when player gets hit by 2 or less bullets.
However, when 3 bullets hit roughly the same spot on player’s collider, player’s hearts does not decrease by 3. Afterwards, when player gets hit by any amount of bullets, player’s hearts does not decrease any further.
GameControlScript (aka HealthCollision script)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameControlScript : MonoBehaviour
{
public GameObject heart1, heart2, heart3, heart4, heart5, GameOver;
public static int health;
private Score scoremanager;
// Start is called before the first frame update
void Start()
{
health = 5;
heart1.gameObject.SetActive (true);
heart2.gameObject.SetActive(true);
heart3.gameObject.SetActive(true);
heart4.gameObject.SetActive(true);
heart5.gameObject.SetActive(true);
GameOver.gameObject.SetActive (false);
Time.timeScale = 1;
scoremanager = FindObjectOfType<Score>();
}
// Update is called once per frame
void Update()
{
if (health > 5)
health = 5;
switch (health) {
case 5:
heart1.gameObject.SetActive(true);
heart2.gameObject.SetActive(true);
heart3.gameObject.SetActive(true);
heart4.gameObject.SetActive(true);
heart5.gameObject.SetActive(true);
break;
case 4:
heart1.gameObject.SetActive(true);
heart2.gameObject.SetActive(true);
heart3.gameObject.SetActive(true);
heart4.gameObject.SetActive(true);
heart5.gameObject.SetActive(false);
break;
case 3:
heart1.gameObject.SetActive(true);
heart2.gameObject.SetActive(true);
heart3.gameObject.SetActive(true);
heart4.gameObject.SetActive(false);
heart5.gameObject.SetActive(false);
break;
case 2:
heart1.gameObject.SetActive(true);
heart2.gameObject.SetActive(true);
heart3.gameObject.SetActive(false);
heart4.gameObject.SetActive(false);
heart5.gameObject.SetActive(false);
break;
case 1:
heart1.gameObject.SetActive(true);
heart2.gameObject.SetActive(false);
heart3.gameObject.SetActive(false);
heart4.gameObject.SetActive(false);
heart5.gameObject.SetActive(false);
break;
case 0:
heart1.gameObject.SetActive(false);
heart2.gameObject.SetActive(false);
heart3.gameObject.SetActive(false);
heart4.gameObject.SetActive(false);
heart5.gameObject.SetActive(false);
GameOver.gameObject.SetActive(true);
Time.timeScale = 0;
scoremanager.scoreincrease = false;
scoremanager.scorecount = 0;
break;
}
}
}
BulletMovement script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletMovement : MonoBehaviour
{
[SerializeField]
private float Speed = 5f;
[SerializeField]
private float Timer = 5f;
public GameObject impactEffect;
private Vector2 moveDirection;
private float moveSpeed;
private void OnEnable()
{
Invoke("Destroy", Timer);
}
// Start is called before the first frame update
void Start()
{
moveSpeed = Speed;
}
// Update is called once per frame
void Update()
{
transform.Translate(moveDirection * moveSpeed * Time.deltaTime);
}
public void SetMoveDirection(Vector2 dir)
{
moveDirection = dir;
}
private void Destroy()
{
gameObject.SetActive(false);
}
private void OnDisable()
{
CancelInvoke();
}
void OnTriggerEnter2D (Collider2D col)
{
if (col.gameObject.tag == "Player")
{
GameControlScript.health -= 1;
gameObject.SetActive(false);
Instantiate(impactEffect, transform.position, transform.rotation);
Debug.Log("Hit");
}
}
}
Would really appreciate it if anyone can point me in the right direction!