---
title: "Coroutines"
content_type: tutorial
url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines?language=en"
language: en
container_type: course
container_title: "Intermediate Scripting"
container_url: "https://learn.unity.com/course/intermediate-gameplay-scripting.md?language=en&version=2019.3"
standalone_markdown_url: "https://learn.unity.com/tutorial/coroutines.md?language=en&version=2019.3"
previous_title: "Lists and Dictionaries "
previous_url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/lists-and-dictionaries?language=en&version=2019.3"
previous_markdown_url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/lists-and-dictionaries.md?language=en&version=2019.3"
next_title: "Quaternions"
next_url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/quaternions?language=en&version=2019.3"
next_markdown_url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/quaternions.md?language=en&version=2019.3"
difficulty: intermediate
duration_minutes: 5
unity_version:
  - "2019.3"
  - "2019.2"
  - "2019.1"
  - "2018.4"
  - "2018.3"
  - "2018.2"
  - "2018.1"
  - "2017.4"
  - "2017.3"
  - "2017.2"
  - "2017.1"
  - "5.x"
  - "4.x"
supported_unity_versions:
  - name: "2021.3"
    url: "https://learn.unity.com/tutorial/coroutines.md?language=en&version=2021.3"
  - name: "2019.3"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2019.3"
  - name: "2019.2"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2019.2"
  - name: "2019.1"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2019.1"
  - name: "2018.4"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2018.4"
  - name: "2018.3"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2018.3"
  - name: "2018.2"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2018.2"
  - name: "2018.1"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2018.1"
  - name: "2017.4"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2017.4"
  - name: "2017.3"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2017.3"
  - name: "2017.2"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2017.2"
  - name: "2017.1"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=2017.1"
  - name: "5.x"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=5.x"
  - name: "4.x"
    url: "https://learn.unity.com/course/intermediate-gameplay-scripting/tutorial/coroutines.md?language=en&version=4.x"
last_updated: "2026-08-04T14:21:20.000Z"
---

# Coroutines

Learn to create coroutines and apply them to run complex behaviors over time in your application.

How to create coroutines and use them to achieve complex behaviours.

## 1. Coroutines

[Video](https://connect-mediagw.unity.com/h1/20220110/videos/e0720a34-30b6-4e41-a67a-84937966c207_U_Intermediate_14_Coroutines.mp4)

 **CoroutinesExample**

```csharp
using UnityEngine;
using System.Collections;

public class CoroutinesExample : MonoBehaviour
{
    public float smoothing = 1f;
    public Transform target;


    void Start ()
    {
        StartCoroutine(MyCoroutine(target));
    }


    IEnumerator MyCoroutine (Transform target)
    {
        while(Vector3.Distance(transform.position, target.position) > 0.05f)
        {
            transform.position = Vector3.Lerp(transform.position, target.position, smoothing * Time.deltaTime);

            yield return null;
        }

        print("Reached the target.");

        yield return new WaitForSeconds(3f);

        print("MyCoroutine is now finished.");
    }
}
```

 **PropertiesAndCoroutines**

```csharp
using UnityEngine;
using System.Collections;

public class PropertiesAndCoroutines : MonoBehaviour
{
    public float smoothing = 7f;
    public Vector3 Target
    {
        get { return target; }
        set
        {
            target = value;

            StopCoroutine("Movement");
            StartCoroutine("Movement", target);
        }
    }


    private Vector3 target;


    IEnumerator Movement (Vector3 target)
    {
        while(Vector3.Distance(transform.position, target) > 0.05f)
        {
            transform.position = Vector3.Lerp(transform.position, target, smoothing * Time.deltaTime);

            yield return null;
        }
    }
}
```

 **ClickSetPosition**

```csharp
using UnityEngine;
using System.Collections;

public class ClickSetPosition : MonoBehaviour
{
    public PropertiesAndCoroutines coroutineScript;


    void OnMouseDown ()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        Physics.Raycast(ray, out hit);

        if(hit.collider.gameObject == gameObject)
        {
            Vector3 newTarget = hit.point + new Vector3(0, 0.5f, 0);
            coroutineScript.Target = newTarget;
        }
    }
}
```
