目录
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/
亲测:StartCoroutine(Func()),StopCoroutine(Func())的方法无法关闭协程- 亲测:StartCoroutine(“FuncName”),StopCoroutine("FuncName") 能够关闭协程
亲测:IEnumerator wrapFunc,包装一下协程函数,StartCoroutine(wrapFunc),StopCoroutine(wrapFunc) 能够关闭协程(项目有此发现无法关闭,所有不推荐使用)- 亲测:使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)
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 使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)
- 亲测:使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)
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, , );
}
}
}