Calmer的文章

  • 首页
  • 文章归档
  • 关于页面

  • 搜索
体验游戏 笔记 推荐 工具链 工具使用 小游戏 插件 UI 软件 教程

协程管理

发表于 2020-06-22 | 分类于 游戏开发 | 0 | 阅读次数 1199

前言

在游戏开发中,协程常用于分帧处理一件事情,避免一帧内处理过多导致卡顿。


具体管理

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BaseCoroutineHelper
{
    private static BaseCoroutineHelper _instance;
    public static BaseCoroutineHelper Instance{
        get
        {
            if(_instance==null)
                _instance=new BaseCoroutineHelper();

            return _instance;
        }
    }

    sealed class CoroutineCore:Monobehaviour
    {
        void OnDestroy()
        {
            StopAllCoroutines();
        }
    }

    private const string COROUTINEHELPER_GO_NAME="CoroutineHelper";
    private GameObject _coroutineHelperObj=null;
    private static string DEFAULT_COROUTINEHELPER="MainCoroutine";
    private Dictionary<string,CoroutineCore> _cores=new Dictionary<string,CoroutineCore>();

    private BaseCoroutineHelper()
    {
        _coroutineHelperObj=new GameObject(COROUTINEHELPER_GO_NAME);
        UnityEngine.Object.DontDestroyOnLoad(_coroutineHelperObj);
    }

    public Coroutine StartCoroutine(string coreName,IEnumerator routine)
    {
        CoroutineCore curCore=GetOrCreateCoroutineCore(coreName);
        return curCore.StartCoroutine();
    }

    public void StopCoroutine(string coreName,Coroutine routine)
    {
        CoroutineCore curCore=GetCoroutineCore(coreName);
        if(curCore!=null)
        {
            curCore.StopCoroutine();
        }
        else
        {
            Debug.Log("You StopCoroutine with erro coreName"+coreName);
        }
    }

    public void StopCoroutine(string coreName,IEnumerator routine)
    {
        CoroutineCore curCore=GetCoroutineCore(coreName);
        if(curCore!=null)
        {
            curCore.StopCoroutine();
        }
        else
        {
            Debug.Log("You StopCoroutine with erro coreName"+coreName);
        }
    }

    public void StopAllCoroutines(string coreName)
    {
        CoroutineCore curCore=GetCoroutineCore(coreName);
        if(curCore!=null)
        {
            curCore.StopAllCoroutines();
        }
        else
        {
            Debug.Log("Not have this coreName:"+coreName);
        }
    }

    public void StopAllCoroutines()
    {
        var iter=_cores.GetEnumerator();
        while(iter.MoveNext())
        {
            iter.Current.Value.StopAllCoroutines();
        }
    }

    public Coroutine StartCoroutine(IEnumerator routine)
    {
        return StartCoroutine(DEFAULT_COROUTINEHELPER,routine);
    }

    public void StopCoroutine(Coroutine routine)
    {
        StopCoroutine(DEFAULT_COROUTINEHELPER,routine);
    }

    public void StopCoroutine(IEnumerator routine)
    {
        StopCoroutine(DEFAULT_COROUTINEHELPER,routine);
    }

    public void DestroyCoroutineCore(string coreName)
    {
        if(_cores.ContainsKey(coreName))
        {
            CoroutineCore curCore=_cores[coreName];
            curCore.StopAllCoroutines();
            GameObject.DestroyImmediate(curCore.gameObject);
        }
    }

    private CoroutineCore GetCoroutineCore(string coreName)
    {
        CoroutineCore curCC=null;
        _cores.TryGetValue(coreName,out curCC);
        return curCC;
    }

    private CoroutineCore CreateCoroutineCore(string coreName)
    {
        GameObject curCoreObj=new GameObject(coreName);
        curCoreObj.transform.SetParent(_coroutineHelperObj.transform);
        #if UNITY_5 || UNITY_2018
        #else
            UnityEngine.Object.DontDestroyOnLoad(curCoreObj);
        #endif
        CoroutineCore curCore = curCoreObj.AddComponent<CoroutineCore>();
        _cores.Add(coreName,curCore);
        return curCore;
    }

    private CoroutineCore GetOrCreateCoroutineCore(string coreName)
    {
        CoroutineCore curCore=GetCoroutineCore(coreName);
        if(curCore==null)
        {
            curCore=CreateCoroutineCore(coreName);
        }
        return curCore;
    }
}
  • 本文作者: Calmer
  • 本文链接: https://mytechplayer.com/archives/协程管理
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
# 工具链
FileTool
FairyGUI包管理扩展(支持Addressables)
  • 文章目录
  • 站点概览
Calmer

Calmer

88 日志
7 分类
10 标签
RSS
Creative Commons
0%
© 2020 — 2025 Calmer
由 Halo 强力驱动
蜀ICP备20010026号-1川公网安备51019002006543
Copyright © 2020-2025 Calmer的文章