Usualmente cuando usted quiere hacer una modificación de cualquier tipo de asset del juego, usted quiere que suceda en el tiempo de ejecución y usted quiere que sea temporal. Por ejemplo, si su personaje recoge un power-up de invisibilidad, usted podría querer cambiar el shader del material para el personaje del jugador para que visualmente muestre un estado invisible. Esta acción involucra modificar el material que está siendo utilizado. Esta modificación no es permanente ya que nosotros no queremos que el material tenga un diferente shader cuando salga del Play Mode.
Sin embargo, es posible en Unity escribir scripts que van a permanentemente modificar un asset fuente. Utilicemos el material de arriba de ejemplo como un punto de inicio.
Para cambiar temporalmente el shader del material, nosotros cambiamos la propiedad shader del componente material.
private var invincibleShader = Shader.Find ("Specular");
function StartInvincibility {
renderer.material.shader = invincibleShader;
}
Cuando se utilice este script y se salga del Play Mode (modo de reproducción), el estado del material se re-inicia a lo que sea que estaba antes de entrar al Play Mode (modo de reproducción) inicialmente. Esto sucede ya que cuando un renderer.material es accedido, el material es automáticamente instanciado, y la instancia es devuelta. Esta instancia es aplicada simultaneamente y automáticamente al renderer (renderizador). Por lo que usted puede cualquier cambios que su corazón desee sin temer permanencia.
El método presentado abajo va a modificar los archivos assets fuentes utilizados dentro de Unity. Estas modificaciones no se pueden deshacer. Utilice estas con precaución.
Ahora digamos que nosotros no queremos que el material se re-inicie cuando se salga del modo de reproducción. Para esto, usted puede utilizar renderer.sharedMaterial. La propiedad sharedMaterial va a devolver el asset actual utilizado por este renderizador (y de pronto otros).
El código de abajo va a cambiar permanentemente el material para utilizar el shader Specular. Éste no va a re-iniciar el material al estado en el que estaba antes del Play Mode (modo de reproducción).
private var invincibleShader = Shader.Find ("Specular");
function StartInvincibility {
renderer.sharedMaterial.shader = invincibleShader;
}
Como usted puede ver, hacer cambios a un sharedMaterial puede ser ambos útil y arriesgado. Cualquier cambios hechos a un sharedMaterial será permanente, y no se puede deshacer.
La misma formula descrita arriba puede ser aplicada a más que los materiales. La lista de assets que siguen esta convención es como sigue:
Si usted declara una variable pública de cualquiera de las clases de arriba: Material, Mesh, o Physic Material (Material de Física), y hace modificaciones al asset utilizando la variable en vez de utilizar el miembro de la clase relevante, usted no recibirá los beneficios de una instanciación automática antes de que las modificaciones sean aplicadas.
Hay dos diferentes assets que nunca son instanciados automáticamente cuando se modifica.
Cualquier modificación hecha a estos assets a través del script son siempre permanentes, y nunca se pueden deshacer. Por lo que si usted está cambian el heightmap de su terreno a través de scripting, usted va a necesitar tener que instanciar y asignas los valores por usted mismo. Lo mismo va para Texturas. Si usted cambia los pixeles de un archivo de textura, el cambio es permanente.
Los assets Texture2D son nunca instanciados automáticamente cuando son modificados en proyectos iOS y Android. Cualquier modificación hecha a estos assets a través de scripting siempre son permanente, y nunca se pueden deshacer. Por lo que si usted está cambiando los pixeles de un archivo de textura, el cambio es permanente.