CustomYieldInstruction
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
//using System.Buffers;
public class TestDestroy : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonUp(0))
{
Debug.Log("mouse 0 clicked!wait at:" + Time.time);
StartCoroutine(WaitKeySpace());
}
}
IEnumerator WaitKeySpace()
{
yield return new waitforspacekey2(checkspacekey);
//yield return new waitforspacekey();
Debug.Log("space pressed!at:" + Time.time);
}
bool checkspacekey()
{
return !Input.GetKeyUp(KeyCode.Space);
}
}
public static class CoroutineExtension
{
public static IEnumerator WaitAll(this MonoBehaviour mono, params IEnumerator[] _enums)
{
//List<Coroutine> _c = new List<Coroutine>();
//foreach(var it in _enums)
//{
// _c.Add(mono.StartCoroutine(it));
//}
//return _c.GetEnumerator();
var _m = _enums.Select(mono.StartCoroutine);
return _m.ToArray().GetEnumerator();
}
}
//继承CustomYieldInstruction,实现keepwaiting
public class waitforspacekey : CustomYieldInstruction
{
public override bool keepWaiting => !Input.GetKeyUp(KeyCode.Space);
}
//继承IEnumerator,实现movenext;true等待,false完成
public class waitforspacekey2 : IEnumerator
{
Func<bool> m_predicate;
public object Current => null;
public bool MoveNext()
{
return m_predicate();
}
public waitforspacekey2(Func<bool> m_p)
{
m_predicate = m_p;
}
public void Reset()
{
}
}