Supongamos que estás creando un videojuego de rol y necesitas una forma más fácil de asignar estadísticas, propiedades y mucho más a varios elementos. Si bien puede usar prefabs de Unity para hacer esto y luego cambiar los valores de cada copia individual del prefab, esta es una forma incómoda de llevar a cabo la tarea. Para empezar, este método consume más de su memoria, algo que puede necesitar conservar si planea hacer un juego grande. Además, si tienes que hacer algún cambio en los objetos del juego, simplemente no es tan eficiente hacerlo cuando hay varias copias de prefabricados por ahí. Esto especialmente se convierte en un problema si tienes un equipo más grande con el que trabajar, por lo que querrás hacer que las cosas sean más fáciles de cambiar para otros miembros del equipo. Incluso si no estás en un equipo, este método sería más difícil para ti mientras trabajas.
Para facilitar las cosas en una situación como esta, tiene Objetos con scripts a su disposición. ¿Y qué son los Objetos con Scripts? En pocas palabras, son contenedores de datos. El desarrollador de Unity crea una plantilla básica para estos contenedores, definiendo qué información debe contener cada objeto. Luego, los objetos de Scriptable se crean a partir de esa plantilla, que luego son utilizados por los objetos de juego de Unity. En el ejemplo anterior, se puede usar un único objeto de scripts para definir cuáles son las diferentes propiedades de un elemento. A continuación, todas las copias del elemento hacen referencia a ese objeto con scripts. Antes, si querías cambiar las estadísticas de un elemento, tenías que cambiar los valores de cada copia del elemento. Ahora, con Objetos con scripts, solo necesita cambiar un objeto (el Objeto con Scripts) y todos los objetos que obtienen datos de ese Objeto con Scripts cambian al mismo tiempo.
Siempre es útil ver estas cosas en acción, crear un nuevo proyecto. Este proyecto muestra Objetos con scripts y cómo pueden ayudarte. El proyecto consta de tres objetos de juego destinados a representar a tres personajes. Cada carácter hereda algunos valores de un objeto con scripts. Esos valores son máxima salud, ataque, defensa, velocidad, y un nombre y color para el personaje. Una interfaz de usuario sencilla muestra estos valores para que pueda ver fácilmente los resultados de la aplicación de objetos con scripts. Ahora que tienes un objetivo final, es hora de empezar a crear.
Configuración del proyecto
Asumiendo que implementarás estas ideas en un nuevo proyecto, abre la aplicación Unity Hub y crea un nuevo proyecto como se muestra en la Figura 1.
Figura 1: Creación de un nuevo proyecto
En la siguiente ventana, asigne al proyecto el nombre que desee y decida la ruta de acceso del archivo. Aunque puede realizar este proyecto en cualquier plantilla, este ejemplo utiliza la plantilla de proyecto 3D como se muestra en la Figura 2. Se recomienda que utilices esta plantilla si deseas seguirla.
Figura 2: Configuración del nombre, tipo y ubicación del proyecto
Una vez creado el proyecto, querrá organizarse. En la ventana de recursos, deberá crear tres carpetas haciendo clic con el botón secundario en la ventana y navegando hasta la carpeta Create->, como se muestra en la Figura 3, Nombre de las carpetas Materiales, Objetos con scripts y Scripts.
Figura 3: Crear una nueva carpeta
Mientras estés aquí, es una buena idea seguir adelante y hacer tres materiales. Estos materiales se utilizan para cambiar los colores de diferentes objetos siguiendo cualquier material que especifique el Objeto con scripts. Para crear estos materiales, vaya a la carpeta Materiales y haga clic con el botón secundario de nuevo, esta vez seleccionando Crear-> Material. Al nombrar el material, se recomienda darle un nombre que se correlacione con su color. Por ejemplo, este primer material puede llamarse Rojo. Para establecer este color, debe seleccionar el material recién creado y navegar a la ventana Inspector. En el campo de Albedo, hay un selector de color que se muestra en la Figura 4, puede hacer clic para abrir el, bueno, selector de color.
Figura 4: Abrir el selector de color
El color se cambia moviendo el círculo pequeño en el selector de color o introduciendo directamente los valores RGB en la mitad inferior de la ventana del selector de color. En el ejemplo anterior, los valores RGB serían 255, 0, 0. Después de esto, debe crear dos materiales más y asignar sus colores. Este ejemplo usa verde y azul, pero pueden ser de cualquier color de su elección.
Ahora llega el momento de crear la escena real aquí donde se lleva a cabo este juego. Consta de dos partes principales: está la interfaz de usuario que muestra las estadísticas dadas a varios objetos con scripts y las tres cápsulas que representan caracteres. Los «personajes» son la parte más fácil, así que puedes empezar por ahí. Todo lo que tiene que hacer es ir a la ventana Jerarquía, hacer clic en el botón Crear y elegir Objeto 3D -> Cápsula que se muestra en la Figura 5. Haga esto tres veces o copie el primer objeto, y también puede darles nombres si lo desea. Este ejemplo da a las cápsulas los nombres Char1, Char2, Char3.
Figura 5: Creación de un objeto cápsula
Deberá cambiar sus posiciones para que no se superpongan entre sí. Para cambiar la posición del objeto, seleccione uno en la jerarquía y vaya al componente Transformar en el Inspector. A continuación, cambie los campos de posicionamiento x, y y z para mover los objetos donde desee.
Figura 6: Edición de la posición del objeto
La tabla 1 muestra las posiciones exactas de las tres cápsulas en este ejemplo.
Cuadro 1: Todos los objetos y sus posiciones en el mundo
Objeto |
Posición X |
Posición Y |
Posición Z |
Char1 |
|||
Char2 |
|||
Char3 |
Por supuesto, siéntete libre para ajustar cualquiera de estos números, si lo desea. Lo siguiente es la interfaz de usuario, que muestra los valores dados a los objetos con scripts. Para empezar, tendrás que hacer clic en el botón Crear de la jerarquía, pero esta vez elige UI -> Canvas. A continuación, con el nuevo objeto Lienzo seleccionado, haga clic de nuevo en el botón Crear y esta vez seleccione Crear Hijo vacío. Finalmente, una vez más, haga clic en el botón Crear y esta vez elija UI -> Texto. Arrastre el objeto de texto recién creado al objeto de juego vacío y duplique el texto cuatro veces usando Ctrl + D para que haya un total de cinco objetos de texto bajo Objeto de juego. Una vez terminado, su Jerarquía debería parecerse a la de la Figura 7.
Figura 7: La Jerarquía actual
Cada objeto de texto se correlaciona con el nombre y las estadísticas que se dan a través de un Objeto de Scriptable, siendo esas estadísticas la salud máxima, el ataque, la defensa y la velocidad. Es útil cambiar los nombres de los objetos de texto al valor que representan. Por lo tanto, el primer objeto de texto se puede llamar name_text, y el segundo se puede llamar attack_text, y así sucesivamente. Además, tendrá que cambiar el texto predeterminado para ayudar a proporcionar una imagen visual de cómo se ve la interfaz de usuario. Esto se hace navegando al componente de texto en el Inspector y cambiando el valor del texto. Y, por último, ajuste sus posiciones para que no estén todas apiladas una encima de la otra. Para que esto sea fácil, la Tabla 2 muestra todos los diferentes nombres de objetos y cuáles deben ser sus valores respectivos.
Tabla 2: Todos los objetos de texto y sus valores predeterminados de texto y posicionamiento
Cambie el nombre de GameObject (en Canvas) a algo un poco más descriptivo, como Char1Description, y, a continuación, duplique el objeto principal. Cambie el nombre de los dos duplicados a Char2Description y Char3Description y coloque los tres objetos, de modo que estén por encima de los objetos cápsula. Este ejemplo coloca Char1Description en una posición X de -300, Char2Descrption en 0 y Char3Position en 250. Todos los valores de posición Y y Z se dejan en 0.
Fue un camino un poco largo, ¡pero la configuración del proyecto está completa! Ahora llega el momento de codificar y ver cómo se crean los objetos con scripts en lo que respecta a la programación. En la ventana Activos, vaya a la carpeta Scripts y cree dos nuevos scripts haciendo clic con el botón derecho y navegando hasta Crear-> Script C#. Estos scripts deben llamarse CharStats y LoadStats. Una vez que se hayan creado, comenzará en el script CharStats, así que haga doble clic en este script para abrir Visual Studio y comenzar con el proceso de codificación.
Script CharStats
Para crear un objeto con scripts, primero deberá agregarlo al menú Create
que ha utilizado para crear materiales y scripts. Para hacer esto, usará el atributo CreateAssetMenu
y especificará el nombre de archivo y la ubicación predeterminados dentro del menú. Además, necesitarás cambiar de qué clase CharStats
está heredando. De forma predeterminada, cada clase C# en un proyecto de Unity hereda de MonoBehaviour
, pero este script necesita heredar de ScriptableObject
en su lugar.
Observe al configurar menuName
que se utiliza un carácter de barra diagonal, que indica el uso de submenús. Si lo desea, puede eliminar la barra diagonal y simplemente tener presente la opción de Unidades de reproductor sin necesidad de navegar más a través del menú Crear. En este caso, el submenú se agregó principalmente para mostrar que puede organizar sus Objetos de scripts según lo que desee. En este caso, el menú es Crear- > Creación de personajes – > Unidades de jugador. Si lo desea, en otro objeto con scripts puede hacer que el objeto se cree a partir de la misma ruta pero con una opción de creación diferente, como Item.
Al ser un objeto con scripts, no hay necesidad de los métodos predeterminados Start
y Update, por lo que puede eliminarlos. El propósito principal de este objeto es retener datos que se dan a otro objeto, pero también se crean dos métodos personalizados para demostrar cómo los objetos con scripts pueden hacer más que solo retener datos. Hablando de datos, el código para la definición de los datos de este objeto contiene va como esta:
1
2
3
4
5
6
|
public string charName;
public int ataque;
public int defensa;
public int velocidad;
public int maxHealth;
material público newColor;
|
Como se mencionó anteriormente, cada objeto de scriptable contiene un nombre y algunos valores para cuatro estadísticas diferentes. También contiene información sobre el nuevo color del carácter una vez que se aplica el Objeto de Scriptable. Los valores de cada uno se definen en el editor de Unity y, por supuesto, serán diferentes para cada objeto creado.
Los dos métodos se mantienen simples. Uno simplemente imprime un mensaje a la consola de depuración diciendo que el carácter se cargó. Este mensaje se imprime en el método Start
del script LoadStats
.
1
2
3
4
|
public void PrintMessage()
{
de Depuración.Log (Se ha cargado el carácter » + charName+».»);
}
|
RandomizeStats
, el segundo método, hace exactamente lo que el nombre sugiere. Cambia los valores del Objeto de scripts a un número aleatorio entre 1 y 20. Más adelante, programará el proyecto para actualizar automáticamente la interfaz de usuario con los nuevos valores. ¡Pero esa no es la parte más interesante! Los datos de un objeto con scripts son persistentes, lo que significa que seguirán siendo los mismos durante la sesión hasta que se cierre el juego. Esto es especialmente útil si está creando un juego que consta de varias escenas, ya que normalmente se eliminan los objetos antiguos y se recargan los nuevos a medida que se abre una nueva escena. Sin embargo, los datos de objetos de scripts no se tocan en la transición entre escenas. Además, los datos siguen siendo los mismos mientras se trabaja en el editor de Unity hasta que el editor en sí se cierra. Esto significa que los cambios realizados en los datos dentro de Objetos de scripts mientras se ejecuta el juego desde el editor están presentes una vez que se vuelve a jugar desde el editor, siempre que no se realicen cambios en los datos en sí.
Esto es todo lo que hay en el script CharStats. Puede parecer bastante simple, pero el proyecto no está completo. Ha programado la capacidad de crear objetos con scripts con sus propios métodos y datos, pero los personajes de la cápsula no saben nada sobre estos objetos. En lo que a ellos respecta, los Objetos que se pueden escribir no existen. Para solucionar esto, deberá abrir el script LoadStats y codificarlo para que los objetos puedan usar los datos de un objeto con scripts para actualizar la interfaz de usuario y cambiar su color. El código debería ser similar a la Figura 8.
Figura 8: Script CharStats completo
Script LoadStats
No se preocupe por cambiar dónde hereda la clase de este script. El valor predeterminado MonoBehaviour
es precisamente lo que se necesita. En su lugar, incluya una nueva instrucción using en la parte superior.
1
|
el uso de UnityEngine.UI;
|
Incluir esto le permite obtener el texto de la interfaz de usuario y actualizarlo para mostrar los valores encontrados en los objetos con scripts. Ahora, en la clase misma, comenzando con variables.
1
2
3
4
5
6
7
8
|
// scriptable object
public CharStats charStat;
public Text nameText;
public Text attackText;
public Text defenseText;
public Text speedText;
public Text maxHealthText;
public MeshRenderer currentColor;
|
Como se indica en el comentario, la variable charStat
es el Objeto de Scriptable que se utiliza. Puede ver aquí que obtener estos objetos con scripts no es diferente de declarar cualquier otra variable. Más adelante en el script, obtendrá las variables y métodos dentro del objeto y los usará en este script. De hecho, el método PrintMessage
que se encuentra en CharStats
se usa en el método LoadStats
Start
en este momento.
1
2
3
4
5
|
void Start()
{
DisplayStats();
charStat.Mensaje de impresión();
}
|
Al igual que con cualquier otro script externo, todo lo que necesita hacer es llamar a charStat
seguido de PrintMessage
para obtener el método que se encuentra en ese objeto de script. Esto puede resultar especialmente útil si tiene objetos que tienen comportamientos similares o idénticos. En este caso, también puede ser útil para el desarrollador, como en este ejemplo, imprimir mensajes en la consola de depuración. Si algo saliera mal y sospechara que el Objeto de Scriptable tenía la culpa, podría usar los mensajes de la consola de depuración para encontrar el problema.
En este momento, hay un error que dice que DisplayStats
no existe. Para solucionar esto, navegue por debajo del método Update
y agregue este código.
Aquí es donde salen a jugar los valores almacenados en el objeto de Scriptable. ¿Todas esas variables de texto declaradas antes? Se les darán datos para mostrar, por lo que los signos de interrogación que establezca en el editor ahora mostrarán algún valor. Además, aunque no es realmente una estadística, en sí, el color del carácter se cambia aquí llamando a currentColor.material
y ajustándolo al material establecido en el objeto de Scriptable.
El segundo método charStats
, RandomizeStats
, aún no se ha utilizado, por lo que debe encontrar un lugar para él. En el método Update
, el programa comprueba si se ha pulsado la barra espaciadora. Si lo tiene, entonces llama a RandomizeStats
y le da al objeto Scriptable algunos valores nuevos. A continuación, se vuelve a llamar a DisplayStat
y se muestran los nuevos valores.
1
2
3
4
5
6
7
8
|
void Update()
{
if (Input.GetKeyDown (Código clave.Espacio))
{
charStat.RandomizeStats ();
();
}
}
|
Esto concluye el script LoadStats
, finalizando así la parte de codificación de este proyecto. El código debería ser similar a la Figura 9. Todo lo que queda por hacer ahora es crear algunos objetos con scripts, aplicarlos al objeto cápsula usando LoadStats
y probar esta nueva funcionalidad. Por supuesto, asegúrate de guardar tu trabajo antes de volver al editor de Unity.
Figura 9: Completar el script LoadStats
Completar el proyecto
Para usar objetos con scripts, primero debe crearlos. En la ventana Activos, en la carpeta Objetos de scripts, haga clic con el botón secundario y vaya a Crear-> Creación de personajes- > Unidades de reproductor, como se muestra en la Figura 10.
Figura 10: Creación de una nueva Unidad de reproductor, un objeto con scripts
Puede nombrar el objeto como desee. El ejemplo basa estos objetos en las clases de juego de rol tradicionales, por lo que tendrá un guerrero, un cazador y un mago. Seleccione el nuevo objeto y, a continuación, vaya a la ventana Inspector y asigne valores a los diferentes campos. Para rellenar el Nuevo campo de color, simplemente vaya a la carpeta Materiales y haga clic en el material deseado y arrástrelo al campo, como se muestra en la Figura 11.
Figura 11: Configuración del nuevo material de color del objeto
Cree dos objetos con scripts más y haga lo mismo que antes, dándoles valores diferentes para los diferentes campos. Una vez hecho esto, vaya a la ventana de jerarquía y seleccione uno de los objetos char. A continuación, dele el script LoadStats como componente, vaya a la carpeta Scripts en la ventana Assets, busque LoadStats y arrástrelo a la ventana Inspector, como se muestra en la Figura 12.
Figura 12: Adjuntar el script LoadStats a un objeto
A continuación, deberá rellenar los campos LoadStats. Para comenzar, busque un objeto con scripts que desee usar en su primer «carácter» y aplíquelo al campo Char Stat como se muestra en la Figura 13. Recuerde que los objetos con scripts se encuentran en la ventana Activos, en Objetos con scripts.
Figura 13: Configuración en la que el objeto de Scriptable Char1 debe obtener datos
Ahora rellene los campos de texto. En la Jerarquía, expandirás Canvas seguido de expandir el objeto de descripción de caracteres que se correlaciona con el que estás editando actualmente. Por ejemplo, editar Char1 significa que querrá expandir la descripción de Char1. A continuación, tome los objetos de texto que se encuentran debajo del objeto principal y aplíquelos a los campos correspondientes, como se muestra en la Figura 14.
Figura 14: Configuración de todos los campos de texto
Una vez que se hayan llenado los campos de texto, solo necesita obtener el Renderizador de malla del objeto, para tener acceso al material, lo que permite el cambio de color. Todo lo que necesita hacer es hacer clic y arrastrar el componente de Renderizador de malla en la ventana Inspector y arrastrarlo al campo de color Actual, como se muestra en la Figura 15.
Figura 15: Ajuste del campo de color actual
Repita los pasos anteriores para los otros dos objetos de carácter y habrá terminado el proyecto. Cuando esté listo, haga clic en el botón reproducir en la parte superior del editor y observe como tres objetos casi idénticos tienen valores muy diferentes asociados a ellos. Si por alguna razón algo no se ve bien, el primer lugar para verificar serían sus Objetos con scripts y asegurarse de que los valores y colores mostrados son los que quería. Recuerde revisar nuevamente el Nuevo campo de color también.
Todos estos números y sus colores provienen de objetos con scripts, que a su vez provienen de una sola plantilla. También puede crear objetos aún más programables y conectarlos al campo Char Stat en el componente de estadísticas de carga de un objeto y tener un carácter muy diferente. Mientras ejecuta el juego (Figura 16), debería ver un mensaje en la consola de depuración en la esquina inferior izquierda que indica que se ha cargado un personaje. Hay otros dos mensajes, pero solo puede ver un mensaje sin abrir la consola de depuración completa, que se encuentra en Ventana -> General -> Consola. También puedes pulsar la barra espaciadora para obtener estadísticas completamente nuevas para tus personajes. Si detiene el juego y lo vuelve a ejecutar, notará que los valores que generó aleatoriamente persisten, lo que demuestra la persistencia de los objetos con scripts. Volverán a sus valores originales ingresando manualmente los valores en los objetos usted mismo o cerrando y reabriendo el editor.
Figura 16: Objetos con scripts en acción
Conclusión
Naturalmente, puede crear varios tipos de objetos con scripts para muchos tipos de objetos. Este ejemplo demostró su uso a través de clases de caracteres, pero también está el ejemplo de elementos antes mencionado. Incluso se puede usar para objetos mucho más pequeños, como power-ups que recuerdan a los que se encuentran en los juegos de arcade. Al usar objetos con scripts, crea un sistema sencillo y limpio en el que puede cambiar y cargar datos con unas pocas pulsaciones de teclas y ver los resultados casi al instante. El uso de objetos con scripts también significa menos scripts para crear, ya que puede usar una plantilla para varios objetos. Independientemente de si su proyecto es grande o pequeño, o si su equipo tiene muchos miembros o solo usted mismo, los Objetos con scripts pueden hacer que el desarrollo de todos sea un poco más fácil.