Otros detalles de ambientación que pueden verse en esta escena son pequeñas animaciones como el agua o la puerta (con cual hay una sencilla interacción con el usuario) y features gráficas como el uso de luces y destellos (lens flare) del sol y farolitos.
La primera solución que probé para el cambio de skybox fue un simple reemplazo de materiales del mismo, usando la siguiente función
RenderSettings.skybox= nightMaterial;Un sencillo ejemplo de uso sería el siguiente:
var dayMaterial:Material;Para probar este script, copia y pegalo en un objeto JavaScript de Unity, asigna el mismo a cualquier objeto en escena (la cámara, por ejemplo), y asígnale 2 materiales diferentes de tipo skybox (si no encuentras ninguno, prueba importar el package Skyboxes que viene con los Standard Assets de Unity) a las variables Day Material y Night Material.
var nightMaterial:Material;
private var ButtonText:String ="day";
RenderSettings.skybox = dayMaterial;
function OnGUI () {
if (GUI.Button (Rect (10,10,150,50), ButtonText)) {
if (RenderSettings.skybox == dayMaterial){
ButtonText = "night";
RenderSettings.skybox= nightMaterial;
}else if(RenderSettings.skybox == nightMaterial){
ButtonText = "day";
RenderSettings.skybox= dayMaterial;
}
}
}
El único drama con esta propuesta es que el cambio instantáneo resulta bastante brusco, lo cual, al menos en mi opinión... se hace demasiado notorio, especialmente tratándose del cielo.
Para encarar esto recurrí a un shader escrito especialmente para dicho propósito: SkyboxBlended. Al aplicar este shader a un material, se nos presentan 12 slots -correspondientes a 2 skybox- para completar con texturas. Adicionalmente, en la parte superior tenemos una barra de desplazamiento para cambiar el valor de Blend del material, que controla el fundido. El siguiente paso sería acceder a este valor Blend via script, de modo que pueda automatizarse el cambio progresivo del mismo.
Para ello creamos una variable de tipo Material a la cual asignamos el nuevo material creado con el shader SkyboxBlended, y accedemos al valor Blend del shader de la siguiente manera:
variableMaterialSkyboxBlended.SetFloat("_Blend", valiable float con valor entre 0-1);
Para modificar la intensidad de las luces en escena necesitamos crear una variable de tipo Light a la cual asignamos el objeto luz con el cual vamos a trabajar, ej:
var luzSol:Light;Y modificamos la intensidad accediendo a su variable Intensity. La siguiente linea de ejemplo bajaría la intensidad de la luz "Sol" a 0.
luzSol.intensity=0;Puedes ver mas sobre el manejo de las luces via script aquí: luces en Unity.
Update 14/10/2011
Siguiendo una conversación
desarrollada en los comentarios, he armado esta mini escena test. Puedes bajar
el ZIP aquí: dia-noche-test1/test-skybox.zip
Si
descomprimimos el ZIP dentro de la carpeta Assets de un proyecto nuevo,
*supuestamente* debería funcionar, habiendo únicamente que agregar
las texturas al material. De no funcionar *así nomás* (es decir,
los objetos en la escena aparece en blanco y hay que agregarles los assets),
el ZIP al menos contiene un script JS y el shader, con los cuales es muy fácil
montarse el proyecto.
2/2/2011 - loop, fantarama.com