How to change material of objects one by one

A have 16 cubs and I want to smoothly change it’s color one by one like here: SPINE on Vimeo .

But here what I have: - YouTube
What is wrong?

 public float delay;
    bool shouldCallFuncAtFirstTime;
    bool shouldStartCoroutineAgain;
    Renderer renderer;
    Material mat;

    void Start()
    {
        renderer = GetComponent<Renderer>();
        mat = renderer.material;
        shouldStartCoroutineAgain = true;
    }

    void Update()
    {
        StartCoroutine("ChangeMaterialDelay");
        if (shouldCallFuncAtFirstTime)
            ChangeMaterial();
    }

    void ChangeMaterial()
    {
        float emission = Mathf.PingPong(Time.time, 0.5f);
        Color baseColor = Color.white;
        Color finalColor = baseColor * Mathf.LinearToGammaSpace(emission);
        mat.SetColor("_EmissionColor", finalColor);
        shouldCallFuncAtFirstTime = false;
    }

    IEnumerator ChangeMaterialDelay()
    {
        if(shouldStartCoroutineAgain)
        {
            shouldStartCoroutineAgain = false;
            yield return new WaitForSeconds(delay);
            shouldCallFuncAtFirstTime = true;
            shouldStartCoroutineAgain = true;
        }
    }

I read the question incorrectly the first time. Isn’t your title is misleading? It seems from the video that you have managed to set different colors to your objects using 1 material.

Your problem is that the color changing is no smooth, correct?
For this you should set a target color and change the color smoothly towards this color during your update. Then when the target color == the cube’s color (or is close enough) you can chose a new target color. It will make all smoother.