• 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

Rendimiento de física mejorado para un juego fluido

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í.

Este es el quinto de una serie de artículos que desglosan consejos de optimización para tus proyectos de Unity. Úsalos como guía para funcionar a tasas de fotogramas más altas con menos recursos. Una vez que hayas probado estas mejores prácticas, asegúrate de revisar las otras páginas de la serie:

  • Configurando tu proyecto de Unity para un rendimiento más fuerte
  • Optimización del rendimiento para gráficos de alta gama
  • Gestionando el uso de GPU para juegos de PC y consola
  • Programación avanzada y arquitectura de código

La física puede crear una jugabilidad intrincada, pero esto viene con un costo de rendimiento. Una vez que conozcas estos costos, puedes ajustar la simulación para gestionarlos adecuadamente. Usa estos consejos para mantenerte dentro de tu tasa de fotogramas objetivo y crear una reproducción fluida con la física integrada de Unity (NVIDIA PhysX).

Consulta nuestras últimas guías de optimización para desarrolladores y artistas de Unity 6:

  • Optimiza el rendimiento de tu juego para móviles, XR y la web en Unity
  • Optimiza el rendimiento de tu juego para consolas y PC en Unity
  • Revisa tus colisionadores
  • Usa Physics.BakeMesh
  • Ajusta tus configuraciones
  • Modifica la frecuencia de simulación
  • Usa Box Pruning para escenas grandes
  • Modifica las iteraciones del solucionador
  • Desactivar la sincronización automática de transformaciones
  • Reutilizar callbacks de colisión
  • Mover colliders estáticos
  • Usar consultas que no asignan memoria
  • Agrupar consultas para raycasting
  • Visualizar con el depurador de física

Revisa tus colisionadores

Las mallas utilizadas en física pasan por un proceso llamado cocción. Esto prepara la malla para que pueda trabajar con consultas de física como raycasts, contactos, etc.

Un MeshCollider tiene varias OpcionesDeCocción para ayudarte a validar la malla para física. Si estás seguro de que tu malla no necesita estas verificaciones, puedes desactivarlas para acelerar tu tiempo de cocción.

En las OpcionesDeCocción para cada MeshCollider, simplemente desmarca EnableMeshCleaning, WeldColocatedVertices y CookForFasterSimulation. Estas opciones son valiosas para mallas generadas proceduralmente en tiempo de ejecución, pero se pueden desactivar si tus mallas ya tienen los triángulos adecuados.

Además, si estás apuntando a PC, asegúrate de mantener habilitado Use Fast Midphase. Esto cambia a un algoritmo más rápido de PhysX 4.1 durante la fase media de la simulación (lo que ayuda a reducir un pequeño conjunto de triángulos potencialmente intersectantes para consultas de física).

Aprende más en la documentación de OpcionesDeCocción.

Interfaz de Opciones de Cocción en el editor de Unity
Opciones de cocción para una malla

Usa Physics.BakeMesh

Si estás generando mallas proceduralmente durante el juego, puedes crear un Mesh Collider en tiempo de ejecución. Agregar un componente MeshCollider directamente a la malla, sin embargo, cocina/hornéa la física en el hilo principal. Esto puede consumir un tiempo significativo de CPU.

Utiliza Physics.BakeMesh para preparar una malla para su uso con un MeshCollider y guarda los datos horneados con la malla misma. Un nuevo MeshCollider que referencia esta malla reutilizará estos datos precocinados (en lugar de hornear la malla nuevamente). Esto puede ayudar a reducir el tiempo de carga de la escena o el tiempo de instanciación más adelante.

Para optimizar el rendimiento, puedes descargar la cocción de mallas a otro hilo con el C# job system.

Consulta este ejemplo para obtener detalles sobre cómo hornear mallas a través de múltiples hilos.

Interfaz BakeMeshJob
BakeMeshJob en el Profiler

Ajusta tus configuraciones

En Player Settings, marca Prebake Collision Meshes siempre que sea posible. También recomendamos revisar la configuración de la Collision Matrix para asegurarte de que los objetos del jugador y de la mecánica del juego estén en las capas correctas.

Eliminar callbacks de triggers para capas innecesarias puede ser una gran ventaja, así que intenta simplificar tu Layer Collision Matrix. Puedes editar tus Physics Settings a través de Project Settings > Physics.

Aprende más en la documentación de la Collision Matrix.

Interfaz de configuración del proyecto de Física
Modifica los ajustes del proyecto de Física para potenciar el rendimiento.

Modifica la frecuencia de simulación

Los motores de física funcionan ejecutándose en un paso de tiempo fijo. Para ver la tasa fija a la que se está ejecutando tu proyecto, ve a Edit > Project Settings > Time.

El campo Fixed Timestep define el delta de tiempo utilizado por cada paso de física. Por ejemplo, el valor predeterminado de 0.02 segundos (20 ms) es equivalente a 50 fps, o 50 Hz.

Debido a que cada fotograma en Unity toma una cantidad variable de tiempo, no está perfectamente sincronizado con la simulación de física. El motor cuenta hasta el siguiente paso de tiempo de física. Si un fotograma se ejecuta ligeramente más lento o más rápido, Unity utiliza el tiempo transcurrido para saber cuándo ejecutar la simulación de física en el paso de tiempo adecuado.

En el caso de que un fotograma tarde mucho en prepararse, esto puede llevar a problemas de rendimiento. Por ejemplo, si tu juego experimenta un pico (por ejemplo, instanciando muchos GameObjects o cargando un archivo desde el disco), el fotograma podría tardar 40 ms o más en ejecutarse. Con el paso de tiempo fijo predeterminado de 20 ms, esto haría que se ejecutaran dos simulaciones de física en el siguiente fotograma para "ponerse al día" con el paso de tiempo variable.

Las simulaciones de física adicionales, a su vez, añaden más tiempo para procesar el fotograma. En plataformas de gama baja, esto puede llevar a un espiral descendente de rendimiento.

Un fotograma subsiguiente que tarda más en prepararse hace que la acumulación de simulaciones de física sea más larga también. Esto lleva a fotogramas aún más lentos y aún más simulaciones que ejecutar por fotograma. El resultado es un rendimiento cada vez peor.

Eventualmente, el tiempo entre actualizaciones de física podría exceder el paso de tiempo máximo permitido. Después de este corte, Unity comienza a descartar actualizaciones de física, y el juego se entrecorta.

Para evitar problemas de rendimiento con la física:

  • Reduce la frecuencia de simulación. Para plataformas de gama baja, aumenta el Paso de Tiempo Fijo a ligeramente más que tu tasa de fotogramas objetivo. Por ejemplo, usa 0.035 segundos para 30ps en móvil. Esto podría ayudar a prevenir esa espiral descendente de rendimiento.
  • Disminuye el Paso de Tiempo Máximo Permitido. Usar un valor más pequeño (como 0.1 s) sacrifica algo de precisión en la simulación de física, pero también limita cuántas actualizaciones de física pueden ocurrir en un fotograma. Experimenta con valores para encontrar algo que funcione para los requisitos de tu proyecto.

Simula el paso de física manualmente si es necesario eligiendo el Modo de Simulación durante la fase de actualización del fotograma. Esto te permite tomar el control de cuándo ejecutar el paso de física. Pasa Time.deltaTime a Physics.Simulate para mantener la física sincronizada con el tiempo de simulación. Este enfoque puede causar inestabilidades en la simulación de física en escenas con física compleja o tiempos de fotogramas altamente variables, así que úsalo con precaución.

Aprende más en la documentación de Physics.Simulate.

Tasa de tiempo fija predeterminada en el Editor de Unity
La tasa de tiempo fija predeterminada en la Configuración del Proyecto es de 0.02 segundos (50 fotogramas por segundo).

Usa Box Pruning para escenas grandes

El motor de física de Unity se ejecuta en dos pasos:

  • La fase amplia, que recopila colisiones potenciales utilizando un algoritmo de barrido y poda.
  • La fase estrecha, donde el motor realmente calcula las colisiones.

La configuración predeterminada de la fase amplia de Barrido y Poda (Edit > Configuración del Proyecto > Física > Tipo de BroadPhase) puede generar falsos positivos para mundos que son generalmente planos y tienen muchos colisionadores. Si tu escena es grande y mayormente plana, evita este problema y cambia a Poda de Caja Automática o Poda de Multicaja Broadphase. Estas opciones dividen el mundo en una cuadrícula, donde cada celda de la cuadrícula realiza barrido y poda.

La Poda de Multicaja Broadphase te permite especificar manualmente los límites del mundo y el número de celdas de la cuadrícula, mientras que la Poda de Caja Automática calcula eso por ti.

Consulta la lista completa de propiedades de Física aquí.

Interfaz de tipo Broadphase
Tipo de Broadphase en las opciones de Física

Modifica las iteraciones del solucionador

Si deseas simular un cuerpo de física específico con más precisión, aumenta sus Rigidbody.solverIterations.

Esto anula el Physics.defaultSolverIterations, que también se puede encontrar en Editar > Configuración del Proyecto > Física > Iteraciones del Solucionador Predeterminado.

Para optimizar tus simulaciones de física, establece un valor relativamente bajo en el defaultSolveIterations del proyecto. Luego aplica valores más altos de Rigidbody.solverIterations a las instancias individuales que necesitan más detalle.

Obtén más información sobre Rigidbody.solverIterations.

Iteraciones del solucionador predeterminado
Anula las iteraciones del solucionador predeterminado por Rigidbody

Desactivar la sincronización automática de transformaciones

Por defecto, Unity no sincroniza automáticamente los cambios en los Transforms con el motor de física. En su lugar, espera hasta la próxima actualización de física o hasta que llames manualmente a Physics.SyncTransforms. Cuando esto está habilitado, cualquier Rigidbody o Collider en ese Transform o sus hijos se sincroniza automáticamente con el motor de física.

Cuándo sincronizar manualmente

Cuando autoSyncTransforms está deshabilitado, Unity solo sincroniza las transformaciones antes del paso de simulación de física en FixedUpdate o cuando se solicita explícitamente a través de Physics.Simulate. Es posible que necesites realizar sincronizaciones adicionales si utilizas APIs que leen directamente del motor de física entre cambios de Transform y la actualización de física. Los ejemplos incluyen acceder a Rigidbody.position o realizar Physics.Raycast.

Mejor práctica de rendimiento

Aunque autoSyncTransforms asegura consultas de física actualizadas, incurre en un costo de rendimiento. Cada llamada a una API relacionada con la física fuerza una sincronización, lo que puede degradar el rendimiento, especialmente con múltiples consultas sucesivas. Sigue estas mejores prácticas:

  • Desactiva autoSyncTransforms a menos que sea necesario: Solo habilítalo si la sincronización precisa y continua es crucial para la mecánica de tu juego.
  • Usa sincronización manual: Para un mejor rendimiento, sincroniza manualmente los Transforms con Physics.SyncTransforms() antes de las llamadas que requieren los últimos datos de Transform. Este enfoque es más eficiente que habilitar autoSyncTransforms globalmente.

Descubre más sobre Physics.SyncTransforms.

Auto Sync deshabilitado en una escena
Perfilando una escena en Unity con Auto Sync Transform desactivado

Reutilizar callbacks de colisión

Los arreglos de contacto son generalmente significativamente más rápidos, por lo que la recomendación general es usar esos en lugar de reutilizar callbacks de colisión, sin embargo, considera lo siguiente si tienes un caso de uso específico para ello.

Los callbacks MonoBehaviour.OnCollisionEnter, MonoBehaviour.OnCollisionStay y MonoBehaviour.OnCollisionExit toman una instancia de colisión como parámetro. Esta instancia de colisión se asigna en el montón administrado y debe ser recolectada por el recolector de basura.

Para reducir la cantidad de basura generada, habilita Physics.reuseCollisionCallbacks (también se encuentra en Configuraciones de Proyectos > Física > Reutilizar Callbacks de Colisión). Con esto activo, Unity solo asigna una única instancia de par de colisión a cada callback. Esto reduce el desperdicio para el recolector de basura y mejora el rendimiento.

La recomendación general es habilitar siempre Reutilizar Callbacks de Colisión para beneficios de rendimiento. Solo debes desactivar esta función para proyectos heredados donde el código depende de instancias individuales de la clase Collision, lo que hace impráctico almacenar campos individuales.

Aprende más sobre Physics.reuseCollisionCallbacks.

Única instancia de colisión
En la ventana de la consola de Unity, hay una única instancia de colisión en Collision Entered y Collision Stay.

Mover colliders estáticos

Los colliders estáticos son GameObjects con un componente Collider pero sin un Rigidbody.

Ten en cuenta que puedes mover un collider estático, a pesar del término “estático.” Para hacerlo, simplemente modifica la posición del cuerpo físico. Acumula los cambios de posición y sincroniza antes de la actualización de física. No necesitas agregar un componente Rigidbody al collider estático solo para moverlo.

Sin embargo, si deseas que el collider estático interactúe con otros cuerpos físicos de una manera más compleja, dale un Rigidbody cinemático. Usa Rigidbody.position y Rigidbody.rotation para moverlo en lugar de acceder al componente Transform. Esto garantiza un comportamiento más predecible del motor de física.

Nota: Si un Collider Estático 2D necesita ser movido o reconfigurado en tiempo de ejecución, entonces añade un componente Rigidbody 2D y configúralo como tipo de cuerpo Estático, ya que es más rápido simular el Collider 2D cuando tiene su propio Rigidbody 2D. Si un grupo de Colliders 2D necesita ser movido o reconfigurado en tiempo de ejecución, es más rápido que todos sean hijos de un único Rigidbody 2D oculto que mover cada GameObject individualmente.

Obtén más información sobre Rigidbodies.

Usar consultas que no asignan memoria

Para detectar y recoger colliders en proyectos 3D dentro de una cierta distancia y en una cierta dirección, utiliza raycasts y otras consultas de física como BoxCast. Ten en cuenta que

Las consultas de física que devuelven múltiples colliders como un array, como OverlapSphere o OverlapBox, necesitan asignar esos objetos en el montón administrado. Esto significa que el recolector de basura eventualmente necesita recoger los objetos asignados, lo que puede disminuir el rendimiento si sucede en el momento equivocado.

Para reducir este sobrecosto, utiliza las versiones NonAlloc de esas consultas. Por ejemplo, si estás utilizando OverlapSphere para recoger todos los colliders potenciales alrededor de un punto, utiliza OverlapSphereNonAlloc en su lugar.

Esto te permite pasar un array de colliders (el parámetro de resultados) para actuar como un búfer. El método NonAlloc funciona sin generar basura. De lo contrario, funciona como el método correspondiente que asigna.

Ten en cuenta que necesitas definir un búfer de resultados de tamaño suficiente al usar un método NonAlloc. El búfer no crece si se queda sin espacio.

Física 2D

Ten en cuenta que el consejo anterior no se aplica a las consultas de física 2D, porque en el sistema de física 2D de Unity, los métodos no tienen un sufijo "NonAlloc". En cambio, todos los métodos de física 2D, incluidos aquellos que devuelven múltiples resultados, proporcionan sobrecargas que aceptan arrays o listas. Por ejemplo, mientras que el sistema de física 3D tiene métodos como RaycastNonAlloc, el equivalente 2D simplemente utiliza una versión sobrecargada de Raycast que puede tomar un array o List como parámetro, como:

var results = new List();

int hitCount = Physics2D.Raycast(origen, dirección, contactFilter, resultados);

Al usar sobrecargas, puedes realizar consultas sin asignación en el sistema de física 2D sin necesidad de métodos especializados NonAlloc.

Aprende más en la documentación del método NonAlloc.


Agrupar consultas para raycasting

Puedes ejecutar consultas de raycast con Physics.Raycast. Sin embargo, si tienes un gran número de operaciones de raycast (por ejemplo, calcular la línea de visión para 10,000 agentes), esto puede llevar una cantidad significativa de tiempo de CPU.

Usa RaycastCommand para agrupar la consulta utilizando el sistema de trabajos de C#. Esto descarga el trabajo del hilo principal para que los raycasts puedan ocurrir de manera asíncrona y en paralelo.

Consulta un ejemplo en la documentación de RaycastCommands.

Visualizar con el depurador de física

Usa la ventana de depuración de física (Ventana > Análisis > Depurador de Física) para ayudar a solucionar cualquier problema con los colliders o discrepancias. Esto muestra un indicador codificado por colores de los GameObjects que pueden colisionar entre sí.

Para más información, consulta la documentación del Depurador de Física.

Interfaz del depurador de física
arte clave de unity 21 11
Más consejos para desarrolladores y creadores de Unity

Encuentra más prácticas recomendadas y consejos en el centro de prácticas recomendadas de Unity. Elige entre más de 30 guías, creadas por expertos de la industria y por ingenieros y artistas técnicos de Unity, que te ayudarán a desarrollar de manera eficiente con las herramientas y sistemas de Unity.

Centro de prácticas recomendadas