Unity 4.0 cambia cómo el estado actual de los GameObjects se maneja. El estado activo del GameObject ahora es heredado por GameObjects hijos, para que cualquier GameObject que esté inactivo también cause que sus hijos sean inactivos. Nosotros creemos que el nuevo comportamiento tiene más sentido que el viejo, y siempre debió ser así. También, el nuevo sistema GUI que se aproxima depende mucho en el nuevo comportamiento 4.0, y no sería posible sin este. Des-afortunadamente, esto podría requerir algo de trabajo para arreglar los proyectos existentes para que funcionen con el nuevo comportamiento de Unity 4.0, y aquí está el cambio:
Usted tiene tres GameObjects, A, B y C, para que B y C son hijos de A.
Para visualizar estos cambios, en el editor de 4.0, cualquier GameObject que es inactivo (ya sea porque su propia .activeSelf es configurada a false, o aquel d uno de sus padres), se volverá gris en la jerarquía, y va a tener un icono en gris en el inspector. La propiedad .activeSelf del GameObject es reflejada por su casilla de verificación active, que puede ser activada/des-activada sin importar del estado del padre (pero solamente va a activar el GameObject si todos los padres están activos).
Durante el desarrollo de 4.0 nuestro pipeline de importación de assets ha cambiado en unas maneras significantes de manera interna con el fin de mejorar el rendimiento, uso de memoria y determinación. Para la mayoría de veces, estos cambios no tienen un impacto en el usuario con una excepción: Los Ojbectos en assets no están hechos persistentes hasta el final del pipeline de importación y cualquier versión importada previamente de un asset será remplazada completamente.
La primera parte significa que durante el post-procesamiento usted no puede obtener las referencias correctas a objetos en el asset y la segunda parte significa si usted utiliza las referencias a una versión previamente importada del asset durante el post-procesamiento, por favor almacene la modificaciones ya que estas modificaciones serán perdidas.
Considere este pequeño ejemplo:
public class ModelPostprocessor : AssetPostprocessor
{
public void OnPostprocessModel(GameObject go)
{
PrefabUtility.CreatePrefab("Prefabs/" + go.name, go);
}
}
En Unity 3.5 esto va a crear un prefab con todas las referencias correctas a los meshes y así ya que todos los meshes ya estarían hechos persistentes, pero debido a que este no es el caso en Unity 4.0 el mismo post procesador va a crear un prefab dónde todas las referencias a los meshes desaparecen, simplemente porque Unity 4.0 no sabe todavía cómo resolver las referencias a los objetos en el prefab del modelo original. Para copiar correctamente un modelprefab a un prefab usted debería utilizar OnPostProcessAllAssets para ir a través de todos los assets importados, encuentre el modelprefab y cree el nuevo prefab como se hace arriba.
El segundo ejemplo es un poco más complejo pero en verdad es un caso de uso que nosotros hemos visto en 3.5 que se rompió en 4.0. Aquí hay un simple ScriptableObject con una referencias al mesh.
public class Referencer : ScriptableObject
{
public Mesh myMesh;
}
Nosotros utilizamos este ScriptableObject para crear un asset con referencias a un mesh dentro de un modelo, entonces en nuestro post procesador nosotros tomamos esa referencia y le damos un nombre diferente, el resultado final siendo que cuando nosotros hemos re-importado el modelo el nombre del mesh será lo que el post procesador determine.
public class Postprocess : AssetPostprocessor
{
public void OnPostprocessModel(GameObject go)
{
Referencer myRef = (Referencer)AssetDatabase.LoadAssetAtPath("Assets/MyRef.asset", typeof(Referencer));
myRef.myMesh.name = "AwesomeMesh";
}
}
Esto funciono bien en Unity 3.5 pero en Unity 4.0 el modelo que ya estuvo importado será completamente remplazado, por lo que cambiar el nombre de un mesh de una importación previa no tendrá efecto. La solución aquí es encontrar el mesh por otros medios y cambiar su nombre. Lo que es más importante para tener en cuenta es que en Unity 4.0 usted debería SOLAMENTE modificar el input dado del post procesador y no debe depende en la versión previamente importada del mismo asset.
Unity 4.0 adds a “Read/Write Enabled” option in the Model import settings. When this option is turned off, it saves memory since Unity can unload a copy of mesh data in the game.
Sin embargo, si usted está escalando o instanciando meshes en tiempo de ejecución con una escala no-uniforme, usted puede tener que activar “Read/Write Enabled” en sus ajustes de importación. La razón es que la escala no-uniforme requiere los datos mesh en ser mantenidos en memoria. Normalmente nosotros detectamos esto en el tiempo de construcción pero cuando los meshes son escalados o instanciados en tiempo de ejecución usted necesita configurar esto manualmente. De lo contrario no podrían ser renderizado en las construcciones del juego correctamente.
El Importador de Modelo en Unity 4.0 se ha vuelto mejor en las optimizaciones mesh. La casilla de verificación “Mesh Optimization” en el importador del modelo en Unity 4.0 está activado por defecto. Usted puede que tenga algo de código de post-procesamiento o effectos en su proyecto que dependen en el orden del vértice de sus meshes, y estos podrían estar rotos por este cambio. En ese caso, apague “Mesh Optimization” en el importador de Mesh. Especialmente, si usted está utilizando el componente SkinnedCloth, la optimización mesh va a causar que el mappeo del peso de vértice cambie. Por lo que is usted está utilizando SkinnedCloth en un proyecto importado de 3.5, usted necesita apagar “Mesh Optimization” para los meshes afectados, o re-configurar sus pesos del vértice para que coincidan el nuevo orden de vértices.
Con Unity 4.0, el input del sensor móvil tiene un mejor alineamiento entre plataformas, que significa que usted puede escribir menos código cuando maneje un input típico en plataformas móviles. Ahora el input de aceleración y de gyro va a seguir la orientación de la pantalla de la misma manera que en plataformas iOS y Android. Para tomar ventaja de este cambio usted debería re-factorizar el código de input y quitar código especifico de la plataforma y orientación de pantalla cuando se maneje el input de aceleración y gyro. Usted todavía puede obtener una vieja versión en IOS al configurar Input.compensateSensors a falso.