栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

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

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

一、目的

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

二、参考

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

1、Unity3D协程介绍 以及 使用

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

三.注意:

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

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

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

四.操作: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、想知道:Unity中协程(IEnumerator)的使用方法介绍

二、参考

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

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

  • 总结:good:适合多看

1、Unity3D协程介绍 以及 使用

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

  • 总结:good:适合多看

1.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)  能够关闭协程(项目有此发现无法关闭,所有不推荐使用)

三.注意:

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

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

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

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

public class IEnumeratorTest: MonoBehaviour
{
	
    /// 定义一个全局的对象用来接收协程的返回值
	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;

/// 
/// 功能:测试协程停止会不会对之前的协程造成影响
/// 
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;

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

    /// bool:协程是否开始运行
    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")发现可以执行协程

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900707.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号