259 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			259 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using UnityEngine; | |||
|  | using System; | |||
|  | using System.Collections; | |||
|  | 
 | |||
|  | public static class MonoBehaviourExtensions { | |||
|  | 
 | |||
|  |     public static void SafeStopCoroutine(this MonoBehaviour monoBehaviour, Coroutine c){ | |||
|  | 		if(c != null) monoBehaviour.StopCoroutine(c); | |||
|  | 	} | |||
|  | 
 | |||
|  |     /// 1フレーム待機してからActionデリゲートを呼び出す | |||
|  |     public static Coroutine CallWaitForOneFrame(this MonoBehaviour monoBehaviour, Action act){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallWaitForOneFrame(act)); | |||
|  |     } | |||
|  |     private static IEnumerator DoCallWaitForOneFrame(Action act){ | |||
|  |         yield return null; | |||
|  |         act(); | |||
|  |     } | |||
|  |     /// 指定フレーム数待機してからActionデリゲートを呼び出す | |||
|  |     public static Coroutine CallWaitForFrame(this MonoBehaviour monoBehaviour, int frameCount, Action act){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallWaitForFrame(frameCount, act)); | |||
|  |     } | |||
|  |     private static IEnumerator DoCallWaitForFrame(int frameCount, Action act){ | |||
|  |         for(int i = 0; i < frameCount; ++i) yield return null; | |||
|  |         act(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /// 1FixedUpdate待機してからActionデリゲートを呼び出す | |||
|  |     public static Coroutine CallWaitForOneFixedUpdate(this MonoBehaviour monoBehaviour, Action act){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallWaitForOneFixedUpdate(act)); | |||
|  |     } | |||
|  |     private static IEnumerator DoCallWaitForOneFixedUpdate(Action act){ | |||
|  |         yield return new WaitForFixedUpdate(); | |||
|  |         act(); | |||
|  |     } | |||
|  |     /// 指定FixedUpdate数待機してからActionデリゲートを呼び出す | |||
|  |     public static Coroutine CallWaitForFixedUpdate(this MonoBehaviour monoBehaviour, int frameCount, Action act){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallWaitForFixedUpdate(frameCount, act)); | |||
|  |     } | |||
|  |     private static IEnumerator DoCallWaitForFixedUpdate(int frameCount, Action act){ | |||
|  |         for(int i = 0; i < frameCount; ++i) yield return new WaitForFixedUpdate(); | |||
|  |         act(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /// 指定秒数待機してからActionデリゲートを呼び出す | |||
|  |     public static Coroutine CallWaitForSeconds(this MonoBehaviour monoBehaviour, float seconds, Action act){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallWaitForSeconds(seconds, act)); | |||
|  |     } | |||
|  |     private static IEnumerator DoCallWaitForSeconds(float seconds, Action act){ | |||
|  |         yield return new WaitForSeconds(seconds); | |||
|  |         act(); | |||
|  |     } | |||
|  |     public static Coroutine CallWaitForSeconds(this MonoBehaviour monoBehaviour, float seconds, Action<float> act, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallWaitForSeconds(seconds, act, callback)); | |||
|  |     } | |||
|  |     private static IEnumerator DoCallWaitForSeconds(float seconds, Action<float> act, Action callback){ | |||
|  |         float t = 0.0f; | |||
|  |         act(t); | |||
|  |         do{ | |||
|  |             yield return null; | |||
|  |             t += Time.deltaTime; | |||
|  |             act(t); | |||
|  |         }while(t < seconds); | |||
|  |         callback(); | |||
|  |     } | |||
|  |     public static Coroutine CallWaitForRealTimeSeconds(this MonoBehaviour monoBehaviour, float seconds, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallWaitForRealTimeSeconds(seconds, ActionExtensions.EmptyActionFloat, callback)); | |||
|  |     } | |||
|  |     public static Coroutine CallWaitForRealTimeSeconds(this MonoBehaviour monoBehaviour, float seconds, Action<float> act, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallWaitForRealTimeSeconds(seconds, act, callback)); | |||
|  |     } | |||
|  |     private static IEnumerator DoCallWaitForRealTimeSeconds(float seconds, Action<float> act, Action callback){ | |||
|  |         float startupTime = Time.realtimeSinceStartup; | |||
|  |         float t = 0.0f; | |||
|  |         act(t); | |||
|  |         while(true){ | |||
|  |             yield return null; | |||
|  |             t = (Time.realtimeSinceStartup - startupTime); | |||
|  |             if(t >= seconds){ | |||
|  |                 act(seconds); | |||
|  |                 break; | |||
|  |             }else{ | |||
|  |                 act(t); | |||
|  |             } | |||
|  |         } | |||
|  |         callback(); | |||
|  |     } | |||
|  | 
 | |||
|  |     public static Coroutine CallLerp(this MonoBehaviour monoBehaviour, float duration, Action<float> act){ | |||
|  |         return monoBehaviour.CallLerp(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static Coroutine CallLerp(this MonoBehaviour monoBehaviour, float duration, Action<float> act, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallLerp(duration, act, callback)); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallLerp(float duration, Action<float> act){ | |||
|  |         return DoCallLerp(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallLerp(float duration, Action<float> act, Action callback){ | |||
|  |         float t = 0.0f; | |||
|  |         act(t); | |||
|  |         while(true){ | |||
|  |             yield return null; | |||
|  |             t += Time.deltaTime / duration; | |||
|  |             if(t >= 1.0f){ | |||
|  |                 act(1.0f); | |||
|  |                 break; | |||
|  |             }else{ | |||
|  |                 act(t); | |||
|  |             } | |||
|  |         } | |||
|  |         callback(); | |||
|  |     } | |||
|  |     public static Coroutine CallFixedLerp(this MonoBehaviour monoBehaviour, float duration, Action<float> act){ | |||
|  |         return monoBehaviour.CallFixedLerp(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static Coroutine CallFixedLerp(this MonoBehaviour monoBehaviour, float duration, Action<float> act, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallFixedLerp(duration, act, callback)); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallFixedLerp(float duration, Action<float> act){ | |||
|  |         return DoCallFixedLerp(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallFixedLerp(float duration, Action<float> act, Action callback){ | |||
|  |         float t = 0.0f; | |||
|  |         act(t); | |||
|  |         while(true){ | |||
|  |             yield return new WaitForFixedUpdate(); | |||
|  |             t += Time.fixedDeltaTime / duration; | |||
|  |             if(t >= 1.0f){ | |||
|  |                 act(1.0f); | |||
|  |                 break; | |||
|  |             }else{ | |||
|  |                 act(t); | |||
|  |             } | |||
|  |         } | |||
|  |         callback(); | |||
|  |     } | |||
|  |     public static Coroutine CallFixedLerpRealTime(this MonoBehaviour monoBehaviour, float duration, Action<float> act){ | |||
|  |         return monoBehaviour.CallFixedLerpRealTime(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static Coroutine CallFixedLerpRealTime(this MonoBehaviour monoBehaviour, float duration, Action<float> act, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallFixedLerpRealTime(duration, act, callback)); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallFixedLerpRealTime(float duration, Action<float> act){ | |||
|  |         return DoCallFixedLerpRealTime(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallFixedLerpRealTime(float duration, Action<float> act, Action callback){ | |||
|  |         float t = 0.0f; | |||
|  |         act(t); | |||
|  |         while(true){ | |||
|  |             yield return new WaitForFixedUpdate(); | |||
|  |             t += Time.fixedUnscaledDeltaTime / duration; | |||
|  |             if(t >= 1.0f){ | |||
|  |                 act(1.0f); | |||
|  |                 break; | |||
|  |             }else{ | |||
|  |                 act(t); | |||
|  |             } | |||
|  |         } | |||
|  |         callback(); | |||
|  |     } | |||
|  |     public static Coroutine CallLerpSmooth(this MonoBehaviour monoBehaviour, float duration, Action<float> act){ | |||
|  |         return monoBehaviour.CallLerpSmooth(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static Coroutine CallLerpSmooth(this MonoBehaviour monoBehaviour, float duration, Action<float> act, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallLerpSmooth(duration, act, callback)); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallLerpSmooth(float duration, Action<float> act){ | |||
|  |         return DoCallLerpSmooth(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallLerpSmooth(float duration, Action<float> act, Action callback){ | |||
|  |         float t = 0.0f; | |||
|  |         act(t); | |||
|  |         while(true){ | |||
|  |             yield return null; | |||
|  |             t += Time.smoothDeltaTime / duration; | |||
|  |             if(t >= 1.0f){ | |||
|  |                 act(1.0f); | |||
|  |                 break; | |||
|  |             }else{ | |||
|  |                 act(t); | |||
|  |             } | |||
|  |         } | |||
|  |         callback(); | |||
|  |     } | |||
|  | 
 | |||
|  |     public static Coroutine CallLerpRealtime(this MonoBehaviour monoBehaviour, float duration, Action<float> act){ | |||
|  |         return monoBehaviour.CallLerpRealtime(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static Coroutine CallLerpRealtime(this MonoBehaviour monoBehaviour, float duration, Action<float> act, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallLerpRealtime(duration, act, callback)); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallLerpRealtime(float duration, Action<float> act){ | |||
|  |         return DoCallLerpRealtime(duration, act, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static IEnumerator DoCallLerpRealtime(float duration, Action<float> act, Action callback){ | |||
|  |         float startupTime = Time.realtimeSinceStartup; | |||
|  |         float t = 0.0f; | |||
|  |         act(t); | |||
|  |         while(true){ | |||
|  |             yield return null; | |||
|  |             t = (Time.realtimeSinceStartup - startupTime); | |||
|  |             if(t >= duration){ | |||
|  |                 act(1.0f); | |||
|  |                 break; | |||
|  |             }else{ | |||
|  |                 act(t / duration); | |||
|  |             } | |||
|  |         } | |||
|  |         callback(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /// 指定秒間、指定秒間隔でactionを行う | |||
|  |     public static Coroutine CallTimer(this MonoBehaviour monoBehaviour, float seconds, float interval, Action<int> action){ | |||
|  |         return monoBehaviour.CallTimer(seconds, 0.0f, interval, action, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static Coroutine CallTimer(this MonoBehaviour monoBehaviour, float seconds, float interval, Action<int> action, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallTimer(seconds, 0.0f, interval, action, callback)); | |||
|  |     } | |||
|  |     public static Coroutine CallTimer(this MonoBehaviour monoBehaviour, float seconds, float firstTime, float interval, Action<int> action){ | |||
|  |         return monoBehaviour.CallTimer(seconds, firstTime, interval, action, ActionExtensions.EmptyAction); | |||
|  |     } | |||
|  |     public static Coroutine CallTimer(this MonoBehaviour monoBehaviour, float seconds, float firstTime, float interval, Action<int> action, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallTimer(seconds, firstTime, interval, action, callback)); | |||
|  |     } | |||
|  |     private static IEnumerator DoCallTimer(float seconds, float firstTime, float interval, Action<int> action, Action callback){ | |||
|  |         float t = 0.0f; | |||
|  |         float timer = firstTime; | |||
|  |         int counter = 1; | |||
|  |         do{ | |||
|  |             yield return null; | |||
|  |             t += Time.deltaTime; | |||
|  |             timer += Time.deltaTime; | |||
|  |             while(timer >= interval){ | |||
|  |                 timer -= interval; | |||
|  |                 action(++counter); | |||
|  |             } | |||
|  |         }while(t < seconds); | |||
|  |         callback(); | |||
|  |     } | |||
|  |     public static Coroutine CallTimerRealtime(this MonoBehaviour monoBehaviour, float seconds, float interval, Action<int> action, Action callback){ | |||
|  |         return monoBehaviour.StartCoroutine(DoCallTimerRealtime(seconds, interval, action, callback)); | |||
|  |     } | |||
|  |     private static IEnumerator DoCallTimerRealtime(float seconds, float interval, Action<int> action, Action callback){ | |||
|  |         float startupTime = Time.realtimeSinceStartup; | |||
|  |         float t = 0.0f; | |||
|  |         int counter = 0; | |||
|  |         action(counter + 1); | |||
|  |         do{ | |||
|  |             yield return null; | |||
|  |             t = (Time.realtimeSinceStartup - startupTime); | |||
|  |             int count = (int)(t / interval); | |||
|  |             if(counter != count){ | |||
|  |                 counter = count; | |||
|  |                 action(counter + 1); | |||
|  |             } | |||
|  |         }while(t < seconds); | |||
|  |         callback(); | |||
|  |     } | |||
|  | } |