Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Definir "horas" dentro de un juego

Iniciado por Alvaro95, Septiembre 19, 2018, 08:49:10 PM

Tema anterior - Siguiente tema
Buenas a todos, me gustaría hacer en mi juego una especie de ciclo día y noche, pero no llega a ser eso.
 
 
 
Mi idea es crear 3 horas dentro del juego, que seria, una por la tarde, otra anocheciendo, y otra en completa oscuridad a través de teclas como por ejemplo: 1:Dia, 2:Tarde, 3:Noche.
 
 
 
Mi idea seria simplemente modificando el directional light, supongo que sera a través de script.
 
 
 
Sabéis algún modo fácil? o otra opción seria crear un ciclo día y noche controlable a trabes de una barra. Gracias

Cita de: Alvaro95 date=1537382950Mi idea es crear 3 horas dentro del juego, que seria, una por la tarde, otra anocheciendo, y otra en completa oscuridad a través de teclas como por ejemplo: 1:Dia, 2:Tarde, 3:Noche.
   


No entiendo eso de que sea a través de teclas ? el ciclo dia noche en teoría es un ciclo, algo que se repite y es cerrado.
 
Cita de: Alvaro95 date=1537382950Mi idea seria simplemente modificando el directional light, supongo que sera a través de script.
   


Sí y sí
 
Cita de: Alvaro95 date=1537382950Sabéis algún modo fácil? o otra opción seria crear un ciclo día y noche controlable a trabes de una barra. Gracias
   


Tenés que poder:
 


  1.    relacionar un giro de 360 grados con el tiempo objetivo o target que te propongas


  2.    determinar el progreso del ciclo (0 al 100%), generalmente asociado a la hora, para tener referencia y toquetear lo que quieras


  3.    modificar intensidad/color de luz en base al progreso


Para 1 podés hacer algo así:
 

public float targetTime = 3; // Ej 3 horas
float constante;
void Awake(){
  float targetTimeSec = targetTime * 3600 ; // --> en segundos (porque Time.deltaTime te lo da en seg)
  constante = (360 / targetTimeSec );   //vel angular [grados / segundos] , <-- necesita ser multiplicado por deltaTime
}
void Update(){
  float angleDelta = Time.deltaTime * constante;  
  luz.transform.Rotate(angleDelta , 0 , 0);  // Rota en X por ej
                                                                 
}

 
No se si la matemática está bien, la hice acá, aunque tengo un script dando vueltas que anda muy bien pero no lo encuentro.
 
Para 2 (y por ende 3) depende de gustos, yo solía decir que amanecer era 0%, ya razón de esto es que hacía que la intensidad siguiera una función seno (entonces quedaba bien de entrada), es decir de 0 a 50% (ocaso) daba la parte positiva del seno, de 50% a 100% (medianoche) daba lo negativo del seno, osea intensidad de luz negativa (o nula para Unity).
 
Para 2 y 3 podés hacer algo así:
 

float segundosQuePasaron = 0;
...
 
segundosQuePasaron += Time.deltaTime;
if (segundosQuePasaron >= 86400)
segundosQuePasaron -= 86400; //limitar segundos de 0 a 86400
progreso = segundosQuePasaron / 86400;   //86400 segundos en un día, progreso de 0 a 1
luz.intensity = LaIntensidadMaximaQueQuieras * Mathf.Sin (progreso * 2 * Mathf.PI); //progreso max -> 2 pi o vuelta completa

 
 

Gracias, me refiero con lo de las teclas a programar 3 ciclos.
 
Cuando pulse la tecla 1 por ejemplo, que el cielo cambie, al pulsar 2 que vuelva a cambiar etc...

¿Pero quieres que cambie de golpe, al instante, o que haya una pequeña transición suave entre ciclos?

Septiembre 20, 2018, 01:14:47 AM #4 Ultima modificación: Septiembre 20, 2018, 01:16:22 AM por Alvaro95
Hombre, si hay una pequeña transición entre ciclos le dará mas calidad al juego, de cualquier modo si es de golpe no me importaría.
 
Pero a poder ser, que haya una pequeña transición.
 
 
 
Realmente seria definir tres horas, y que la configuración del directional light cambie.

Para entender...
 
lo que quieres es que al presionar la tecla "1" sea de dia el "2" de tarde y "3" de noche??
 
Si es asi creo debes crear un Script que al presionar la tecla que quieres haga que la intensidad del directional light cambie a la deseada... si quieres la transición lightbug te dejo un Script de ejemplo del cual basarte...

Septiembre 20, 2018, 11:07:15 PM #6 Ultima modificación: Septiembre 20, 2018, 11:29:49 PM por Alvaro95
Si, exactamente eso Javierhakerone
 
Pero realmente me resulta bastante difícil guiarme por ese script

Septiembre 21, 2018, 10:20:22 AM #7 Ultima modificación: Septiembre 21, 2018, 10:26:25 AM por debug
Cita de: Alvaro95 date=1537382950Buenas a todos, me gustaría hacer en mi juego una especie de ciclo día y noche, pero no llega a ser eso.
   
   
       
   
   
      Mi idea es crear 3 horas dentro del juego, que seria, una por la tarde, otra anocheciendo, y otra en completa oscuridad a través de teclas como por ejemplo: 1:Dia, 2:Tarde, 3:Noche.
   
   
       
   
   
      Mi idea seria simplemente modificando el directional light, supongo que sera a través de script.
   
   
       
   
   
      Sabéis algún modo fácil? o otra opción seria crear un ciclo día y noche controlable a trabes de una barra. Gracias
   


 
 
Añade el siguiente script a la luz... en el inspector aparecerán unos ajustes, el ajuste intensidad es la intensidad de la luz y el ajuste transición es la duración de la transición en segundos.
 
ilum.cs
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ilum: MonoBehaviour {
    [Header("Ajustes")]
   
    [Space(10)]
    [Range(0f, 1f)]
    public float intensidadDia = 1f;
    public float transicionDia = 3f;
 
    [Space(10)]
    [Range(0f, 1f)]
    public float intensidadTarde = .5f;
    public float transicionTarde = 3f;
 
    [Space(10)]
    [Range(0f, 1f)]
    public float intensidadNoche = 0f;
    public float transicionNoche = 3f;
    public float[,] modos;
   
    private Light luz;
    private IEnumerator transicion;
    void Start() {
   
        modos = new float[,] {
            {
                intensidadDia,
                transicionDia
            }, {
                intensidadTarde,
                transicionTarde
            }, {
                intensidadNoche,
                transicionNoche
            }
        };
     
        luz = GetComponent < Light > ();
     
    }
    void Update() {
        if (Input.GetKey("1")) {
            iniciaCambio(0);
        } else if (Input.GetKey("2")) {
            iniciaCambio(1);
        } else if (Input.GetKey("3")) {
            iniciaCambio(2);
        }
    }
    void iniciaCambio(int modo) {
     
        if (transicion != null) StopCoroutine(transicion);
        transicion = cambia(modo);
        StartCoroutine(transicion);
     
    }
 
    IEnumerator cambia(int modo) {
     
        var tiempoTransicion = modos[modo, 1];
        var intensidadOrigen = luz.intensity;
        var intensidadFinal = modos[modo, 0];
        var rangoTransicion = intensidadOrigen - intensidadFinal;
        var estadoTransicion = true;
     
        while (estadoTransicion) {
            luz.intensity = intensidadOrigen - rangoTransicion * (1f - (tiempoTransicion / modos[modo, 1]));
            tiempoTransicion -= Time.deltaTime;
            if (tiempoTransicion <= 0f) {
                luz.intensity = intensidadFinal;
                estadoTransicion = false;
            };
            yield return null;
        }
    }
 
}

 
Seguramente no sea la mejor de las formas... ten en cuenta que llevo poco tiempo con Unity... a ver si te sirve.
 
Saludos.

Muchas gracias debug.
 
Lo único que ese método solo cambia la intensidad del directional lights, tuve que añadir mas funciones para que cambiara la dirección del sol y el cielo se viera de distintos tonos.

Con ajuste de color, duración transición, intensidad y ángulo.
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ilum: MonoBehaviour {
    [Header("Ajustes")]
   
    [Range(0f, 1f)]
    public float intensidadDia = 1f;
    public float transicionDia = 3f;
    public Vector3 anguloDia = new Vector3(75f, 0f, 0f);
    public Vector3 colorDia = new Vector3(1f, 1f, 1f);
 
    [Space(10)]
    [Range(0f, 1f)]
    public float intensidadTarde = .5f;
    public float transicionTarde = 3f;
    public Vector3 anguloTarde = new Vector3(35f, 90f, 0f);
    public Vector3 colorTarde = new Vector3(.7f, .7f, 0f);
 
    [Space(10)]
    [Range(0f, 1f)]
    public float intensidadNoche = 0f;
    public float transicionNoche = 3f;
    public Vector3 anguloNoche = new Vector3(10f, 180f, 0f);
    public Vector3 colorNoche = new Vector3(0f, 0f, 0f);
    private float[,] modos;
   
    private Light luz;
    private IEnumerator transicion;
    void Start() {
   
        modos = new float[,] {
            {
                intensidadDia,
                transicionDia,
                anguloDia.x, anguloDia.y, anguloDia.z,
                colorDia.x, colorDia.y, colorDia.z
            }, {
                intensidadTarde,
                transicionTarde,
                anguloTarde.x, anguloTarde.y, anguloTarde.z,
                colorTarde.x, colorTarde.y, colorTarde.z
            }, {
                intensidadNoche,
                transicionNoche,
                anguloNoche.x, anguloNoche.y, anguloNoche.z,
                colorNoche.x, colorNoche.y, colorNoche.z
            }
        };
     
        luz = GetComponent < Light > ();
     
    }
    void Update() {
        if (Input.GetKey("1")) {
            iniciaCambio(0);
        } else if (Input.GetKey("2")) {
            iniciaCambio(1);
        } else if (Input.GetKey("3")) {
            iniciaCambio(2);
        }
    }
    void iniciaCambio(int modo) {
     
        if (transicion != null) StopCoroutine(transicion);
        transicion = cambia(modo);
        StartCoroutine(transicion);
     
    }
 
    IEnumerator cambia(int modo) {
     
        var tiempoTransicion = modos[modo, 1];
        var intensidadOrigen = luz.intensity;
        var intensidadFinal = modos[modo, 0];      
        var rangoIntensidad = intensidadOrigen - intensidadFinal;
        var anguloOrigen = transform.eulerAngles;
        var anguloFinal = new Vector3(modos[modo, 2], modos[modo, 3], modos[modo, 4]);
        var rangoAngulo = anguloOrigen - anguloFinal;
        var colorOrigen = new Vector3(luz.color.r, luz.color.g, luz.color.b);
        var colorFinal = new Vector3(modos[modo, 5], modos[modo, 6], modos[modo, 7]);
        var rangoColor = colorOrigen - colorFinal;
        var estadoTransicion = true;
     
        while (estadoTransicion) {
            var ciclo = (1f - (tiempoTransicion / modos[modo, 1]));
            var pasoColor = colorOrigen - rangoColor * ciclo;
            luz.color = new Color(pasoColor.x, pasoColor.y, pasoColor.z);
            luz.intensity = intensidadOrigen - rangoIntensidad * ciclo;
            transform.eulerAngles = anguloOrigen - rangoAngulo * ciclo;
            tiempoTransicion -= Time.deltaTime;
            if (tiempoTransicion <= 0f) {
                luz.color = new Color(colorFinal.x, colorFinal.y ,colorFinal.z);
                luz.intensity = intensidadFinal;
                transform.eulerAngles = anguloFinal;
               
                estadoTransicion = false;
            };
            yield return null;
        }
    }
 
}

 
Saludos

Etiquetas: