Unity协程封装
来源:互联网 发布:linux daemonize 编辑:程序博客网 时间:2024/06/07 11:46
//功能:延迟指定时间后调用回调方法,可用于解决部分时序问题。
using UnityEngine;using System.Collections;using System;public class CoroutineUtil : MonoBehaviour { private static CoroutineUtil instance; public static CoroutineUtil Instance {get{return instance;}} void Awake() { instance = this; } IEnumerator ICoroutine(float time = 0, bool ignoreTimeScale = false, Action callBack = null) { if (time == 0) { yield return null; } else if (time > 0) { if (ignoreTimeScale) { float start = Time.realtimeSinceStartup; while (Time.realtimeSinceStartup < start + time) { yield return null; } } else yield return new WaitForSeconds(time); } if (callBack != null) { callBack(); } } /// <summary> /// 等待指定时间后,执行回调方法 /// </summary> /// <param name="time">等待时间 秒,0为1帧</param> /// <param name="ignoreTimeScale">是否忽略TimeScale影响</param> /// <param name="callBack">回调方法</param> /// <param name="objects">回调参数</param> /// <returns></returns> public Coroutine WaitTime(float time = 0, bool ignoreTimeScale = false, Action callBack = null) { return StartCoroutine(ICoroutine(time, ignoreTimeScale, callBack)); } /// <summary> /// 等待指定时间后,执行回调方法 /// </summary> /// <param name="time">等待时间 秒,0为1帧</param> /// <param name="ignoreTimeScale">是否忽略TimeScale影响</param> /// <param name="callBack">回调方法</param> /// <param name="objects">回调参数</param> /// <returns></returns>public Coroutine WaitTime(float time = 0, bool ignoreTimeScale = false, Action<object[]> callBack = null, params object[] objects) { return StartCoroutine(ICoroutine(time, ignoreTimeScale, callBack, objects)); } /// <summary> /// 倒计时或正计时 每隔指定时间回调一次 /// </summary> /// <param name="startTime">开始时间</param> /// <param name="endTime">结束时间</param> /// <param name="perTime">回调间隔</param> /// <param name="ignoreTimeScale">是否忽略TimeScale影响</param> /// <param name="callBack">回调方法</param> /// <returns></returns> public Coroutine WaitPerSecond(float startTime = 10, float endTime = 0, float perTime = 1, bool ignoreTimeScale = false, Action<float> callBack = null) { return StartCoroutine(ICoroutine(startTime, endTime, perTime, ignoreTimeScale, callBack)); } /// <summary> /// 等待FixedUpdate时间后执行回调 /// </summary> /// <param name="time">等待时间 秒,0为1帧</param> /// <param name="callBack">回调方法</param> /// <param name="objects">回调参数</param> /// <returns></returns> public Coroutine WaitFixedUpdate(float time = 0, Action<object[]> callBack = null, params object[] objects) { return StartCoroutine(ICoroutine(time, callBack, objects)); } /// <summary> /// 主动停止指定协程 /// </summary> /// <param name="coroutine"></param> public void Stop(Coroutine coroutine) { if (coroutine != null) { StopCoroutine(coroutine); } } IEnumerator ICoroutine( float time = 0, bool ignoreTimeScale = false, Action<object[]> callBack = null, params object[] objects) { if (time == 0) { yield return null; } else if (time > 0) { if (ignoreTimeScale) { float start = Time.realtimeSinceStartup; while (Time.realtimeSinceStartup < start + time) { yield return null; } } else yield return new WaitForSeconds(time); } if (callBack != null) { callBack(objects); } } IEnumerator ICoroutine(float beginTime = 10, float endTime = 0, float perTime = 1, bool ignoreTimeScale = false, Action<float> callBack = null) { if (beginTime > endTime) { while (beginTime > endTime) { if (ignoreTimeScale) { float start = Time.realtimeSinceStartup; while (Time.realtimeSinceStartup < start + perTime) { yield return null; } } else yield return new WaitForSeconds(perTime); beginTime -= perTime; if (callBack != null) { callBack(beginTime); } } } else if (beginTime < endTime) { while (beginTime < endTime) { if (ignoreTimeScale) { float start = Time.realtimeSinceStartup; while (Time.realtimeSinceStartup < start + perTime) { yield return null; } } else yield return new WaitForSeconds(perTime); beginTime += perTime; if (callBack != null) { callBack(beginTime); } } } } IEnumerator ICoroutine(float waitTime, Action<object[]> callBack = null, params object[] objects) { if (waitTime == 0) { yield return new WaitForFixedUpdate(); } else if(waitTime > 0) { float time = 0; while (time < waitTime) { yield return new WaitForFixedUpdate(); time += Time.fixedDeltaTime; } } if (callBack != null) { callBack(objects); } }}
阅读全文
0 0
- Unity协程封装
- Unity之封装,继承
- Unity WWW强力封装
- Unity封装Debug调试
- unity之属性封装,继承
- Unity封装dll教程整理
- 【Unity】封装SQLite管理类
- Unity Lua UI界面封装
- unity之协程
- Unity 协程使用指南
- Unity内置协程
- Unity协程认知
- Unity协程函数
- unity 协程笔记
- unity学习之继承和封装
- Unity之常量,异常,修饰符,封装
- Unity调用自己封装的dll
- unity->C#简单的封装+继承
- VBA,excel中选择特定内容复制粘贴
- POJ
- nyoj92 图像有用区域
- Mac下如何安装mysql
- HDU
- Unity协程封装
- 1195: 捧杯
- C#从服务器下载文件
- 数据库事务学习笔记
- yii2安装与初始化-Yii2学习笔记(一)
- Android 屏蔽USB权限弹框
- gradle新建工程,多项目依赖,聚合工程
- nginx官网安装
- ajax的应用