新學到的過程函數思路

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//using IMIForUnity;

public delegate void function_f(float a);
public delegate void function();
//public delegate void function_ImiSkeleton(ImiSkeleton[] sk);

public class FunctionDelegate : MonoBehaviour
{
    public static FunctionDelegate Instance;
    public function Function;
    //public function_ImiSkeleton SkFunction;
    //public bool IsGetImiSkeleton = false;
    //public List<SkeletonFunction> SkFunctionList;

    void Awake()
    {
        Instance = this;
        //SkFunctionList = new List<SkeletonFunction>();
    }

    void Update()
    {
        if (Function != null) 
            Function();
    }
}


public class ProcessFunction
{
    int i;
    float m_start;
    float m_end;
    float m_current;
    float m_speed;
    function m_funcEnd;
    function m_keep;
    function m_funcDur;
    function_f m_funcf;
    float m_delayTime;

    /// <summary>
    /// 持續執行Update函數
    /// </summary>
    /// <param name="func"></param>
    public ProcessFunction(function func)
    {
        m_keep = func;
        //Debug.Log("開啓檢測");
        FunctionDelegate.Instance.Function += KeepUpdate; 
    }

    void KeepUpdate()
    {
        m_keep();
    }

    public void StopKeepUpdate()
    {
        //Debug.Log("關閉檢測");
        FunctionDelegate.Instance.Function -= KeepUpdate;
    }

    /// <summary>
    /// 浮點型函數-過程函數
    /// </summary>
    /// <param name="delaytime"></param>
    /// <param name="start"></param>
    /// <param name="end"></param>
    /// <param name="time"></param>
    /// <param name="funcf"></param>
    /// <param name="funcEnd"></param>
    public ProcessFunction(float delaytime, float start, float end, float time, function_f funcf, function funcEnd)
    {
        m_delayTime = delaytime;
        m_start = start;
        m_current = start;
        m_end = end;
        m_funcEnd = funcEnd;
        m_funcf = funcf;
        m_speed = (end - start) / time;
        FunctionDelegate.Instance.Function += AddUpdatef;
    }


    void AddUpdatef()
    {
        if (m_delayTime > 0)
        {
            m_delayTime -= Time.deltaTime;
        }
        else
        {
            m_delayTime = 0;
            m_current += m_speed * Time.deltaTime;
            if ((m_current - m_start) * (m_current - m_end) > 0)
            {
                m_current = m_end;
                m_funcf(m_current);
                FunctionDelegate.Instance.Function -= AddUpdatef;
                if (m_funcEnd != null)
                {
                    m_funcEnd();
                }
            }
            else
            {
                m_funcf(m_current);
            }
        }
    }


    /// <summary>
    /// 無傳值-過程函數
    /// </summary>
    /// <param name="delaytime"></param>
    /// <param name="start"></param>
    /// <param name="end"></param>
    /// <param name="time"></param>
    /// <param name="funcDur"></param>
    /// <param name="funcEnd"></param>
    public ProcessFunction(float delaytime, float start, float end, float time, function funcDur, function funcEnd)
    {
        m_delayTime = delaytime;
        m_start = start;
        m_current = start;
        m_end = end;
        m_funcDur = funcDur;
        m_funcEnd = funcEnd;
        m_speed = (end - start) / time;
        FunctionDelegate.Instance.Function += AddUpdate;
    }


    void AddUpdate()
    {
        if (m_delayTime > 0)
        {
            m_delayTime -= Time.deltaTime;
        }
        else
        {
            m_delayTime = 0;
            m_current += m_speed * Time.deltaTime;
            if ((m_current - m_start) * (m_current - m_end) > 0)
            {
                m_current = m_end;
                m_funcDur();
                FunctionDelegate.Instance.Function -= AddUpdate;
                if (m_funcEnd != null)
                {
                    m_funcEnd();
                }
            }
            else
            {
                m_funcDur();
            }
        }
    }


    /// <summary>
    /// 前後兩回,執行單次,無傳值-過程函數  直接執行funcOnce,到time執行funcEnd
    /// </summary>
    /// <param name="delaytime">延遲執行函數1的時間,delaytime小於-0.1則立即開始</param>
    /// <param name="time">函數1結束(time)時間後執行函數2,time=0,立即開始執行函數2</param>
    /// <param name="funcOnce">函數1</param>
    /// <param name="funcEnd">函數2</param>
    public ProcessFunction(float delaytime, float time, function funcOnce, function funcEnd)
    {
        m_delayTime = delaytime;
        m_funcDur = funcOnce;
        m_speed = time;
        m_funcEnd = funcEnd;
        FunctionDelegate.Instance.Function += AddOnceUpdate;
    }
    void AddOnceUpdate()
    {
        if (m_delayTime > 0)
        {
            m_delayTime -= Time.deltaTime;
        }
        else if (m_delayTime == 0)
        {
            m_speed -= Time.deltaTime;
            if (m_speed <= 0)
            {
                if (m_funcEnd != null)
                {
                    m_funcEnd();
                }
                m_delayTime = -0.05f;
                FunctionDelegate.Instance.Function -= AddOnceUpdate;
            }
        }
        else if (m_delayTime < 0)
        {
            m_delayTime = 0;
            m_funcDur();
        }
    }


    public void StopUpdatef()
    {
        FunctionDelegate.Instance.Function -= AddUpdatef;
    }

    public void StopUpdate()
    {
        FunctionDelegate.Instance.Function -= AddUpdate;
    }
}
對於一些動畫效果,或者需要延時的方法都很有用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章