Home > Enterprise >  Unity2D-How to restore hearts after destroying them when Player gets hit
Unity2D-How to restore hearts after destroying them when Player gets hit

Time:10-08

I am using Destroy(Corazones[0].gameObject); to destroy 5 hearts in an array, but I need to restore them when the player gets another heart. I already have the collider that increases lives 1 and it works, but I do not know how to respawn the heart that represents that life.

The hearts get destroyed when the player gets Hit(); but I also need for the hearts to get restored with Vida(); which increases the live 1

Thanks for your help! This is the way the hearts look

My code uses spanish words. PD: I know my code is a mess, but works for the other stuff.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityStandardAssets.CrossPlatformInput;
using UnityEngine.UI;

public class DixonMovement : MonoBehaviour
{
    public GameObject PildoraPrefab;
    public float Speed;
    public float JumpForce;
    public AudioClip Golpe;
    public AudioClip Salto;
    public AudioClip Muerte;
    public AudioClip Caida;
    public GameObject[] Corazones;
  



    private Rigidbody2D Rigidbody2D;
    private Animator Animator;
    private float Horizontal;
    private bool Grounded;
    private float LastShoot;
    private int Health = 5;
    public bool YaSono = false;

    [Header("IFrame Stuff")]
    public Color flashColor;
    public Color regularColor;
    public float flashDuration;
    public int numberOfFlashes;
    public Collider2D triggerCollider;
    public SpriteRenderer mySprite;
    float timer;
    bool invencible = false;
    


    private void Start()
    {
        Rigidbody2D = GetComponent<Rigidbody2D>();
        Animator = GetComponent<Animator>();
        
    }

    // Update is called once per frame
    private void Update()
    {
        
        timer -= Time.deltaTime;

        if (timer <= 0)
        {
            invencible = false;
        }


        Horizontal = CrossPlatformInputManager.GetAxis("Horizontal");

        if (Horizontal < 0.0f) transform.localScale = new Vector3(-1.0f, 1.0f, 1.0f);
        else if (Horizontal > 0.0f) transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);




        Animator.SetBool("Caminar", Horizontal != 0.0f);

        Debug.DrawRay(transform.position, Vector3.down * 0.5f, Color.red);

        if (Physics2D.Raycast(transform.position, Vector3.down, 0.5f))
        {
            Grounded = true;

        }
        else Grounded = false;




        if (CrossPlatformInputManager.GetButtonDown("Jump") && Grounded)
        {
            Jump();
        }
        if (Input.GetKeyDown(KeyCode.W) && Grounded)
        {
            Jump();
        }
        if (Input.GetKey(KeyCode.Space) && Time.time > LastShoot   0.25f)
        {
            Shoot();
            LastShoot = Time.time;
        }
        if (CrossPlatformInputManager.GetButtonDown("Shoot") && Time.time > LastShoot   0.50f)
        {
            Shoot();
            LastShoot = Time.time;
        }

        /*  if (CrossPlatformInputManager.GetButtonDown("Vertical") && Time.time > LastShoot   0.50f)
          {
              Shoot();
              LastShoot = Time.time;
          }*/


        if (transform.position.y <= -2)
        {
            Fall();

        }

        




    }


    private void FixedUpdate()
    {
        Rigidbody2D.velocity = new Vector2(Horizontal * Speed, Rigidbody2D.velocity.y);
    }

    private void Jump()
    {
        Rigidbody2D.AddForce(Vector2.up * JumpForce);
        Camera.main.GetComponent<AudioSource>().PlayOneShot(Salto);
    }

    private void Shoot()
    {
        Vector3 direction;
        if (transform.localScale.x == 1.0f) direction = Vector3.right;
        else direction = Vector3.left;

        GameObject pastilla = Instantiate(PildoraPrefab, transform.position   direction * 0.40f, Quaternion.identity);
        pastilla.GetComponent<Pastilla>().SetDirection(direction);
    }



    **public void Hit()
    {
        
        Health -= 1;
        if (Health > 0)
        {
            StartCoroutine(FlashCo());
        }
        if (Health < 1)
        {
            Destroy(Corazones[0].gameObject);
            
        }
        else if (Health < 2)
        {
            Destroy(Corazones[1].gameObject);
           
        }
        else if (Health < 3)
        {
            Destroy(Corazones[2].gameObject);
            
        }
        else if (Health < 4)
        {
            Destroy(Corazones[3].gameObject);
            
        }
        else if (Health < 5)
        {
            Destroy(Corazones[4].gameObject);
            
        }
        if (Health > 0)
        {
            Camera.main.GetComponent<AudioSource>().PlayOneShot(Golpe);
        }**




        if (Health == 0)
        {
            Camera.main.GetComponent<AudioSource>().PlayOneShot(Muerte);
            Animator.SetTrigger("Muerte");


            if (Grounded == false)
            {
                Rigidbody2D.bodyType = RigidbodyType2D.Dynamic;
                Rigidbody2D.gravityScale = 2;
            }
            else
            {
                Rigidbody2D.bodyType = RigidbodyType2D.Static;
            }



        }


    }


    public void Fall()
    {
        if (transform.position.y <= -1)
        {

            Rigidbody2D.AddForce(Vector2.up * 60);

            if (!YaSono)
            {
                Camera.main.GetComponent<AudioSource>().PlayOneShot(Caida);
                YaSono = true;
            }


            Animator.SetTrigger("Muerte");

            Health = 0;
            Destroy(Rigidbody2D, 2);

            Destroy(Corazones[0].gameObject);
            Destroy(Corazones[1].gameObject);
            Destroy(Corazones[2].gameObject);
            Destroy(Corazones[3].gameObject);
            Destroy(Corazones[4].gameObject);

            Invoke("RestartLevel", 2);



        }
    }

   public void Vida()
    {

        
        if (Health >=5) { } else { Health  = 1; }
      
    }



    public void Bounce()
    {
        Rigidbody2D.AddForce(Vector2.up * 300);
    }

    void Invencible()
    {
        timer = 1;
        if (timer > 0)
        {
            invencible = true;
        }
    }


    private IEnumerator FlashCo()
    {
        int temp = 0;
        triggerCollider.enabled = false;
        while (temp < numberOfFlashes)
        {
            mySprite.color = flashColor;
            yield return new WaitForSeconds(flashDuration);
            mySprite.color = regularColor;
            yield return new WaitForSeconds(flashDuration);
            temp  ;
        }
        triggerCollider.enabled = true;
    }

    private void RestartLevel()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }

    


   

    


}

CodePudding user response:

Instead of using Destroy(Corazones[0].gameObject) you could use Corazones[0].gameObject.setActive(false) or simply Corazones[0].setActive(false) since the array already contains GameObjects.

This would preserve the GameObject while all of its components and children would be inactivated including its Renderer which would make it disappear.

Then later when you need it you could reactivate it using Corazones[0].setActive(true).

  • Related