La importancia de llamarse Organizado

Unity17788-The-Importance-of-Being-Earnest ofrece una gran libertad a la hora de organizarte y desarrollar. Eso está muy bien pero, como el pesado del tío de Peter Parker nos lo ha recordado en más de una ocasión, un gran poder conlleva una gran responsabilidad.

Dentro del editor de Unity existe una ventana especialmente importante: Hierarchy. Contiene cada GameObject, y sus jerarquías, de la escena que tengas cargada.

Es algo donde todo el mundo va a acabar tocando y es muy fácil que si no tenéis unas normas se os acabe yendo de las manos.

Y es que pese a tener un buscador por nombre y tipo (usando “t:” seguido del nombre del tipo a buscar), encontrar algo en una Hierarchy mal organizada puede llevarte tiempo:

 

BadHierarchy

 

Nosotros definimos que cada escena tenga estos GameObjects vácios espaciales:

  • Behaviours, objetos que modifican/fijan/controlan la lógica del juego.
  • Cameras, donde estarán las cámaras del juego y todo lo relacionado con ellas.
  • Effects, efectos visuales, luces, audio, etc.
  • Environment, entorno visual que no afecta al juego (terreno, props, etc).

 

La anterior ventana de Hierarchy quedaría asi:

 

GoodHierarchy

 

En una escena nueva, puedes usar este código para crear la jerarquía básica automáticamente:

public static void BuildStandardHierarchy()
{
  if (EditorUtility.DisplayDialog("Build hierarchy",
    "A standard hierarchy will be created in the current scene." +
    "It should only be made in new scenes.\r\n\r\n" +
    "Do you want to continue?",
    "OK", "Cancel") == true)
  {
    var folders = new string[] { "Behaviours", "Cameras", "Effects", "Environment" };
    for (int i = 0; i < folders.Length; ++i)
    {
      GameObject folder = GameObject.Find(folders[i]);
      if (folder == null)
      {
        folder = new GameObject(folders[i]);
        folder.transform.position = Vector3.zero;
      }

      // Move "Main Camera" to "Cameras" folder.
      if (folders[i] == "Cameras")
      {
        GameObject camera = GameObject.Find("Main Camera");
        if (camera != null && camera.transform.parent == null)
          camera.transform.parent = folder.transform;
      }
    }
  }
}

Estos GameObjects especiales deben estar siempre en la posición (0, 0, 0), con escala (1, 1, 1) y sin rotar.

 

Para evitar que alguien pueda cambiarlos, podemos crearnos un Transform nuestro que evite que alguien pueda cambiarlos.

if (thisTarget.transform.parent == null &&
   (string.CompareOrdinal("Behaviours",  thisTarget.gameObject.name) == 0 ||
    string.CompareOrdinal("Cameras",     thisTarget.gameObject.name) == 0 ||
    string.CompareOrdinal("Effects",     thisTarget.gameObject.name) == 0 ||
    string.CompareOrdinal("Environment", thisTarget.gameObject.name) == 0))
{
  EditorGUILayout.HelpBox("This special object CANNOT be transformed.", MessageType.Info);
}

Puedes descargarte el código de este post de nuestro github.

githubLink

You Might Also Like

No Comments

Leave a Reply