Dice Not Behaving to Normal Physics

I have created 2 cubes to use as dice.

I drop them from a height with a random rotation.

When they hit the plane collider that I have created as the surface for the dice to fall on to, they will roll around a little and then finally come to a stop. This is when I detect what side is facing up.

The problem is that the dice are not behaving like real dice would.

For example sometimes the dice will land on an edge and the very slowly fall to a face.

Sometimes they will just stay on the edge.

Sometimes they will fall almost all the way to a flat side, but still not quite be all the way down so I can’t detect that they have achieved a side.

The physics settings for the game are all default so the gravity setting is -9.81.

The dice have a rigid body on them with these values:

mass: 1
drag: 0
angular drag: 0
use gravity checked
is kinematic not checked
interpolate: none
collision detect: discrete

I think those are the defaults.

I have tried making the mass very large and that did not change how they behaved.

If you throw real dice and they are not spinning around they fall to a side almost instantly. This is the behavior that I would like.

Can someone tell me how to make that happen?

This is an older post, but in case anyone else wants info. Step 1 is apply a physical material to the collider. This allows you to tweak friction and bouncyness. You can also add one to the rolling surface, which makes a big difference, and the phys material can be set for those values to interact.

I also did a script for nudging and kicking stuck die. if it couldn’t detect the side, it would return a zero… and on the update I’d nudge it:

if(side == 0) {
                if(attemptCounter < 5) {
                } else {
            } else {

public void Roll() {
    isRolling = true;
    awaitingResult = true;
    rb.AddForce(Random.onUnitSphere * forceAmount, forceMode);
    rb.AddTorque(Random.onUnitSphere * torqueAmount, forceMode);
public void Nudge() {
    isRolling = true;
    awaitingResult = true;
    rb.AddForce(Random.onUnitSphere * 0.2f, forceMode);
    rb.AddTorque(Random.onUnitSphere * 0.2f, forceMode);

I ended up doing similar things, but still feel like it doesn’t match real world dice very well.