Unity 3D my ball won't roll on a Blender made model

Overview:

I’m making a small game which has a board that tilts by user command, and a ball using Rigidbody physics. The player should tilt the board to roll the ball into the hole.

Problem:

Sometimes the ball doesn’t roll when the board is tilting.

Scenario 1: (DOES NOT WORK)

The ball drops from the air on start. The board is left flat until the ball is firmly on the ground. The board is then tilted.

Expected Outcome - Ball will roll down hill from the tilt.

Actual Outcome - Ball remains static.

Scenario 2: (WORKS)

The ball drops from the air on start. The board is tilted immediately (before the ball has time to land).

Expected Outcome - Ball will roll down hill from the tilt.

Actual Outcome - Ball does roll down hill from the tilt.

Details:

  • Blender model is a .fbx
  • The only script in the whole project is the board tilt (see below)
  • The balls constraints are all OFF.

Attempted Fixes:

  • Change PhysicsMaterial of Ball and Model to reduce friction, increase bounciness, and the combinations
  • Changed Rigidbody of Ball mass/drag vales, interpolation, collision detection

Question:

How do I get the ball to roll on a Blender surface?

Script:

public class Tilter : MonoBehaviour
{
    public float tiltMultiplier;
    private void Update()
    {
        float horizontalTilt = Input.GetAxis("Horizontal");
        float verticalTilt = Input.GetAxis("Vertical");
        Vector3 tilt = new Vector3(verticalTilt, 0, -horizontalTilt);
        transform.rotation = Quaternion.Euler(tilt * tiltMultiplier);
    }
} 

It might be because of your angular drag. Angular drag slows down rolling objects, so try decreasing it.

Turns out the Ball was landing, and then because it was not coming to contact with any NEW colliders, it would go to “sleep”. For this reason I had to add the following code to the Ball.

public class Ball : MonoBehaviour
{
    private Rigidbody rb;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (rb.IsSleeping())
        {
            rb.WakeUp();
        }
    }
}