Start as a Coroutine

Even though it's not obvious in the API documentation, Start() can actually be treated as a coroutine. In order to do so, instead of the usual "void Start()" that you would write, make it "IEnumerator Start()". You can then use yields directly in your Start() code. This can make initial animations of things a snap. In our current project, we even use it for initialization. In one of our scripts, we want to perform some setup, and then wait while all the other scripts finish their setup, and then finish ours. How we actually do this is basically like so:

IEnumerator Start() { // Perform initial setup yield return null; // Perform setup after other scripts have done theirs }

NOTE: As u/dudledok and u/LHHuman have pointed out, it is a bad idea to initialize things in this manner. Awake() and OnEnable() are usually a better idea for initializing things in steps. This method can still be useful for animating things right off the bat, rather than having to call StartCoroutine(AnimateFunction());