Unity 协同函数知识汇总

Unity中的模拟多线程

  • 可以通过协同程序来设计和模拟Unity环境下的多线程业务部分

1.协同函数的设计和目的

  • 在主线程运行时同时开启另一段逻辑来处理,来协助当前主线程中的程序执行。
  • 游戏开发
    - 并行逻辑
    - 多帧数延续性逻辑
    - 同步并行和延续性逻辑
  • 设计目的
    - 轻型并行概念
    - 同步并行逻辑
    - 避免多线程环境下带来的麻烦
  • 基本概念
    - 假的多线程
    - 可以有意的在某段时间点上进行逻辑的同步处理
    - 可以将一些逻辑比较复杂的业务代码进行分帧处理

几个小案例演示协同函数到底可以干点啥

  • 第一个演示案例,通过协程来等待动画的播放结束
	// [Action]: 使用协同函数播放动画
	// [animaName]: 是用来要播放的动画名称
    private IEnumerator PlayAnimation(string animaName)
    {
    	// 播放动画
        this.anima.Play(animaName);
        // 校验是否播完动画
        while (this.anima.isPlaying)
            yield return null;// 如果没有播完动画,会一直等待动画播完
    }
  • 第二个演示案例,通过协程来向百度服务器发送请求
 // 测试 UnityWebRequest 发送网络请求
 private IEnumerator TestUnityWebRequest()
    {
        // 创建要访问的网络地址
        //Uri uri = new Uri("http://www.baidu.com");
        Uri uri = new Uri("http://localhost");
        // 构建一个网络请求对象
        UnityWebRequest request = new UnityWebRequest(uri);
        // 设置超时时间
        request.timeout = 5;
        // 等待发送网络请求完成
        yield return request.SendWebRequest();
        // 如果出现了网络异常,就不能发送网络请求了
        if (request.isHttpError || request.isNetworkError)
            Debug.Log("请求网络出错");
        else
        {
            Debug.Log("请求网络成功~");
        }
    }

!!接下来说一下协同函数使用的一些误区

    1. 协同函数都存在于一个主线程之中
    1. 如果要执行协同函数,必须依赖于一个 Mono 的生命周期
    1. 为了保证程序逻辑的清晰,尽量少用协同函数
    1. 保证有效的使用协同函数
    1. 最好不要使用 StopCoroutine() 来终止一个协同函数

你可能感兴趣的:(Unity)