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;
}
}
對於一些動畫效果,或者需要延時的方法都很有用。
新學到的過程函數思路
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.