Ciclo día/noche

Mientras llega la primera escena he estado preparando algunas cosas, para esta semana, que va a ser muy ocupada, tenía pensado implementar un soporte básico para el reloj interno del juego, y de paso, un ciclo día/noche sencillo. En este último caso, se trata de cambiar el color de la luz solar y apagar/encender las luces nocturnas.

Hay muchas formas de hacer esto, pero yo siempre me voy por la variante sencilla, hasta que sea necesario mejorarla. En el caso de Unity3d, la clase queda así:

public class GameTime {
public int day=3, hour=9, minute=47;
public float SecsPerMinute=1.0f;        //Game minute duration, in seconds
float counter = 0;

// Update is called once per frame
public void Update (float elapsed) {
counter += elapsed;
if (counter > SecsPerMinute) {
counter = 0;
minute++;
if (minute==60) {
minute = 0;
hour++;
if (hour==24) {
hour = 0;
day++;
}// if hour
} //if minute
}
}
}

Como ven, no heredé de MonoBehaviour, porque decidí instanciar la clase dentro de otra más general que contiene toda la información del juego. A continuación, para implementar el apagado y encendido de luces nocturnas y etc. creé un nuevo tag en el editor: NightLight. Cada luz nocturna es un GameObject con un componente Light (y en el futuro, un sistema de partículas de ser necesario). Por defecto, el componente Light está desactivado. Luego agregué el siguiente método a la clase:

public void toggleNightLights(bool toggle){
var lights = GameObject.FindGameObjectsWithTag (“NightLight”);

foreach (var lightObj in lights) {
//set lights on/off
lightObj.GetComponentInChildren<Light>().enabled = toggle;
}
if (toggle == true) {
//set sun to black
var sun = GameObject.Find(“sun”).GetComponent<Light>();
sun.color = new Color(0.5f, 0.5f, 0.5f);
} else {
//set sun to black
var sun = GameObject.Find(“sun”).GetComponent<Light>();
sun.color = Color.white;
}
}

Como ven, lo que hago es obtener todos los GameObjects marcados con el tag NightLight y activo/desactivo su componente Light. El sol, que he llamado Sun, se obtiene mediante una búsqueda por nombre (es posible usar un tag también) y su color se cambia a oscuro cuando es de noche, y blanco cuando es de día. Por supuesto, el tinte de la luz solar es muchísimo más complejo, al igual que la traslación del sol, que en este caso se convierte en una rotación, porque un componente DirectionalLights ignora la posición y solo entiende de rotaciones. Pero eso ya será para otro día, cuando mi lado matemático salga a flote.

8 thoughts on “Ciclo día/noche

  1. Q bien me ecanta el Diablo anque nos allan jodido con el 3 pero bueno fatalidad geografica ojala tengas suerte y no se nada sobre el motor como t dije pero si t puedo ayudar en algo aqui estoy.. Salu2..

  2. que bueno que te interese los videojuegos y más su creación, esto me dió l alerta parar preguntarte si podías ayudarme con algunos consejos o/u otra forma para desarrollar los códigos de javascript en el unity 3d puesto que estoy empleando mi tiempo libre en la creación de juego de superviviencia.. ok mano si puedes ayudarme te lo agardecería.

  3. que bueno que te interese los videojuegos y más su creación, esto me dió la alerta parar preguntarte si podías ayudarme con algunos consejos o/u otra forma para desarrollar los códigos de javascript en el unity 3d puesto que estoy empleando mi tiempo libre en la creación de juego de superviviencia.. ok mano si puedes ayudarme te lo agradecería.

    1. En javascript no te puedo ayudar, yo estoy usando C# y casi toda la documentacion actual y las preguntas y respuestas en los foros son en ese lenguaje. Te recomiendo que lo uses, a la larga te sera de mas utilidad.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *