-
Notifications
You must be signed in to change notification settings - Fork 8
Description
A la hora de programar Alineamiento (una clase importante en Millington porque es la base de algunas otras), no parece que Agente responda bien cuando le damos aceleración angular (en algunos casos el personaje rota a gran velocidad y sin mucho control.... en otros directamente no rota nada). Seguramente hay algún ERROR EN EL CÓDIGO por la manera en que se le asigna el torque (¿estamos teniendo en cuenta que la aceleración angular no es más que un valor real positivo o negativo que representa los grados por segundo en un sentido o en otro que hay que cambiar la orientación del agente?), o si simplemente es un problema de inercia (aunque tengamos Llegada Angular, funciona igual que Llegada Lineal: lo único que hacemos a lo sumo es decelerar hasta imprimir una aceleración de cero pero NO estamos proponiendo aceleraciones negativas que deberíamos proponer también, ojo).
El error más grave parece este: en FixedUpdate, estamos aplicando un torque (aceleración angular física) con AddTorque... pero inmediatamente después llamamos a LookDirection(), una función que SOBREESCRIBE transform.rotation usando un suavizado (SmoothDampAngle) basado en la dirección del movimiento lineal; además hecho de tal manera que SÓLO ROTO cuando me estoy moviendo linealmente y siempre en el sentido de mi movimiento ¡Esto no deberíamos hacerlo en Agente, habría que quitar ese LookDirection directamente... y si alguien lo quiere hacer, que use un steering behavior para ello!
Por si acaso, confirma también que en Unity el Rigidbody tenga algo de Angular Drag (rozamiento angular) en el Inspector (un valor entre 0.5 y 2.0 o algo así, para estabilizar y evitar rotaciones descontroladas...)
El código quedaría algo así:
if (Mathf.Abs(direccion.angular) > 0.01f) // Un pequeño umbral para evitar jitter, eso sí
{
float torqueAAplicar = Mathf.Clamp(direccion.angular, -aceleracionAngularMax, aceleracionAngularMax);
cuerpoRigido.AddTorque(Vector3.up * torqueAAplicar, ForceMode.Acceleration);
}
Otro error posible es que no se está controlando bien los límites de la aceleración. En estas líneas de código no se tiene en cuenta que si la aceleración angular es NEGATIVA también debe limitarse... y eso habría que cambiarlo:
if (direccion.angular > aceleracionAngularMax)
direccion.angular = aceleracionAngularMax;
Osea, habría que hacer algo parecido a: direccion.angular = Mathf.Clamp(direccion.angular, -aceleracionAngularMax, aceleracionAngularMax);
Otra cosita más es corregir un error de lógica en el límite negativo al calcular la velocidad angular... habría que hacer algo así:
float velAngularActual = cuerpoRigido.angularVelocity.magnitude;
if (velAngularActual > rotacionMax)
{
cuerpoRigido.angularVelocity = cuerpoRigido.angularVelocity.normalized * rotacionMax;
}