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

时间:2025-01-25 19:20:12

目录

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")

(ie_StopRecorder)发现没有执行协程

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


1、目的

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

2、参考

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

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

  • 总结:good:适合多看

2.2 Unity3D协程介绍 以及 使用

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

  • 总结:good:适合多看

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

/article/

  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 ;
using UnityEngine;

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

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

		StartCoroutine(ie);

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

	void Update()
	{
		if(())
		{
			StopCoroutine(ie);
			StopCoroutine("Test1");
		}
	}

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

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

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

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

    }

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

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

using ;
using ;
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 (())
        {
            StopCoroutine("Coroutine");
            //print("StopCoroutine");
        }
        else if (())
        {
            StartCoroutine("Coroutine");
            //print("StartCoroutine");
        }
    }

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

            Vector3 v3 = obj_cube.;
            obj_cube. = new Vector3( + 1, , );
        }
      
    }
}

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

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

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

using ;
using ;
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 (())
        {
            if (bIsStartCoroutine)
            {
                bIsStartCoroutine = false;
                StopCoroutine("Coroutine");
                print("StopCoroutine");
            }
        }
        else if (())
        {
            if (!bIsStartCoroutine)
            {
                bIsStartCoroutine = true;
                StartCoroutine("Coroutine");
                print("StartCoroutine");
            }
        }
    }

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

    //        Vector3 v3 = obj_cube.;
    //        obj_cube. = new Vector3( + 1, , );
    //    }      
    //}

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

            Vector3 v3 = obj_cube.;
            obj_cube. = new Vector3( + 1, , );
        }
    }

}

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

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

(ie_StopRecorder)发现没有执行协程

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