Jump to content
UnitySpain
Sign in to follow this  
zHeMaa

Como puedo hacer que se repita un código (Solucionado)

Recommended Posts

Buenas, tengo un código que hace que cuando dispare al enemigo se ponga de color blanco progresivamente, pero yo realmente lo que quiero es que que el enemigo se ponga blanco y a la vez se vuelva negro (como su color base) pero de igual manera, progresivamente.

Este efecto lo quiero para hacer un estilo de efecto de hitmarker y de momento tengo este código (he limpiado otros códigos para que se vea mas limpio todo).

Este código hace eso.. le das a un enemigo, se pone blanco progresivo.. hasta ahí bien, pero se queda blanco!! y eso, me gustaría que una vez se pusiera blanco saltase otro código que sin tiempo de espera se empiece a poner negro.. vamos que en cosa de 1 segundo (por ejemplo) haya pasado de blanco a negro recordando que el negro es el color base.

Llevo muchas horas probando códigos y no consigo nada de nada.. Gracias de antemano!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BlockController : MonoBehaviour {

    public Renderer rend;

    Color[] colors;
    float transitionTime = 0.01f;
    float duration = 0.5f;

    void Start()
    {
        rend = GetComponent<Renderer>();

        currentHealth = health;

        colors = new Color[3];
        colors[0] = Color.black;
        colors[1] = Color.white;
        colors[2] = Color.red;
    }

    IEnumerator ColorChange()
    {
        while (true)
        {
            Color newColor = colors[1];
            float transitionRate = 0;
            while (transitionRate < 100000)
            {
                rend.material.SetColor("_Color", Color.Lerp(rend.material.color, newColor, Time.deltaTime * transitionRate));
                transitionRate += Time.deltaTime / transitionTime;
                yield return null;
            }
            yield return null;
        }
    }

    void Update()
    {

    }

    public void HurtEnemy(int damage)
    {
        StartCoroutine(ColorChange());
    }
}

 

Edited by zHeMaa

Share this post


Link to post
Share on other sites

Mírate DotTween, te ayudará a hacer esa secuencia que estás buscando...

Share this post


Link to post
Share on other sites

Te recomiendo un esquema algo más separado entre salud y color, por ej (hay varias formas de hacerlo) con un componente dedicado a esto. Lo siguiente lo hice acá no te aseguro ni que compile, pero bueno es una idea usando eventos, que en este tipo de situaciones suele ser muy bueno, por ej podrías también como argumento el valor de incremento/decremento de salud y llenar una barra de UI sin tener una "referencia Dura", aca no lo hice solo llame al método pero en base al argumento podrías modificar el targetColor de distintas maneras:

Health.cs

public class Health : Monobehaviour
{
     public delegate void CharacterEvent();

	public event CharacterEvent OnIncreaseHealth;
     public event CharacterEvent OnDecreaseHealth;
     public event CharacterEvent OnDeath;
     public event CharacterEvent On... (y así);

     int hp = 100;

     ...

     void IncreaseHealth( int hpAmount ) // Por ejemplo
     {
          this.hp += hpAmount;

          // todo script suscrito a este evento se dispara
          if( OnIncreaseHealth != null )
               OnIncreaseHealth();

     }

     ...


}

HPColor.cs :

[RequiereComponent(typeof(Health))]	//en Health se realizan todos los cambios de salud
public class HPColor : Monobehaviour
{
	Health health;

     [SerializeField] Color damageColor;
     [SerializeField] Color healingColor;
     
     Color targetColor;
     Color baseColor;    // vamos a catchearlo

     float colorSpeed = 1; //ni idea como llamarlo ni que valor ponerle, la idea es que lo cambies dependiendo de cuan rápido querés que el cambio se de

	void Awake()
	{
		health = GetComponent<Health>();

          baseColor = rend.material.color;

          //falto "rend" pero bueno ... igual a como lo tenés
	}

     void OnEnable()
     {
          health.OnIncreaseHealth += OnIncreaseHealth;
          health.OnDecreaseHealth += OnDecreaseHealth;
     }

     void OnDisable()
     {
          health.OnIncreaseHealth -= OnIncreaseHealth;
          health.OnDecreaseHealth -= OnDecreaseHealth;
     }


     void Update()
     {
          ...
          // hice copy paste, la idea es hacer lo mismo pero con un targetColor
          rend.material.SetColor("_Color", Color.Lerp( rend.material.color , targetColor, Time.deltaTime * colorSpeed));
          ...
     }

     

     void OnIncreaseHealth()
     {
          // Setear el color de incremento de salud, por ej un verde
          // Ojo aca hice un invento se pone en verde de golpe y luego el script lo retorna al base (targetColor)
          rend.material.SetColor("_Color", healingColor);
          targetColor = baseColor;
          colorSpeed = 1;
     }

     void OnDecreaseHealth()
     {
          //Setear el color de incremento de salud, por ej un rojo
          targetColor = damageColor;
          colorSpeed = 5;  //un cambio más rápido que el de curación
     }
}

 

Share this post


Link to post
Share on other sites

Al final lo solucione.. después de muchísimos días, y horas y horas invertidas.. me fue mas fácil de lo que creía (al menos en el tema código pero realmente me fue muy difícil jajajaja. Pero lo implemente de una manera fácil, y simple)

El objeto es negro por completo de primeras, hasta ahí bien. Pero cuando le disparas se transforma a blanco con este código (muy simple).

gameObject.GetComponent<Renderer>().material.color = Color.white;

y seguidamente hace el siguiente código tal y como tenia y se transforma a negro (recordemos que es su color base) otra vez.

IEnumerator ColorChange()
    {
        while (true)
        {
            Color newColor = colors[1];
            float transitionRate = 0;
            while (transitionRate < 100000)
            {
                rend.material.SetColor("_Color", Color.Lerp(rend.material.color, newColor, Time.deltaTime * transitionRate));
                transitionRate += Time.deltaTime / transitionTime;
                yield return null;
            }
            yield return null;
        }
    }

de esta manera cuando disparas al enemigo se transforma en blanco de golpe y en cosa de medio segundo se vuelve negro (vuelve a su color base) otra vez, que es lo que yo quería para darle un toque de hitmarker, y como todo ocurre en milésimas el ojo no aprecia que el objeto se ha puesto blanco de golpe y negro otra vez progresivamente. Así que me ha quedado de 10, tal y como yo quería.

Gracias por la ayuda! nos vemos pronto!

Share this post


Link to post
Share on other sites

Si está solucionado, marca la "mejor respuesta", pulsando debajo del icono del autor que te ha dado la mejor.

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...