Rotate an object using Quaternion.RotateTowards() inside a Coroutine?

Hello, i am trying to rotate an object inside a Coroutine using Quaternion.RotateTowards(). But its not rotating smoothly like it does in Update(). instead, it snaps to the target rotation. What is wrong? This is my script:

public class SpinWheelScript : MonoBehaviour {

public GameObject[] rewards;
public GameObject[] pointerDir;
public GameObject[] ringDir;
public GameObject pointer;
public GameObject ring;

private Quaternion pointerTargetRotation;
private Quaternion ringTargetRotation;

private bool spinIsEnabled = true;
private bool isSpinning = false;

private float pSpeed;
private float rSpeed;
private float pointerRotateFloat;
private float ringRotateFloat;

private int rewardEnabler = 0;
private int randomReward;
private int pRandomDir;
private int rRandomDir;
private int plastRandomDir = 0;
private int rlastRandomDir = 0;

private void Update()
{
    if (spinIsEnabled == false)
    {
        // Do Nothing
    }

    else if (spinIsEnabled == true && isSpinning == false)
    {
        // Select reward
        if (rewardEnabler == 0)
        {
            RewardSelector();
            rewardEnabler = 1;
        }
        StartCoroutine(Spin());
    }
}

IEnumerator Spin()
{
    isSpinning = true;
    pSpeed = 0;
    rSpeed = 0;

    // Speed increasing spin for 5 seconds

    PointerRandomDirection();
    RingRandomDirection();

    while (true)
    {
        pointerRotateFloat = (((pRandomDir + 1) * 60) - 30) - pointer.transform.rotation.z;
        ringRotateFloat = (((rRandomDir + 1) * 60) - 30) - ring.transform.rotation.z;

        pSpeed = (pointerRotateFloat / 2);
        rSpeed = (ringRotateFloat / 2);

        pointerTargetRotation = Quaternion.Euler(new Vector3(0, 0, pointerRotateFloat));
        pointer.transform.rotation = Quaternion.RotateTowards(pointer.transform.rotation, pointerTargetRotation, pSpeed * Time.deltaTime);
        ringTargetRotation = Quaternion.Euler(new Vector3(0, 0, ringRotateFloat));
        ring.transform.rotation = Quaternion.RotateTowards(ring.transform.rotation, ringTargetRotation, rSpeed * Time.deltaTime);

        if ((pointer.transform.rotation == pointerTargetRotation) && (ring.transform.rotation == ringTargetRotation))
            break;
    }

    yield return new WaitForSeconds(1);

    Debug.Log("Done!");
}

private int RewardSelector()
{
    randomReward = Random.Range(0, rewards.Length);

    return randomReward;
}

private int PointerRandomDirection()
{
    int pRandomDir = plastRandomDir;

    if (pointerDir.Length <= 1)
        return 0;

    while (pRandomDir == plastRandomDir)
    {
        pRandomDir = Random.Range(0, pointerDir.Length);
    }

    plastRandomDir = pRandomDir;
    return pRandomDir;
}

private int RingRandomDirection()
{
    int rRandomDir = rlastRandomDir;

    if (ringDir.Length <= 1)
        return 0;

    while (rRandomDir == rlastRandomDir)
    {
        rRandomDir = Random.Range(0, ringDir.Length);
    }

    rlastRandomDir = rRandomDir;
    return rRandomDir;
}
}

Thanks in advance :slight_smile:

Turns out the problem was that i wasn’t yielding a Wait-Instruction inside the coroutine.

Just had to add this line at the end of the While loop: yield return null;.

This will tell the coroutine to delay the execution of the next line of code to the next frame.