Search Unity

Bug with HealthCollision script

Discussion in 'Scripting' started by Ejat, May 15, 2020.

  1. Ejat

    Ejat

    Joined:
    May 12, 2020
    Posts:
    3
    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)
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class GameControlScript : MonoBehaviour
    6. {
    7.     public GameObject heart1, heart2, heart3, heart4, heart5, GameOver;
    8.     public static int health;
    9.     private Score scoremanager;
    10.  
    11.     // Start is called before the first frame update
    12.     void Start()
    13.     {
    14.         health = 5;
    15.         heart1.gameObject.SetActive (true);
    16.         heart2.gameObject.SetActive(true);
    17.         heart3.gameObject.SetActive(true);
    18.         heart4.gameObject.SetActive(true);
    19.         heart5.gameObject.SetActive(true);
    20.         GameOver.gameObject.SetActive (false);
    21.         Time.timeScale = 1;
    22.         scoremanager = FindObjectOfType<Score>();
    23.     }
    24.  
    25.     // Update is called once per frame
    26.     void Update()
    27.     {
    28.         if (health > 5)
    29.             health = 5;
    30.  
    31.         switch (health) {
    32.         case 5:
    33.             heart1.gameObject.SetActive(true);
    34.             heart2.gameObject.SetActive(true);
    35.             heart3.gameObject.SetActive(true);
    36.             heart4.gameObject.SetActive(true);
    37.             heart5.gameObject.SetActive(true);
    38.             break;
    39.         case 4:
    40.             heart1.gameObject.SetActive(true);
    41.             heart2.gameObject.SetActive(true);
    42.             heart3.gameObject.SetActive(true);
    43.             heart4.gameObject.SetActive(true);
    44.             heart5.gameObject.SetActive(false);
    45.             break;
    46.         case 3:
    47.             heart1.gameObject.SetActive(true);
    48.             heart2.gameObject.SetActive(true);
    49.             heart3.gameObject.SetActive(true);
    50.             heart4.gameObject.SetActive(false);
    51.             heart5.gameObject.SetActive(false);
    52.             break;
    53.         case 2:
    54.             heart1.gameObject.SetActive(true);
    55.             heart2.gameObject.SetActive(true);
    56.             heart3.gameObject.SetActive(false);
    57.             heart4.gameObject.SetActive(false);
    58.             heart5.gameObject.SetActive(false);
    59.             break;
    60.         case 1:
    61.             heart1.gameObject.SetActive(true);
    62.             heart2.gameObject.SetActive(false);
    63.             heart3.gameObject.SetActive(false);
    64.             heart4.gameObject.SetActive(false);
    65.             heart5.gameObject.SetActive(false);
    66.             break;
    67.         case 0:
    68.             heart1.gameObject.SetActive(false);
    69.             heart2.gameObject.SetActive(false);
    70.             heart3.gameObject.SetActive(false);
    71.             heart4.gameObject.SetActive(false);
    72.             heart5.gameObject.SetActive(false);
    73.             GameOver.gameObject.SetActive(true);
    74.             Time.timeScale = 0;
    75.             scoremanager.scoreincrease = false;
    76.             scoremanager.scorecount = 0;
    77.             break;
    78.         }
    79.     }
    80. }
    81.  
    BulletMovement script
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class BulletMovement : MonoBehaviour
    6. {
    7.     [SerializeField]
    8.     private float Speed = 5f;
    9.  
    10.     [SerializeField]
    11.     private float Timer = 5f;
    12.  
    13.     public GameObject impactEffect;
    14.  
    15.     private Vector2 moveDirection;
    16.     private float moveSpeed;
    17.  
    18.     private void OnEnable()
    19.     {
    20.         Invoke("Destroy", Timer);
    21.     }
    22.     // Start is called before the first frame update
    23.     void Start()
    24.     {
    25.         moveSpeed = Speed;
    26.     }
    27.  
    28.     // Update is called once per frame
    29.     void Update()
    30.     {
    31.         transform.Translate(moveDirection * moveSpeed * Time.deltaTime);
    32.     }
    33.  
    34.     public void SetMoveDirection(Vector2 dir)
    35.     {
    36.         moveDirection = dir;
    37.     }
    38.  
    39.     private void Destroy()
    40.     {
    41.         gameObject.SetActive(false);
    42.     }
    43.  
    44.     private void OnDisable()
    45.     {
    46.         CancelInvoke();
    47.     }
    48.  
    49.     void OnTriggerEnter2D (Collider2D col)
    50.     {
    51.         if (col.gameObject.tag == "Player")
    52.         {
    53.             GameControlScript.health -= 1;
    54.             gameObject.SetActive(false);
    55.             Instantiate(impactEffect, transform.position, transform.rotation);
    56.             Debug.Log("Hit");
    57.         }
    58.  
    59.     }
    60.  
    61. }
    62.  
    Would really appreciate it if anyone can point me in the right direction!
     
  2. Kurt-Dekker

    Kurt-Dekker

    Joined:
    Mar 16, 2013
    Posts:
    38,748
    You probably first want to refactor this using some sort of collection of five hearts rather than five bespoke GameObjects.

    For one, the code will be far simpler and fit in far less lines of space, and for two, it will also be FAR easier to reason about it.

    Check out tutorials on arrays and/or lists in C# and Unity3D.
     
  3. Ejat

    Ejat

    Joined:
    May 12, 2020
    Posts:
    3
    Thanks for replying!
    I am a beginner to C# which is why i use 5 GameObjects. I have looked up some tutorials about lists but i am not very sure how to integrate them into my HealthCollision script.
     
  4. Ejat

    Ejat

    Joined:
    May 12, 2020
    Posts:
    3
    Update: I added Debug.Log for every Case in the GameControlScript (aka HealthCollision script) and apparently the switch statement does not work after 3 bullets hit the player at the same time.