目录
一、目的
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
- 亲测:StartCoroutine(Func()),StopCoroutine(Func())的方法无法关闭协程
- 亲测:StartCoroutine(“FuncName”),StopCoroutine("FuncName") 能够关闭协程
亲测: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);
}
}
}
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
- 协程不断的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")发现可以执行协程



