CustomYieldInstruction

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()
    {

    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章