yield return new WaitForFixedUpdate();
yield return new WaitForEndOfFrame();
yield return new WaitForSeconds(0.1f); // 100ms
yield return StartCoroutine(AnotherCoroutine());
yield return new WWW(someLink);
yield return null;
yield return break;
void Start() { StartCoroutine(TestCoroutine()); } IEnumerator TestCoroutine() { while(true) { yield return null; Debug.Log(Time.deltaTime); } }
public bool IsMoving = false; IEnumerator MoveCoroutine(Vector3 moveTo) { IsMoving = true; // var iniPosition = transform.position; while (transform.position != moveTo) { // // yield return null; } IsMoving = false; }
IEnumetaror PerformMovingCoroutine() { // foreach(MovableObjectScript s in objectsToMove) { // StartCoroutine(s.MoveCoroutine(moveTo)); } bool isMoving = true; while (isMoving) { isMoving = false; Array.ForEach(objectsToMove, s => { if (s.IsMoving) isMoving = true; }); if (isMoving) yield return null; } // }
public static class CoroutineExtension { // < , > static private readonly Dictionary<string, int> Runners = new Dictionary<string, int>(); // MonoBehaviour public static void ParallelCoroutinesGroup(this IEnumerator coroutine, MonoBehaviour parent, string groupName) { if (!Runners.ContainsKey(groupName)) Runners.Add(groupName, 0); Runners[groupName]++; parent.StartCoroutine(DoParallel(coroutine, parent, groupName)); } static IEnumerator DoParallel(IEnumerator coroutine, MonoBehaviour parent, string groupName) { yield return parent.StartCoroutine(coroutine); Runners[groupName]--; } // , , public static bool GroupProcessing(string groupName) { return (Runners.ContainsKey(groupName) && Runners[groupName] > 0); } }
public class CoroutinesTest : MonoBehaviour { // Use this for initialization void Start() { StartCoroutine(GlobalCoroutine()); } IEnumerator GlobalCoroutine() { for (int i = 0; i < 5; i++) RegularCoroutine(i).ParallelCoroutinesGroup(this, "test"); while (CoroutineExtension.GroupProcessing("test")) yield return null; Debug.Log("Group 1 finished"); for (int i = 10; i < 15; i++) RegularCoroutine(i).ParallelCoroutinesGroup(this, "anotherTest"); while (CoroutineExtension.GroupProcessing("anotherTest")) yield return null; Debug.Log("Group 2 finished"); } IEnumerator RegularCoroutine(int id) { int iterationsCount = Random.Range(1, 5); for (int i = 1; i <= iterationsCount; i++) { yield return new WaitForSeconds(1); } Debug.Log(string.Format("{0}: Coroutine {1} finished", Time.realtimeSinceStartup, id)); } }
Source: https://habr.com/ru/post/216185/
All Articles