• Juegos
  • Industria
  • Recursos
  • Comunidad
  • Aprendizaje
  • Asistencia
Desarrollo
Motor de Unity
Crea juegos 2D y 3D para cualquier plataforma
DescargarPlanes y precios
Monetización
Compra dentro de la aplicación (IAP)
Descubre y gestiona IAP en todas las tiendas
Mediación
Maximiza los ingresos y optimiza la monetización
Calidad de anuncios
Protege la experiencia del usuario de tu aplicación
Tapjoy
Construye lealtad de usuarios a largo plazo
Todos los productos de monetización
Adquisición de usuarios
Adquisición de usuarios
Hazte descubrir y adquiere usuarios móviles
Unity Vector AI
Conecta a los jugadores con los juegos adecuados
Publicidad en el dispositivo Aura
Alcanza a los usuarios en el dispositivo en el momento de mayor compromiso
Todos los productos de crecimiento
Casos de uso
Colaboración 3D
Construye y revisa proyectos 3D en tiempo real
Capacitación envolvente
Capacitación en entornos envolventes
Experiencias del cliente
Crea experiencias interactivas en 3D
Todas las soluciones de la industria
Industrias
Fabricación
Logra la excelencia operativa
Venta minorista
Transforma las experiencias en tienda en experiencias en línea
Industria automotriz
Eleva la innovación y las experiencias en el automóvil
Todas las industrias
Biblioteca técnica
Documentación
Manuales de usuario oficiales y referencias de API
Herramientas para desarrolladores
Versiones de lanzamiento y rastreador de problemas
Hoja de ruta
Revisar características próximas
Glosario
Biblioteca de términos técnicos
Información útil
Casos de estudio
Historias de éxito en el mundo real
Guías de mejores prácticas
Consejos y trucos de expertos
Todos los recursos
Novedades
Blog
Actualizaciones, información y consejos técnicos
Novedades
Noticias, historias y centro de prensa
Centro de la comunidad
Discusiones
Discute, resuelve problemas y conéctate
Eventos
Eventos globales y locales
Historias de la comunidad
Hecho con Unity
Presentando a los creadores de Unity
Transmisiones en vivo
Únete a desarrolladores, creadores e insiders
Premios Unity
Celebrando a los creadores de Unity en todo el mundo
Para todos los niveles
Unity Learn
Domina las habilidades de Unity de forma gratuita
Capacitación profesional
Mejora tu equipo con entrenadores de Unity
¿No tienes experiencia con Unity?
Primeros pasos
Pon en marcha tu aprendizaje
Rutas esenciales de Unity
¿No tienes experiencia con Unity? Comienza tu viaje
Guías prácticas
Consejos prácticos y mejores prácticas
Educación
Para estudiantes
Impulsa tu carrera
Para docentes
Potencia tu enseñanza
Licencia gratuita para fines educativos
Lleva el poder de Unity a tu institución
Certificaciones
Demuestra tu dominio de Unity
Opciones de soporte
Obtener ayuda
Ayudándote a tener éxito con Unity
Planes de éxito
Alcanza tus metas más rápido con soporte experto
PREGUNTAS FRECUENTES
Respuestas a preguntas comunes
Contáctanos
Conéctate con nuestro equipo
Planes y precios
Idioma
  • English
  • Deutsch
  • 日本語
  • Français
  • Português
  • 中文
  • Español
  • Русский
  • 한국어
Social
Moneda
Comprar
  • Productos
  • Unity Ads
  • Suscripción
  • Tienda de recursos de Unity
  • Distribuidores
Educación
  • Estudiantes
  • Instructores
  • Instituciones
  • Certificación
  • Learn
  • Programa de desarrollo de habilidades
Descargar
  • Unity Hub
  • Descargar archivo
  • Programa beta
Unity Labs
  • Laboratorios
  • Publicaciones
Recursos
  • Plataforma Learn
  • Comunidad
  • Documentación
  • Preguntas y respuestas Unity
  • PREGUNTAS FRECUENTES
  • Estado de servicios
  • Casos de estudio
  • Made with Unity
Unity
  • Nuestra empresa
  • Boletín
  • Blog
  • Eventos
  • Empleos
  • Ayuda
  • Prensa
  • Socios
  • Inversionistas
  • Afiliados
  • Seguridad
  • Impacto social
  • Inclusión y diversidad
  • Contacto
Copyright © 2025 Unity Technologies
  • Legal
  • Política de privacidad
  • Cookies
  • No quiero que se venda ni se comparta mi información personal

"Unity", los logotipos de Unity y otras marcas comerciales de Unity son marcas comerciales o marcas comerciales registradas de Unity Technologies o de sus empresas afiliadas en los Estados Unidos y el resto del mundo (más información aquí). Los demás nombres o marcas son marcas comerciales de sus respectivos propietarios.

Hero background image

Usa enums basados en ScriptableObject en tu proyecto de Unity

Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.
Haz clic aquí.

Esta página explica cómo usar enums basados en ScriptableObject en tu proyecto de Unity.

Este es el tercero de una serie de seis mini-guías creadas para ayudar a los desarrolladores de Unity con la demostración que acompaña al e-book, Crea una arquitectura de juego modular en Unity con ScriptableObjects.

La demostración está inspirada en la mecánica clásica de juegos de arcade de bola y paleta, y muestra cómo los ScriptableObjects pueden ayudarte a crear componentes que sean probables, escalables y amigables para los diseñadores.

Juntos, el e-book, el proyecto de demostración y estas mini-guías proporcionan las mejores prácticas para usar patrones de diseño de programación con la clase ScriptableObject en tu proyecto de Unity. Estos consejos pueden ayudarte a simplificar tu código, reducir el uso de memoria y promover la reutilización del código.

Esta serie incluye los siguientes artículos:

  • Comienza con la demostración de ScriptableObjects de Unity
  • Separa los datos y la lógica del juego con ScriptableObjects
  • Usa ScriptableObjects como objetos delegados
  • Usa ScriptableObjects como canales de eventos en el código del juego
  • Cómo usar un conjunto en tiempo de ejecución basado en ScriptableObject
  • Nota importante antes de comenzar
  • Enums extensibles
  • Enums basados en ScriptableObject
  • ID de jugador en PaddleBallSO
  • Demostración de patrones
  • Extensión de comportamiento
  • Beneficios de los enums basados en ScriptableObject
  • Más recursos de ScriptableObject

Nota importante antes de comenzar

Antes de sumergirte en el proyecto de demostración de ScriptableObject y esta serie de mini-guías, recuerda que, en su esencia, los patrones de diseño son solo ideas. No se aplicarán a cada situación. Estas técnicas pueden ayudarte a aprender nuevas formas de trabajar con Unity y ScriptableObjects.

Cada patrón tiene pros y contras. Elige solo aquellos que beneficien de manera significativa tu proyecto específico. ¿Tus diseñadores dependen en gran medida del Editor de Unity? Un patrón basado en ScriptableObject podría ser una buena opción para ayudarles a colaborar con tus desarrolladores.

En última instancia, la mejor arquitectura de código es la que se adapta a tu proyecto y equipo.

tab 1
ELIMINAR O REORDENAR VALORES ENUM PUEDE LLEVAR A UN COMPORTAMIENTO INESPERADO.

Enums extensibles

Los enums son una forma útil de gestionar un conjunto fijo de valores nombrados en tu código. Sin embargo, vienen con algunas limitaciones. Dado que los valores de enum serializados se almacenan como enteros en lugar de sus nombres simbólicos, eliminar o reordenar un valor puede llevar a un comportamiento incorrecto o inesperado. Esto significa que los enums, especialmente cuando tienes muchos de ellos, pueden crear dolores de cabeza en el desarrollo de Unity.

El enfoque estándar

Así es como se ve un enum típico:

[System.Serializable]
public enum HandGestures
{
Piedra,
Papel,
Tijeras
}

Puedes serializar un enum con el Atributo System.Serializable y aparece en el Inspector.

El problema

Reordenar o eliminar un valor puede causar problemas. Debido a que cada valor internamente es un entero, lo que representa puede convertirse en algo diferente. En el ejemplo dado, eliminar el valor de Papel haría que Tijeras asumiera el valor de 1.

O, si agregamos un valor como en el ejemplo a continuación.

El valor de enum seleccionado cambiaría si viene después de la entrada eliminada.

Esto puede causar problemas al mantener y actualizar proyectos, particularmente cuando tu enum contiene numerosos valores. Puedes mitigar este problema dejando un elemento en blanco o no utilizado, o estableciendo explícitamente valores enteros. Sin embargo, ninguna de las soluciones es ideal.

Descargar PaddleBallSO
tab3
VERIFICANDO LA IGUALDAD ENTRE SCRIPTABLEOBJECTS

Enums basados en ScriptableObject

Los enums basados en ScriptableObject te dan la funcionalidad de los enums tradicionales pero se almacenan como activos individuales. Por ejemplo, mira el ScriptableObject PlayerIDSO en el proyecto PaddleBallSO en el ejemplo a continuación.

Esencialmente, este es un ScriptableObject en blanco.

Puedes usar eso para crear una serie de activos ScriptableObject en el proyecto, como P1, P2, etc. Incluso cuando no contienen ningún dato, puedes usar ScriptableObjects para comparación. Simplemente crea un nuevo activo ScriptableObject en el proyecto y dale un nombre.

Puedes crear tantos ID de jugador como necesites dentro del proyecto y cambiar fácilmente entre ellos. Solo cambia el activo asignado en el script GameDataSO.

Si estás comprobando la igualdad, esto funciona de manera similar a un enum. ¿Dos variables se refieren al mismo ScriptableObject? Si es así, son del mismo tipo de elemento. De lo contrario, no lo son.

Incluso sin datos adicionales, el ScriptableObject representa una categoría o tipo de elemento.

ID de jugador en PaddleBallSO

En PaddleBallSO, el PlayerIDSO se convierte en una designación de equipo. Usamos los activos P1 y P2 en el GameDataSO para diferenciar entre las dos palas.

El script GameSetup asigna a cada pala un ID de jugador. Durante el juego, los scripts Paddle comparan la entrada del jugador con el ID de equipo designado.

Esto tiene aplicaciones para cualquier tipo de juego multijugador. Alternativamente, considera adoptarlos donde sea que necesites un enum.

Dado que son simplemente asignaciones en el Inspector, los ScriptableObjects no están sujetos a los mismos problemas de renombrado y reordenamiento.

¿Quieres cambiar los nombres de los identificadores a “Jugador1” o “Jugador2,” respectivamente? Puedes hacerlo, y todo sigue funcionando. ¿Agregar más ScriptableObjects? No hay problema: la asignación de activos en el Inspector sigue siendo la misma.

tab5
LOS BLOQUES UTILIZAN EQUIPOS ASIGNADOS PARA COMPARACIONES.

Demostración de patrones

Este comportamiento es útil para crear jugabilidad. En la demostración de Patrones, haz clic en el botón Cambiar Enum para cambiar de equipos. Un MonoBehaviour en el DemoBall actualiza el SpriteRenderer en consecuencia.

¿La bola inflige daño a un Bloque cuando colisiona? Descúbrelo ejecutando una prueba rápida de igualdad. Aquí hay una forma de compararlos en el ejemplo de código a continuación.

Este método puede determinar si dos GameObjects están en el mismo equipo, lo cual es útil al verificar interacciones amistosas versus enemigas. Esta comparación simple puede aplicarse a recogidas de objetos, daño o cualquier otra cosa que tenga un "equipo" o "alineación".

Descargar PaddleBallSO

Extensión de comportamiento

La parte divertida ocurre cuando agregas lógica a tus ScriptableObjects. A diferencia de un enum convencional, un ScriptableObject puede tener campos y métodos, además de contener datos.

Utiliza estos para que cada ScriptableObject pueda tener lógica de comparación especializada. Por ejemplo, podrías tener un ScriptableObject que define efectos de daño especiales (por ejemplo, frío, calor, eléctrico, mágico, etc.).

Si tu aplicación requiere un sistema de inventario para equipar elementos de jugabilidad, los ScriptableObjects pueden representar tipos de elementos o ranuras de armas. ¿Ciertos personajes no pueden sostener ciertos elementos? ¿Algunos elementos son mágicos o tienen habilidades especiales? Los enums basados en ScriptableObject pueden agregar métodos para verificar eso.

El MonoBehaviour DemoBall en el ejemplo anterior incluye el método AreEqual para comparar ScriptableObjects. Al extender el comportamiento, puedes agrupar la lógica de comparación dentro del ScriptableObject mismo.

En la demostración de Patrones, podrías modificar la bola para que sea más selectiva al colisionar con un objeto. Mira un elemento de propósito general para colisiones en el ejemplo de código a continuación.

Esto podría lograr resultados similares a la demostración actual, pero ahora tiene un campo m_Weakness. Esto permite que cada ScriptableObject defina otro ScriptableObject para destruir en colisión.

En lugar de llamar al método AreEqual, cada ScriptableObject simplemente gestiona su propia lógica de comparación.

El resultado es más flexible y extensible. En lugar de hacer que la bola destruya un bloque de un equipo diferente, puedes ser específico. Múltiples bolas en la escena podrían destruir diferentes bloques, dependiendo de sus CollisionItems individuales.

Esto establece el escenario para interacciones diferentes y más complejas. Si quisieras hacer un sistema de piedra-papel-tijera, podrías definir tres ScriptableObjects: Piedra, Papel y Tijera. Cada uno podría tener su propia m_Weakness única y usar el método IsWinner para manejar las interacciones.

A diferencia de los enums, los ScriptableObjects hacen que este proceso sea modular y adaptable. No hay necesidad de depender de estructuras de datos adicionales o agregar lógica extra para sincronizar con un conjunto de datos separado. Simplemente agrega un campo y/o método adicional para manejar la lógica.

Beneficios de los enums basados en ScriptableObject

Una vez que estés familiarizado con los enums basados en ScriptableObject, encontrarás que pueden mejorar tu flujo de trabajo, especialmente al trabajar con compañeros de equipo. Dado que son activos, actualizarlos crea menos conflictos de fusión, reduciendo el riesgo de pérdida de datos.

Agregar nuevos enums basados en ScriptableObject es como crear otro activo. A diferencia de los enums tradicionales, agregar nuevos valores no romperá tu código existente. Además, Unity ya tiene herramientas integradas para buscar, filtrar y organizar, al igual que cualquier otro activo.

Como un bono, usar la interfaz de arrastrar y soltar del Editor permite a tus diseñadores extender los datos de juego sin soporte adicional de un desarrollador de software. Aún necesitarás coordinar cómo configurar los campos inicialmente, pero los diseñadores pueden luego llenar esos campos con datos por su cuenta.

Descargar PaddleBallSO
outro scriptable

Más recursos de ScriptableObject

Los enums basados en ScriptableObject son un recurso más que tu equipo puede usar para mejorar la colaboración y la eficiencia.

Lee más sobre patrones de diseño con ScriptableObjects en nuestro libro técnico Crear una arquitectura de juego modular en Unity con ScriptableObjects. También puedes encontrar más información sobre patrones de diseño comunes en el desarrollo de Unity en Mejora tu código con patrones de programación de juegos.