{"id":13661410,"url":"https://github.com/geniikw/CoroutineChain","last_synced_at":"2025-04-25T02:32:58.332Z","repository":{"id":80976079,"uuid":"121738972","full_name":"geniikw/CoroutineChain","owner":"geniikw","description":"Unity3d, Coroutine, scripting","archived":false,"fork":false,"pushed_at":"2022-03-03T06:40:02.000Z","size":419,"stargazers_count":44,"open_issues_count":1,"forks_count":8,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-08-02T05:13:10.444Z","etag":null,"topics":["coroutines","unity3d","unity3d-plugin"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/geniikw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-02-16T10:31:19.000Z","updated_at":"2024-03-22T02:20:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"a4707298-ec73-49bc-836f-88f79827979d","html_url":"https://github.com/geniikw/CoroutineChain","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geniikw%2FCoroutineChain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geniikw%2FCoroutineChain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geniikw%2FCoroutineChain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geniikw%2FCoroutineChain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/geniikw","download_url":"https://codeload.github.com/geniikw/CoroutineChain/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223979337,"owners_count":17235377,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coroutines","unity3d","unity3d-plugin"],"created_at":"2024-08-02T05:01:34.153Z","updated_at":"2024-11-10T16:30:31.959Z","avatar_url":"https://github.com/geniikw.png","language":"C#","readme":"# CoroutineChain\nUnity3d, Coroutine, scripting\n\n[AssetStore](https://assetstore.unity.com/packages/tools/input-management/coroutinechain-109785)\n\n## Install\n\nUse the unity package manager.(https://github.com/geniikw/CoroutineChain.git)\n\n## Intro\n\n- Easy to read coroutine code.\n- Define callback simply\n- Call coroutine at outside MonoBehavour.\n\n\nIn my experience, generally coroutine code can be classified into two kinds.\n\nOne is a functional block. For example \n\n```csharp\nIEnumerator OneFunction(){\n  //do single task.\n}\n```\n\nOther is a squencial code. It consist of functional block coroutines.\n```csharp\nIEnumerator Sequncial(){\n  yield return StartCoroutine(A());\n  yield return StartCoroutine(B());\n  yield return StartCoroutine(C());\n}\n```\n\nIt is a small asset that makes it possible to call Unity's coroutines while chaining them.\n\nso you don't need to write seuqencial block. just chain it in call block.\n\n```csharp\npublic void Start(){\n    //same as above.\n    CoroutineChain.Start\n        .Play(A())\n        .Play(B())\n        .Play(C());\n    //or\n    CoroutineChain.Start\n        .Sequencial(A(),B(),C());\n}\n```\n\n[AssetStore](https://www.assetstore.unity3d.com/kr/#!/content/109785)\n\n## Reference\n\n### Basic\nall block wait previous block. \n```csharp\nvoid Start(){\n  this.StartChain() // or CoroutineChain.Start.Play ...\n      .Play(Coroutine())\n      .Sequencial(A(),B(),C()) // play one by one.\n      .Parallel(A(),B(),C()) // play same time.\n      .Wait(1f)\n      .Log(\"Complete!\");\n      .Call(()=\u003eCallback());\n}\n```\n\n### Play(IEnumerator coroutine)\nplay one coroutine. it is same as StartCoroutine().\n```csharp\nvoid Start(){\n    //Normal\n    StartCoroutine(A());\n    //CoroutineChain\n    this.StartChain()\n        .Play(A());\n}\n```\n\n### Wait(float sec)\n```csharp\nvoid Start(){\n    this.StartChain()\n        .Wait(1)\n        .Log(\"end\");\n    //1sec later debug log show out.\n}\n```\n\n### Parallel(IEnumerator[] routines)\nall coroutine start at same time\n```csharp\nvoid Start(){\n    ///Normal.\n    StartCoroutine(A());\n    StartCoroutine(B());\n    StartCoroutine(C());    \n    \n    //CoroutineChain, Less Character!\n    this.StartChain()\n        .Parallel(A(),B(),C());\n}\n```\n\n\n### Sequential(IEnemerator[] routines)\nit same as continuous Play block. \n```csharp\nIEnumerator Start(){///CoroutineStartBlock.\n    ///Normal.\n    yield return StartCoroutine(A());\n    yield return StartCoroutine(B());\n    yield return StartCoroutine(C());    \n    \n    //CoroutineChain, Less Character!\n    yield return this.StartChain()\n        .Sequencial(A(),B(),C());\n}\n```\n### Log(string log, ELogTtype type = ELogType.NORMAL)\nlog block is not coroutine. \n```csharp\nIEnumerator Start(){///CoroutineStartBlock.\n    ///Normal.\n    yield return StartCoroutine(A());\n    yield return StartCoroutine(A());\n    yield return StartCoroutine(A());\n    Debug.Log(A, B and C all end!!\");\n    \n    //CoroutineChain\n    yield return this.StartChain()\n        .Sequencial(A(),B(),C())\n        .Log(\"A, B and C all end!!\");\n}\n```\n\n### Call(Action)\nyou can simply setup callback.\n\nthis is Parallel block using Call() as coroutine callback.\n```csharp\nIEnumerator Parallel(IEnumerator[] routines)\n{\n    var all = 0;\n    foreach (var r in routines)\n        all++;\n\n    var c = 0;\n    foreach (var r in routines)\n        player.StartChain()\n            .Play(r)\n            .Call(() =\u003e c++);\n\n    while (c \u003c all)\n        yield return null;\n}\n```\n\n### WaitFor(Func\u003cbool\u003e)\n\nwait for a specific condition.\n\n```csharp\nvoid Start(){\n  CoroutineChain.Start\n          .WaitFor(()=\u003em_timer \u003e 3f)\n          .Log(\"Complete\");\n}\n\nfloat m_timer = 0f;\n\nvoid Update(){\n  m_timer += Time.deltaTime;\n}\n\n```\n\n\n","funding_links":[],"categories":["Open Source Repositories","C\\#","Open Source Packages"],"sub_categories":["Utilities"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeniikw%2FCoroutineChain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeniikw%2FCoroutineChain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeniikw%2FCoroutineChain/lists"}