System

Object Pooling Manager

Archivos: CGFObjectPoolingManager.cs
Ruta: “CGF/Systems/ObjectTransform”

Gestor que permite al gameobject asociado gestionar el object pooling.

Instantiate On Awake – Instancia todo los objetos pooleables en el Awake.

Object To Pool – Lista de objetos pooleables

  • Object To Pool – Objeto pooleable.
  • Amount – Cantidad total de instancias.
  • Dynamic – Permite superar la cantidad total de instancias si se necesita.

Uso

Se añade el script CGFObjectPoolingManager a un gameobject vació de la escena y se añaden los objetos a poolear a la lista de objetos pooleables y se configura su comportamiento.

Para hacer una instancia de un objeto de la lista hay que llamar al método InstantiatePoolObject.

CGFObjectPoolingManager.Instance.InstantiatePoolObject(elementToSpawn.prefab, spawnPosition, Quaternion.identity) as GameObject;

 

En caso de que se deba destruir el objeto hay que desactivarlo para que vuelva a la pila.

gameObject.setActive(false);

 

También se pueden añadir más objetos a la pila, en tiempo de ejecución, utilizando el método Add Object.

AddObject(GameObject objectToAdd, int amount, bool dynamic)

Editor

Editor utilities

Archivos: CGFEditorUtilities.cs
Ruta: “CGF/Editor”

Editor Utilities es un conjunto de métodos y utilidades para construir más rápidamente el inspector de los scripts.

Tipos de propiedades compatibles:

  • Int

    • Genérico
    • Positivo
    • Negativo
    • Slider (Valor entre dos límites)
  • Float
    • Genérico
    • Positivo
    • Negativo
    • Ceil (Redondeado al entero superior más cercano)
    • Floor (Redondeado al entero superior más cercano)
    • Rounded (Redondeado al entero más cercano)
    • Slider (Valor entre dos límites)
    • Slider Ranged (Valor aleatorio de un margen entre dos límites)
  • Long
    • Genérico
    • Positivo
    • Negativo
  • Double
    • Genérico
    • Positivo
    • Negativo
    • Ceil (Redondeado al entero superior más cercano)
    • Floor (Redondeado al entero superior más cercano)
    • Rounded (Redondeado al entero más cercano)
  • Boolean
  • Vector 2

    • Genérico
    • Positivo
    • Negativo
  • Vector 3

    • Genérico
    • Positivo
    • Negativo
  • Vector 4

    • Genérico
    • Positivo
    • Negativo
  • Color
  • Enumeración
  • Rect
  • Texto
  • Curva de animación
  • Objeto <T>
  • Campo desplegable (Fold Out)
  • Lista

    • Valores
    • Clases
  • Tags (From Tags and Layers settings)
  • Layers (From Tags and Layers settings)
  • Sorting Layers (From Tags and Layers settings)
  • Inputs (From Input manager settings)
  • Layer Mask

Para crear un inspector personalizado se debe crear un script de “editor” con las siguientes atributos:

  • [CustomEditor(typeof(SampleScript))] – Asigna el tipo de la clase que el script de “editor” representará en el inspector, en este caso: SampleScript.cs.
  • [CanEditMultipleObjects] – Permite el soporte de edición multiobjeto.
  • Debe heredar de “UnityEditor.Editor”.

 

Paso 1

Crear las variables de tipo “SerializedProperty” en el script de “editor” (SampleScriptEditor) que hacen referencia a las variables del script objetivo (SampleScript).

[CustomEditor(typeof(SampleScript))]
[CanEditMultipleObjects]
public class SampleScriptEditor : UnityEditor.Editor
{
    private SerializedProperty _int;

}

 

Paso 2

En el método “OnEnable()” se inicializan las variables de tipo “SerializedProperty”. Añadiendo como parámetro del método “FindProperty()” nombre de la variable a la que se hace referencia en el script objetivo.

[CustomEditor(typeof(SampleScript))]
[CanEditMultipleObjects]
public class SampleScriptEditor : UnityEditor.Editor
{
    private SerializedProperty _int;

    void OnEnable()
    {
         _int = serializedObject.FindProperty("integer");
    }
}

De esta forma, se indica que la variable _int modificará la variable integer del script SampleScript.

 

Paso 3

Para crear el nuevo inspector se usa el método “OnInspectorGUI()”, permite dibujar y posicionar los elementos deseados en el panel de inspector. Este método funciona igual que el método “Update()” y se debe sobreescribir para que funcione correctamente.

Accediendo a la clase estática “EditorGUILayout” se puede crear cualquier tipo de campo en el inspector. En este caso se usa el método “IntField()” que devuelve una varible de tipo “int” para crear un campo en el “inspector “para la variable _int de tipo “int” y asignarle el nombre Integer que será visible desde el inspector.

[CustomEditor(typeof(SampleScript))]
[CanEditMultipleObjects]
public class SampleScriptEditor : UnityEditor.Editor
{
    private SerializedProperty _int;

    void OnEnable()
    {
         _int = serializedObject.FindProperty("integer");
    }

    public override void OnInspectorGUI()
    {
        _int = EditorGUILayout.IntField("Integer", _int);
    }
}

Para utilizar el Editor Utilities se utiliza el método “CGFEditorUtilities.BuildInt()” en vez del método “EditorGUILayout.IntField()”. A este método se le puede añadir una descripción que será visible desde el inspector como una tooltip.

[CustomEditor(typeof(SampleScript))]
[CanEditMultipleObjects]
public class SampleScriptEditor : UnityEditor.Editor
{
    private SerializedProperty _int;

    void OnEnable()
    {
         _int = serializedObject.FindProperty("integer");
    }

    public override void OnInspectorGUI()
    {
        CGFEditorUtilities.BuildInt("Integer", "All integer values", _int);
    }
}

 

Paso 4

Por último se usan los métodos “Update()” para actualizar el inspector y “ApplyModifiedProperties()” para actualizar las variables modificadas.

[CustomEditor(typeof(SampleScript))]
[CanEditMultipleObjects]
public class SampleScriptEditor : UnityEditor.Editor
{
    private SerializedProperty _int;

    void OnEnable()
    {
         _int = serializedObject.FindProperty("integer");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        CGFEditorUtilities.BuildInt("Integer", "All integer values", _int);

        serializedObject.ApplyModifiedProperties();
    }
}

 

Reorderable Lists

Unity gestiona la información de las listas de las SerializedProperty mediante arrays de una manera engorrosa para el usuario. Para mejorar la usabilidad se han creado listas que permiten ordenar los elementos arrastrándolos y además se le han añadido funcionalidades adicionales.

El método “BuildListCustom()” permite crear reorderable lists de una clase. Mediante el parámetro “params string[] properties” se indica el nombre de las propiedadades de cada elemento de la lista.

[CustomEditor(typeof(SampleScript))]
[CanEditMultipleObjects]
public class SampleScriptEditor : UnityEditor.Editor
{
    private SerializedProperty _listProperty;

    private ReorderableList _reorderableList;

    private int _newListSize;

    void OnEnable()
    {
         _listProperty = serializedObject.FindProperty("list");

         _reorderableList = new ReorderableList(serializedObject, _listProperty, true, true, true, true);
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        _newListSize = CGFEditorUtilities.BuildListButtons(_listProperty, _newListSize);
   
        _reorderableList = CGFEditorUtilities.BuildListCustom(_listProperty, _reorderableList, "List Name", bool vertical, int[] propertySpace, params string[] properties);

        serializedObject.ApplyModifiedProperties();
    }
}

 

Para facilitar las acciones de añadir y eliminar elementos de la reorderable lists se ha creado unos botones. El método “BuildListButtons()” los añade.

Además se ha creado un botón adicional que sustituye la cantidad total de elementos de la lista por una nueva cantidad, esta acción se activa igualando el valor int que representa la nueva cantidad de elementos al método “BuildListButtons()”.

Las reorderable lists tienen dos disposiciones, vertical (por defecto) u horizontal. Se configura la disposición mediante el parámetro “bool vertical”.

En la disposición vertical los campos de los elementos aparecerán uno debajo del otro.

 

En la disposición horizontal los campos de los elementos aparecerán uno al lado del otro.

 

Se puede establecer el ancho de cada campo de los elementos con el parámetro “int[] propertySpace”. Se da un valor entre 1 y 12 sin que el total de los valores supere 12.

 

Fold Out

Booleano que indica el valor del desplegable que oculta o muestra las propiedades deseadas.

Al presionar la variable de Fold Out en el inspector, esta invierte su valor, mostrando o ocultando los objetos que contiene.

 

GIF

Uso

[CustomEditor(typeof(SampleScript))]
[CanEditMultipleObjects]
public class SampleScriptEditor : UnityEditor.Editor
{
    private bool _foldOut;

    private SerializedProperty _vector3;

    public void OnEnable()
    {
         _vector3 = serializedObject.FindProperty("vector3"); 
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        _foldOut = CGFEditorUtilities.BuildFoldOut("Cube5", "Description", _foldOut);

        if(_foldOut)
        {
               CGFEditorUtilities.BuildVector3("Position", "Description", _vector3);
        }

        serializedObject.ApplyModifiedProperties();
    }
}

 

Component Tools

Añade accesos directos a acciones relacionadas con el componente.

 

Documentation – Acceso directo a la documentación del componente.

Remove – Acceso directo para eliminar del componente.

 

Uso

CGFEditorUtilities.BuildComponentTools(string documentationURL, SerializedObject component)

 

Required Components

Avisa de que componentes faltan al gameobject y los permite añadir cómodamente.

 

Add Components – Añade los componentes necesarios que no estén en el gameobject.

 

Uso

CGFEditorUtilities.BuildRequiredComponents(params Type[] components
CGFEditorUtilities.BuildRequiredComponents(typeof(BoxCollider), typeof(Rigidbody));

 

Manage Component Values

Permite copiar, pegar o pegar como nuevo componente los valores de un componente.

 

Copied – Muestra si hay valores copiados.

Copy – Copia los valores del componente.

Paste Pega en el componente los valores copiados.

Paste as New – Añade un componente al gameobject con los valores copiados.

 

Uso

CGFEditorUtilities.ManageComponentValues<T>()

 

Back Up Component Values

Permite crea una copia de seguridad del componente y recuperarla en cualquier momento ya que se guarda en el proyecto. Además funciona en modo “Play” y “Edit”.

 

Backups – Menú desplegable con todas las copias de seguridad disponibles.

Backup – Crea una copia de seguridad del componente.

Restore – Sustituye los valores actuales por los de la copia de seguridad seleccionada en el menú desplegable.

Remove – Elimina la copia de seguridad seleccionada en el menú desplegable.

 

Uso

CGFEditorUtilities.BackUpComponentValues<SampleScript>(serializedObject)

El parámetro del método es el tipo <T> del script del cual queremos hacer la copia de seguridad y su “SerializedObject”.

 

Locking properties

 

Enumeration

Permite deshabilitar campos del inspector según el valor seleccionado de una enumeración.

 

GIF

 

Los métodos para crear los campos en el inspector tienen una sobrecarga con dos parámetros adicionales para añadir la enumeración y el indíce de los valores de la enumeración que deshabilitará o habilitará el campo.

 

Uso

En este ejemplo los métodos para crear los campos en el inspector reciben como enumeración la variable _enum y un valor “int” que indica que valores de la _enum habilitan las campos.

public override void OnInspectorGUI()
{
     CGFEditorUtilities.BuildEnum("Enum", "Enumaration of different values", _enum);

 
     CGFEditorUtilities.BuildInt("Integer", "All integer values", _int, "cm/s", _enum, 1);

     CGFEditorUtilities.BuildIntPositive("Positive Int", "Only positive integer values", _positiveInt, "sec", _enum, 1);
 
 
     CGFEditorUtilities.BuildFloat("Float", "All float values", _float, _enum, 2);

     CGFEditorUtilities.BuildFloatPositive("Positive Float", "Only positive float values", _positiveFloat, _enum, 2);
}

Boolean

Permite deshabilitar campos del inspector según el valor de una booleana.

Los métodos para crear las propiedades en el inspector tienen una sobrecarga con un parámetro adicional para añadir la booleana que deshabilitará o habilitará la propiedad.

 

Uso

En este ejemplo las métodos reciben como parámetro de booleana bloqueadora la propiedad de “_bool”.

public override void OnInspectorGUI()
{
     CGFEditorUtilities.BuildBool("Boolean", "Locker Boolean", _bool);

 
     CGFEditorUtilities.BuildInt("Integer", "All integer values", _int, "cm/s", _bool);

     CGFEditorUtilities.BuildIntPositive("Positive Int", "Only positive integer values", _positiveInt, "sec", _bool);
 
 
     CGFEditorUtilities.BuildFloat("Float", "All float values", _float, _bool);

     CGFEditorUtilities.BuildFloatPositive("Positive Float", "Only positive float values", _positiveFloat, _bool);
}

Value Units

A los campos del inspector se les puede añadir una unidad.

 

Los métodos para crear los campos en el inspector tienen una sobrecarga con un parámetro para añadir las unidades del campo.

 

Uso

En este ejemplo se puede apreciar que el último parámetro de cada método son las unidades de cada campo.

public override void OnInspectorGUI()
{
     CGFEditorUtilities.BuildInt("Integer", "All integer values", _int, "cm/s");

     CGFEditorUtilities.BuildIntPositive("Positive Int", "Only positive integer values", _positiveInt, "sec");

     CGFEditorUtilities.BuildIntNegative("Negative Int", "Only negative integer values", _negativeInt, "km");
}
public class SampleScriptEditor : UnityEditor.Editor
{
private bool _foldOut;

private SerializedProperty _vector3;

public void OnEnable()
{
_vector3 = serializedObject.FindProperty("vector3");
}

public override void OnInspectorGUI()
{
serializedObject.Update();

_foldOut = CGFEditorUtilities.BuildContentFoldOut("Cube5", "Description", _foldOut);

if(_foldOut)
{
CGFEditorUtilities.BuildVector3("Position", "Description", _vector3);
}

serializedObject.ApplyModifiedProperties();
}
}

Tools

Animation Clip Settings

Archivos: CGFAnimationClipSettingsTool.cs
Ruta: “CGF/Editor/Tools”
Menu: “Window/Chloroplast Games Framework/Animation Clip Settings Tool”

Herramienta que permite canviar el sample rate de uno o varios clips de animación.

Sample Rate – El nuevo sample rate.

Uso

Se debe seleccionar uno o varios clips de animación para cambiar sus ajustes.

Animation Hiearchy Editor

Archivos: CGFAnimationHierarchyEditorTool.cs
Ruta: “CGF/Editor/Tools”
Menu: “Window/Chloroplast Games Framework/Animation Hierarchy Editor Tool”

Herramienta que permite canviar la ruta de la jerarquía de las animaciones de un clip de animación.

Selected Animator – Animator seleccionado.

Selected Animator Controller – Animator Controller seleccionado.

Selected Animation Clip – Clip de animación seleccionado o clips de animación del gameobject o Animator Controller seleccionado.

Mode – Modo de reemplazo en grupo.

  • Path – Modo reemplazo en el que se reemplaza texto.
  • GameObject – Modo reemplazo en el que se reemplazan gameobjects.

Path/GameObject – Texto o gameobject original.

Replacement – Reemplazo del texto o gameobject original.

Path – Ruta de la jerarquía del game object animado.

Object – Gameobject o prefab al que afecta la animación.

Uso

Se debe seleccionar un gameobject o prefab con un Animator o un Animator Controller, un Animator Controller o un Animation Clip.

Después se puede canviar la ruta de la jerarquía de una animación cambiando su campo de texto (Path) y presionar el botón Change o cambiar el gameobject o prefab al que afecta la animación (Object). Para deshacer el cambio se debe utilizar el botón Revert.

Si el gameobject o Animator Controller seleccionado tiene multiples clips de animación se puede cambiar de clip de animación desde el menú desplegable Selected Animation Clip.

Cuando alguna propiedad se vuelva de color amarillo significará que la ruta de la jerarquía o el gameobject se ha perdido.

Se pueden reemplazar en masa la ruta de la jerarquía de una animación con el sistema de reemplazo en masa.

Collider Settings

Archivos: CGFColliderSettingsTool.cs
Ruta: “CGF/Editor/Tools”
Menu: “Window/Chloroplast Games Framework/Collider Settings Tool”

Herramienta que permite canviar la configuración de todos los colliders de un GameObject o prefab seleccionado.

Convex – Activa o desactiva la propiedad Convex. Solo para el MeshCollider.
Is Trigger – Activa o desactiva la propiedad Is Trigger.
Used By Effector – Activa o desactiva la propiedad Used By Effector. Solo para Colliders 2D.
Affect Children – Activa o desactiva las propiedades de los colliders de los hijos del gameobject seleccionado.

Uso

Se debe seleccionar un o multiples gameobject o prefab con un collider o multiples colliders con el mismo tipo de collider para cambiar las propiedades de sus colliders.

Component Sorter

Archivos: CGFComponentSorterTool.cs
Ruta: “CGF/Editor/Tools”
Menu: “Window/Chloroplast Games Framework/Component Sorter Tool”

Herramienta que permite ordenar los componentes de un gameobject o de un prefab.

Uso

Se debe seleccionar un gameobject o prefab para ordenar (drag and drop) sus componentes.

Missing Component Finder

Archivos: CGFMissingComponentFinderTool.cs
Ruta: “CGF/Editor/Tools”
Menu: “Window/Chloroplast Games Framework/Missing Component Finder Tool”

Herramienta que permite buscar los missing scripts de los gameobjects de la escena, el proyecto o los gameobject y carpetas seleccionadas.

Permite buscar missing components de gameobjects de tres maneras distintas.

  • Project – Busca missing components en los prefabs y sus hijos de la carpeta del proyeto.
  • Scene – Busca missing components en los gameobjects y sus hijos de la escena actual.
  • Selected – Busca missing components en los elementos seleccionados, ya sean gameobjects, prefabs o carpetas.

Object Replacer

Archivos: CGFObjectReplacerTool.cs
Ruta: “CGF/Editor/Tools”
Menu: “Window/Chloroplast Games Framework/Object Replacer Tool”

Herramienta que permite reemplazar un gameobject de la escena por otro o un prefab.

Replacement – Gameobject or prefab que reemplaza el gameobject seleccionado.
Transform Replacement – Original, mantiene los valores del transform del gameobject o prefab original. Replacement, utiliza los valores del transform del objeto o prefab reemplazo. Custom, utiliza el valor de la propiedad Position, Rotation y Scale.
Position – Nueva posición. Solo en modo Custom.
Rotation – Nueva rotación. Solo en modo Custom.
Scale – Nueva escala. Solo en modo Custom.
Selected GameObjects – Lista de gameobjects seleccionados.

Uso

Se debe arrastrar un gameobject o prefab a la propiedad Replacement, configurar el modo del transform y dar al botón Replace.

También se puede reemplazar cada uno de los objetos seleccionados por separado.

Sorting Layer Manager

Archivos: CGFSortingLayerManagerTool.cs
Ruta: “CGF/Editor/Tools”
Menu: “Window/Chloroplast Games Framework/Sorting Layer Manager Tool”

Herramienta que permite ordenar de una forma cómoda la sorting layer y el order in layer de los elementos de la escena actual.

Uso

En la lista reordenable de la parte superior se puede ordenar (drag and drop), crear y eliminar sorting layer.

En las listas reordenables de la parte inferior se puede ordenar (drag and drop) el order in layer de cada gameobject. Muestra todos los tipos de renderers (SpriteRenderer, ParticleSystem (ParticleRenderer), LineRenderer, TrailRenderer) menos el MeshRenderer. También permite mover un gameobject de una soprting layer a otra.

Si se elimina una sorting layer los gameobjects que contiene se mueve a la sorting layer “Default”.

No se debe utilizar el gestor de sorting layer de Unity y el Sorting Layer Manager Tool porque puede provocar errores.

Sprite Bulk Editor

Archivos: CGFSpriteBulkEditorTool.cs
Ruta: “CGF/Editor/Tools”
Menu: “Window/Chloroplast Games Framework/Sprite Bulk Editor Tool”

Herramienta que permite modificar el pivote de los sprites seleccionados.

Dropdown menu – Posiciones predeterminadas.
Custom Position – Posición del pivote personalizada. Solo si se selecciona la opción Custom del menú desplegable.

Uso

Se debe seleccionar uno o varios sprites.

Si el Sprite Mode del sprite está configurado en Multiple, las modificaciones afectarán a todos las partes del sprite.