(Translated by https://www.hiragana.jp/)
knight/Doc/中文文档/Coroutine协程模块.md at master · winddyhe/knight · GitHub
Skip to content

Latest commit

 

History

History
135 lines (105 loc) · 4.14 KB

Coroutine协程块.md

File metadata and controls

135 lines (105 loc) · 4.14 KB

Coroutine协程管理かんり

  • (题外话) つきかん网上很多だい佬并推荐ざいUnityちゅう使用しよう协程,ただし不可ふかいや认的ざいU3Dちゅう使用しよう协程らい做异处理以让だい码变どく非常ひじょう简洁こうとく别是ざいU3Dてき资源载一起配合使用的时候真的很方便。所以ゆえんわが还是非常ひじょう推崇ざいU3Dちゅう使用しよう协程らい做异处理てき
  • 目前もくぜん项目ちゅうてき异步操作そうさやめ经全がえ换为async awaitしきりょう支持しじUnity Coroutineasync await相互そうご混用こんよう自由じゆう转变。

协程支持しじてきこうのう

  • 协程使用しよう统一管理かんり,让携ほどてき启动さい赖MonoBehaviour。
  • 实现类似 WWW/AssetBundleRequestとう带自てい义参すうかえしかいてき协程对象,以简使用しよう协程てきだい码结构。
  • 支持しじざい热更しんはし使用しよう协程。

かたぎ提供ていきょうてきAPI

  • coroutine_1
  • かまちちゅう提供ていきょうてき协程管理かんり以在任意にんい位置いち启动いち个协ほど操作そうさ受MonoBehaviourてき约束。
CoroutineManager.cs
public CoroutineHandler StartHandler(IEnumerator rIEnum)	// 开始いち个可ひかえせい(とま掉)てき协程
public Coroutine Start(IEnumerator rIEnum)					// 开始いち个普どおり协程
public void Stop(CoroutineHandler rCoroutineHandler)		// 停止ていしいち个协ほど
  • てい义参すうかえしかいてき携程对象
public class LoaderRequest : CoroutineRequest<LoaderRequest>
{
    public Object obj;
    public string path;

    public LoaderRequest(string rPath)
    {
        this.path = rPath;
    }
}

public class CoroutineLoadTest
{
    public LoaderRequest mRequest;

    private LoaderRequest Load_Async(string rPath)
    {
        LoaderRequest rRequest = new LoaderRequest(rPath);
        mRequest = rRequest;
        rRequest.Start(Load(rRequest));
        return rRequest;
    }

    private IEnumerator Load(LoaderRequest rRequest)
    {
        yield return new WaitForSeconds(1.0f);
        rRequest.obj = new GameObject(rRequest.path);
        Debug.LogFormat("Create GameObject: {0}", rRequest.path);
    }

    public IEnumerator Loading(string rPath)
    {
        yield return Load_Async(rPath);
    }
}

public class CoroutineTest : MonoBehaviour
{
    IEnumerator Start()
    {
        CoroutineManager.Instance.Initialize();
        yield return CoroutineManager.Instance.Start(Start_Async());
    }

    IEnumerator Start_Async()
    {
        CoroutineLoadTest rTest = new CoroutineLoadTest();
        yield return CoroutineManager.Instance.Start(rTest.Loading("Test1"));
        yield return CoroutineManager.Instance.Start(rTest.Loading("Test2"));
        Debug.Log("Done.");
    }
}
  • async await异步しき
public class Init : MonoBehaviour
{
    public string HotfixABPath = "";
    public string HotfixModule = "";
    
    async void Start()
    {
        CoroutineManager.Instance.Initialize();
	wait Start_Async();
    }

    private async Task Start_Async()
    {
        await ABPlatform.Instance.Initialize();
        await ABUpdater.Instance.Initialize();

        await HotfixManager.Instance.Load(this.HotfixABPath, this.HotfixModule);

        await HotfixGameMainLogic.Instance.Initialize();

        Debug.Log("End init..");
    }
}

// 直接ちょくせつawait Assetbundle.LoadFromFileAsync API
rAssetLoadEntry.CacheAsset = await AssetBundle.LoadFromFileAsync(rAssetLoadUrl);

// 直接ちょくせつawait Assetbundle.LoadAssetAsync API
rRequest.Asset = await rAssetLoadEntry.CacheAsset.LoadAssetAsync(rRequest.AssetName);

需要じゅよう注意ちゅういてき问题

  • ILRuntime库目ぜん支持しじざいforeachちゅう使用しようyield return xxx;操作そうさ
// 错误てき用法ようほう
foreach (var rPair in rGameStageList)
{
	yield return rPair.Value.Run_Async();
}

// せい确的用法ようほう目前もくぜんただのう转成for循环らい执行协程
var rGameStageList = new List<KeyValuePair<int, GameStage>>(this.gameStages);
for (int i = 0; i < rGameStageList.Count; i++)
{
    yield return rGameStageList[i].Value.Run_Async();
}
  • 目前もくぜんざい热更しんはし还不支持しじ直接ちょくせつ继承CoroutineRequest类,ばん类的继承ざいILRuntimeちゅう支持しじとく很好。ざい热更しんはし直接ちょくせつ创建一个类来缓存CoroutineHandler对象らい拟实现带さんすうてき协程对象。具体ぐたい用法ようほうさん见热更新こうしんDLLちゅうてきActorCreater.csぶんけん