unity3d
Física
Buscar..
Cuerpos rígidos
Visión general
El componente Rigidbody le da a GameObject una presencia física en la escena en el sentido de que es capaz de responder a las fuerzas. Puedes aplicar fuerzas directamente a GameObject o permitir que reaccione a fuerzas externas como la gravedad u otro Rigidbody que lo golpee.
Añadiendo un componente de Rigidbody
Puede agregar un Rigidbody haciendo clic en Componente> Física> Rigidbody
Moviendo un objeto Rigidbody
Se recomienda que si aplica un Rigidbody a un GameObject, use fuerzas o torque para moverlo en lugar de manipular su Transform. Use los AddForce()
o AddTorque()
para esto:
// Add a force to the order of myForce in the forward direction of the Transform.
GetComponent<Rigidbody>().AddForce(transform.forward * myForce);
// Add torque about the Y axis to the order of myTurn.
GetComponent<Rigidbody>().AddTorque(transform.up * torque * myTurn);
Masa
Puedes alterar la masa de un objeto de juego de Rigidbody para afectar cómo reacciona con otros cuerpos y fuerzas de Rigidbody. Una masa más alta significa que GameObject tendrá más influencia sobre otros GameObjects basados en la física, y requerirá una mayor fuerza para moverse. Los objetos de diferente masa caerán a la misma velocidad si tienen los mismos valores de arrastre. Para alterar la masa en el código:
GetComponent<Rigidbody>().mass = 1000;
Arrastrar
Cuanto mayor sea el valor de arrastre, más se ralentizará un objeto mientras se mueve. Piénsalo como una fuerza opuesta. Para alterar el arrastre en el código:
GetComponent<Rigidbody>().drag = 10;
es cinemático
Si marca un Rigidbody como Cinemático, entonces no puede ser afectado por otras fuerzas, pero puede afectar a otros GameObjects. Para alterar en el código:
GetComponent<Rigidbody>().isKinematic = true;
Restricciones
También es posible agregar restricciones a cada eje para congelar la posición o rotación del Rigidbody en el espacio local. El valor predeterminado es RigidbodyConstraints.None
como se muestra aquí:
Un ejemplo de restricciones en el código:
// Freeze rotation on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotation
// Freeze position on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePosition
// Freeze rotation and motion an all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll
Puede utilizar el operador bit a bit o |
para combinar múltiples restricciones como tal:
// Allow rotation on X and Y axes and motion on Y and Z axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionZ |
RigidbodyConstraints.FreezeRotationX;
Colisiones
Si quieres un GameObject con un Rigidbody en él para responder a las colisiones, también necesitarás agregarle un colisionador. Los tipos de colisionador son:
- Box Collider
- Colisionador de esfera
- Colisionador de cápsulas
- Colisionador de ruedas
- Colisionador de malla
Si aplica más de un colisionador a un GameObject, lo llamamos un colisionador compuesto.
Puede convertir a Collider en un Trigger para utilizar los OnTriggerEnter()
, OnTriggerStay()
y OnTriggerExit()
. Un colisionador desencadenante no reaccionará físicamente a las colisiones, otros GameObjects simplemente lo atravesarán. Son útiles para detectar cuándo otro GameObject está en un área determinada o no, por ejemplo, cuando recopilamos un elemento, es posible que deseamos poder ejecutarlo pero detectar cuándo sucede esto.
Gravedad en Cuerpo Rigido
La propiedad useGravity
de un RigidBody
controla si la gravedad la afecta o no. Si se establece en false
RigidBody
se comportará como si estuviera en el espacio exterior (sin que se le aplique una fuerza constante en alguna dirección).
GetComponent<RigidBody>().useGravity = false;
Es muy útil en las situaciones en las que necesita todas las demás propiedades de RigidBody
excepto el movimiento controlado por la gravedad.
Cuando está habilitado, RigidBody
se verá afectado por una fuerza gravitacional, configurada en Physics Settings
:
La gravedad se define en unidades de mundo por segundo al cuadrado, y se ingresa aquí como un vector tridimensional: lo que significa que con los ajustes en la imagen de ejemplo, todos los RigidBodies
con la propiedad useGravity
establecida en True
experimentarán una fuerza de 9.81 unidades mundiales por segundo por segundo en la dirección hacia abajo (como valores Y negativos en el sistema de coordenadas de Unity apuntan hacia abajo).