I want to add force during an animation clip (using OnStateUpdate
which is the same as Update
).
So, the question is: how to AddForce in the Update
method properly as if it was the FixedUpdate
?
I want to add force during an animation clip (using OnStateUpdate
which is the same as Update
).
So, the question is: how to AddForce in the Update
method properly as if it was the FixedUpdate
?
If you want to ensure that you’re reliably applying your physics forces during FixedUpdate() while simultaneously basing it on an animation that plays during Update(), you could use a Queue<> (or List<>, on the same general basis).
In short, you add forces to be applied during the animation, then “play them back” during the next FixedUpdate().
Queue<Vector3> qForces = new Queue<Vector3>();
// Simplified example call
void OnStateUpdate(/*etc.*/)
{
// etc.
qForces.Enqueue([FORCE_TO_APPLY]);
// etc.
}
void FixedUpdate()
{
if(qForces.Count > 0) // Only worry about this when the queue isn't empty
{
Vector3 combinedForce = Vector3.zero;
while(qForces.Count > 0)
{
combinedForce += qForces.Dequeue();
}
// Make only a single Rigidbody.AddForce() call using the
// sum of all forces gathered between physics passes
rb.AddForce(combinedForce, ForceMode.[Impulse/VelocityChange/etc.]);
}
}
Edit: Efficiency improvement