UnityTimerタイマー[搬送][Github]

3537 ワード

紹介する


Unity 3 Dでの遅延実行操作このライブラリは、Alexander Biggs+Adam Robinson-Yuが作成したPitfall Planetを含む複数のプロジェクトの戦闘テストと改善を経て作成されました.ソースエンジニアリング

インストール


UnityTimerの最新バージョンを取得するには、Releasesページに移動し、最新バージョンからTimerをダウンロードします.unitypackageファイル.そして、Unityプロジェクトを開くと開くことができる.unitypackageファイルを使用して、スクリプトをプロジェクトにインストールします.または、最新バージョンを維持する場合は、このリポジトリをプロジェクトのAssetsフォルダにクローンできます.しかし、これはあなたに安定したバージョンを与えることを保証しません.

基本例


Unity Timerでは、次のようにタイマーを作成します.
/// < summary > 
/// , 。///  summary > 
/// < param  name = “ duration ” > , 。 param > 
/// < param  name = “ onComplete ” > 。 param > 
public static Timer Register(float duration, Action onComplete);

呼び出し方法は次のようになります.
// 5  "Hello World".
Timer.Register(5f, () => Debug.Log("Hello World"));

動機


開梱して使用します.このライブラリがなければ、Unityにはタイマーを処理する方法が2つあります.
1.WaitForSecondsメソッドを使用します.2.タイマの開始時間をプライベート変数(startTime=Time.timeなど)に格納し、更新呼び出しif(Time.time-startTime>=timerDuration)を確認します.
1つ目の方法は冗長で、IEnumerator関数を使用するためにコードを再構築させます.さらに、コンシステントを開始するためにMonoBehaviourインスタンスにアクセスする必要があります.これは、このソリューションが非MonoBehaviourクラスに適用されないことを意味します.最後にWaitForSecondsがTimeScaleの変化の影響を受けることを阻止することはできなかった.2つ目の方法はエラーが発生しやすく、コードが読みにくいように、実際のゲームロジックを非表示にします.このライブラリは、この2つの問題を緩和し、Unityプロジェクトの任意のクラスに読みやすく、表現力のあるタイマーを簡単に追加できます.

とくせい

isLoopedをtrueに設定することでタイマーを繰り返します.
// 。
Timer.Register(2f, player.Jump, isLooped: true);

呼び出し後にタイマーをキャンセルします.
Timer timer;
void Start() 
{
   timer = Timer.Register(2f, () => Debug.Log("You won't see this text if you press X."));
}
void Update() 
{
   if (Input.GetKeyDown(KeyCode.X)) {
      Timer.Cancel(timer);
   }
}
useRealTimeをtrueとすることにより、TimeではなくrealtimeSinceStartupで時間を測定する.Scale.
// 0 。
Time.timeScale = 0f;
//... useRealTime, , 。
Timer.Register(1f, this.HandlePausedGameState, useRealTime: true);

MonoBehaviourにタイマーをアタッチし、MonoBehaviour時にタイマーを破棄します.通常、MonoBehaviourから呼び出されたタイマーは、その動作の状態を操作します.したがって、通常の方法は、MonoBehaviourのOnDestroyメソッドのタイマーをキャンセルすることです.TimerをMonoBehaviourに接続する便利な拡張方法を追加し、MonoBehaviourがnullとして検出されるとタイマーが自動的にキャンセルされます.
public class CoolMonoBehaviour : MonoBehaviour 
{
  void Start() 
  {
      //   AttachTimer Timer, , Timer 。 
      this.AttachTimer(5f, () => 
      {
         // , ,
         //  。
         this.gameObject.transform.position = Vector3.zero;
      });
   }   
void Update() 
{
      //  !
      if (Input.GetKeyDown(KeyCode.X))
      {
         GameObject.Destroy(this.gameObject);
      }
   }
}

onUpdateコールバックを使用して値を逐次更新します.
//  。
Color color = Color.white;
float transitionDuration = 5f;
Timer.Register(transitionDuration,
   onUpdate: secondsElapsed => color.r = 255 * (secondsElapsed / transitionDuration),
   onComplete: () => Debug.Log("Color is now red"));

他にも多くの有用な機能が含まれています
  • timer.Pause()
  • timer.Resume()
  • timer.GetTimeRemaining()
  • timer.GetRatioComplete()
  • timer.isDone

  • Timer/Exampleフォルダには、すべての機能を示すテストシーンスクリプトが含まれています.

    使用説明/注意事項

  • このライブラリは現在Hololensには適用されていないようです.解決策を探しています.
  • シーンを変更すると、すべてのタイマーが破棄されます.通常、この動作が必要であり、タイマがTimerControllerによって更新され、TimerControllerはシーンが変化すると破壊されるため発生します.したがって、シーンを閉じるとき(オブジェクトのOnDestroyメソッドなど)にTimerを作成すると、TimerControllerの生成時にUnityエラーが発生することに注意してください.