Unity中协程(IEnumerator)使用方法+停止方法+协程start前需要判断其是否开启了,否则协程会不断地叠加

目录

1、目的

1.1 想知道:Unity中协程(IEnumerator)的使用方法介绍

2、参考

2.1 Unity中协程(IEnumerator)的使用方法介绍

2.2 Unity3D协程介绍 以及 使用

2.3 Unity 协程之三种分析解决StopCorotine终止不了

3.注意:

3.1 物体隐藏时候,协程关闭了,所以物体隐藏时候需要注意协程的开关

3.2 如操作3:协程start前需要判断其是否开启了,否则协程会不断地叠加(即:开启协程前,将之前已经开启的给关闭)

3.3 如操作4:发现StopCoroutine(ie_StopRecorder)不如 StopCoroutine("IE_StopRecorder"),所以还是使用StopCoroutine("IE_StopRecorder")比较好

3.4 使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)

四.操作:1:开启、关闭协程+有传递参数的:成功

四.操作:2:完成:简单的完成延迟启动

四.操作:3:协程start前需要判断其是否开启了,否则协程会不断地叠加

1.错误的演示一遍:当我按下多次R按键,会发现Cube运行的越来越快

1.1 运行结果:当我不断按下R按键,cube会移动的越来越快,

 1.正确的演示:弄一个bool变量控制协程是否已经开启了(因为查阅API,发现协程没有提供是否正在运行的变量,所以只好自己创建一个变量)

1.1 不断地按下R按键,也只会开启一次协程

四.操作:4:StopCoroutine(ie_StopRecorder)不如 StopCoroutine("IE_StopRecorder")

1.StopCoroutine(ie_StopRecorder)发现没有执行协程

1.StopCoroutine("IE_StopRecorder")发现可以执行协程


1、目的

1.1 想知道:Unity中协程(IEnumerator)的使用方法介绍

2、参考

2.1 Unity中协程(IEnumerator)的使用方法介绍

Unity中协程(IEnumerator)的使用方法介绍_悲欢离合的博客-CSDN博客

  • 总结:good:适合多看

2.2 Unity3D协程介绍 以及 使用

Unity3D协程介绍 以及 使用_huang9012的专栏-CSDN博客_unity 协程

  • 总结:good:适合多看

2.3 Unity 协程之三种分析解决StopCorotine终止不了

https://jingyan.baidu.com/article/7c6fb428c8478480642c9029.html

  1. 亲测:StartCoroutine(Func()),StopCoroutine(Func())的方法无法关闭协程
  2. 亲测:StartCoroutine(“FuncName”),StopCoroutine("FuncName") 能够关闭协程
  3. 亲测:IEnumerator wrapFunc,包装一下协程函数,StartCoroutine(wrapFunc),StopCoroutine(wrapFunc)  能够关闭协程(项目有此发现无法关闭,所有不推荐使用)
  4. 亲测:使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)
        private Coroutine coroutine_setReConnect;   
     if (coroutine_setReConnect != null)
            {
                StopCoroutine(coroutine_setReConnect);
                coroutine_setReConnect = null;
            }
            coroutine_setReConnect = StartCoroutine(IE_SetReConnect());

 

3.注意:

3.1 物体隐藏时候,协程关闭了,所以物体隐藏时候需要注意协程的开关

3.2 如操作3:协程start前需要判断其是否开启了,否则协程会不断地叠加(即:开启协程前,将之前已经开启的给关闭)

3.3 如操作4:发现StopCoroutine(ie_StopRecorder)不如 StopCoroutine("IE_StopRecorder"),所以还是使用StopCoroutine("IE_StopRecorder")比较好

3.4 使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)

  1.  亲测:使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)
        private Coroutine coroutine_setReConnect;   
     if (coroutine_setReConnect != null)
            {
                StopCoroutine(coroutine_setReConnect);
                coroutine_setReConnect = null;
            }
            coroutine_setReConnect = StartCoroutine(IE_SetReConnect());

四.操作:1:开启、关闭协程+有传递参数的:成功

using System.Collections;
using UnityEngine;

public class IEnumeratorTest: MonoBehaviour
{
	
    /// <summary>定义一个全局的对象用来接收协程的返回值</summary>
	IEnumerator ie;

	void Start()
	{
		ie = Test(5, "hello");

		StartCoroutine(ie);

		//使用方法名,并且带有一个参数(最多只能传一个参数)
		StartCoroutine("Test1", 0);
	}

	void Update()
	{
		if(Input.GetKeyDown(KeyCode.Space))
		{
			StopCoroutine(ie);
			StopCoroutine("Test1");
		}
	}

	IEnumerator Test(int a,string str)
	{
		WaitForSeconds sec = new WaitForSeconds(1f);

		while(true)
		{
			Debug.Log(a);
			Debug.Log(str);
			yield return new sec;
		}
	}
	
	IEnumerator Test1(int a)
	{
		WaitForSeconds sec = new WaitForSeconds(1f);
		while(true)
		{
			Debug.Log(a);
			yield return new sec;
		}
	}
}

四.操作:2:完成:简单的完成延迟启动

 StartCoroutine("StopRecorder");     
    IEnumerator StopRecorder()
    {
        yield return new WaitForSeconds(5f);
           //TODO:添加需要执行的动作

    }

四.操作:3:协程start前需要判断其是否开启了,否则协程会不断地叠加

1.错误的演示一遍:当我按下多次R按键,会发现Cube运行的越来越快

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

/// <summary>
/// 功能:测试协程停止会不会对之前的协程造成影响
/// </summary>
public class MyCoroutineTest : MonoBehaviour
{
    public GameObject obj_cube;

    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyUp(KeyCode.Space))
        {
            StopCoroutine("Coroutine");
            //print("StopCoroutine");
        }
        else if (Input.GetKeyUp(KeyCode.R))
        {
            StartCoroutine("Coroutine");
            //print("StartCoroutine");
        }
    }

    //测试发现:不断的按下R,开启协程,导致cube移动越来越快
    IEnumerator Coroutine()
    {
        while (true)
        {
            yield return new WaitForSeconds(0.8f);

            Vector3 v3 = obj_cube.transform.position;
            obj_cube.transform.position = new Vector3(v3.x + 1, v3.y, v3.z);
        }
      
    }
}

1.1 运行结果:当我不断按下R按键,cube会移动的越来越快,

  • 协程不断的StartCoroutine会导致物体越来越快,所以一定要StartCoroutine前StopCoroutine

 1.正确的演示:弄一个bool变量控制协程是否已经开启了(因为查阅API,发现协程没有提供是否正在运行的变量,所以只好自己创建一个变量)

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

/// <summary>
/// 功能:测试协程停止会不会对之前的协程造成影响
/// </summary>
public class MyCoroutineTest : MonoBehaviour
{
    /// <summary>GameObject:测试移动的cube</summary>
    public GameObject obj_cube;

    /// <summary>bool:协程是否开始运行</summary>
    private bool bIsStartCoroutine;

    // Start is called before the first frame update
    void Start()
    {
        bIsStartCoroutine = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyUp(KeyCode.Space))
        {
            if (bIsStartCoroutine)
            {
                bIsStartCoroutine = false;
                StopCoroutine("Coroutine");
                print("StopCoroutine");
            }
        }
        else if (Input.GetKeyUp(KeyCode.R))
        {
            if (!bIsStartCoroutine)
            {
                bIsStartCoroutine = true;
                StartCoroutine("Coroutine");
                print("StartCoroutine");
            }
        }
    }

    测试发现:不断的按下R,开启协程,导致cube移动越来越快
    //IEnumerator Coroutine()
    //{
    //    while (true)
    //    {
    //        yield return new WaitForSeconds(0.8f);

    //        Vector3 v3 = obj_cube.transform.position;
    //        obj_cube.transform.position = new Vector3(v3.x + 1, v3.y, v3.z);
    //    }      
    //}

    //测试发现:
    IEnumerator Coroutine()
    {
        while (true)
        {
            yield return new WaitForSeconds(0.8f);

            Vector3 v3 = obj_cube.transform.position;
            obj_cube.transform.position = new Vector3(v3.x + 1, v3.y, v3.z);
        }
    }

}

1.1 不断地按下R按键,也只会开启一次协程

四.操作:4:StopCoroutine(ie_StopRecorder)不如 StopCoroutine("IE_StopRecorder")

1.StopCoroutine(ie_StopRecorder)发现没有执行协程

1.StopCoroutine("IE_StopRecorder")发现可以执行协程

  • 23
    点赞
  • 180
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 携程(Coroutine)是一种协同处理机制,它允许程序在特定的时间点暂停执行,然后在稍后的时间点继续执行。这一机制使得程序可以在多个任务之间进行切换,以便实现复杂的异步操作。 Unity 携程的实现原理如下: 1. 携程是基于迭代器(Iterator)的。在编写携程时,开发者可以使用 yield 关键字来指示程序在当位置挂起,并将执行权返回到 Unity 引擎。这个过程实际上生成一个迭代器对象,迭代器对象记录程序的执行状态。 2. Unity 引擎在执行携程时不断调用迭代器的 MoveNext() 方法。这个方法根据携程的执行状态来判断程序是否需要继续执行,或者暂停并等待某些条件满足。 3. 当携程需要暂停时,它通过 yield return 关键字将当的执行状态返回给 Unity 引擎。这个执行状态包含了一个等待时间或条件,Unity 引擎根据这个状态来安排携程的下一次执行。 4. 当等待时间或条件满足时,Unity 引擎再次调用迭代器的 MoveNext() 方法,携程从上一次暂停的位置继续执行下去。 通过这样的机制,携程使得程序可以在挂起和继续执行之间灵活切换,从而实现了一种协同处理的能力。这对于处理长时间运行的任务、异步加载资源或者并行执行多个任务时都非常有用。 需要注意的是,Unity 携程并不是真正的多线程。它在主线程以协同的方式运行,因此携程不能有耗时的操作,否则阻塞主线程的执行。在需要进行耗时操作的情况下,可以使用 Unity 的其他机制,如线程、任务等来完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值