2017-10-07 20 views
0

これは、コンピューターが時間トリガーに基づいてタスクを実行する方法についてのより大きな質問です。イベントを発射する時間を効率的にチェックする方法は?

私はGame Clockを実行するGameManagerシングルトンインスタンスでUnityにゲームを構築しています。私はイベントがゲーム中に定期的に起こることを望んでいますが、イベントがいつ起こるべきかを知るために一連のif文を通して時間変数を実行することは非効率的で反対的なようです。

私もモバイルアプリケーションを開発していますが、私はいつもアラームがどのように機能するのか疑問に思っています(これは上記の状況と同様ですか?)。デバイス/基本タスクは24時間実行され、アラームイベントに警告するタイミングを知るためにifステートメントに相当するものをチェックすることで待機しますか?

+2

Unityの 'MonoBehaviour'は、この目的のために' Invoke'、 'InvokeRepeating'、および' StartCoroutine'関数を提供します。詳細については、マニュアルを参照してください。完全に誤解されていない場合は、公式のチュートリアルも用意されています(そうでない場合は、たくさんのytubeがあります)。 – yes

答えて

1

あなたが説明したことは、基本的にコンピュータがどのようにイベントを行うかです。 OS自体を含むほとんどのイベント駆動型プログラムは、プーリングシステムと呼ばれるものを使用します。プーリングシステムでは、既存のすべてのイベントの大きなリストがスローされ、その起動条件が満たされているかどうかがチェックされます。この発射条件は、キーボードまたはネットワークカードのような装置からの入力のような時間または他のトリガとすることができる。

Unityエンジンが実際にこれを実行します。その背後には、ユニティには、組み込みのすべてのモノブロック法の発火条件が満たされているかどうかをチェックしている場合は、常にメソッドを実行するという主要プロセスがあります。たとえば、FixedUpdateメソッドは1秒間に何度も呼び出されることが保証されていますが、30回は1秒間と思っていますが、私の頭の上からはわかりません。固定の更新のための呼び出しメソッドは、単にこれのようなものになります。

timer += Time.deltaTime(); 
while(timer >= (1.0f/30.0f)) 
{ 
    FixedUpdate(); 
    timer -= (1.0f/30.0f); 
} 

このコードは十分な時間がFixedUpdate()への別の呼び出しを実行するために経過している場合は常にチェックし、できるだけ頻繁プロセッサは許すとして実行します、プロセッサが過負荷になるので、もしこのコードはまた、バックデートを実行し、このコードはdoesnの2秒後に呼び出され、次回に呼び出されると、2秒間に十分な呼び出しが行われなくなります。

あなたのユニティアプリケーションの場合、これは小クラスで約10時間の条件しかないとすれば、それ以上のことを示唆しているようにif文を使用するだけです。二つの方法

abstract class ConditionEvent{ 
    bool ConditionMet(); 
    void Process(); 
} 

と抽象クラスは、その後、あなたのMonoBehavour呼び出しで私はConditionMet関数を呼び出すループでこれらのクラスでいっぱいのリストを持っているでしょう。この関数がtrueを返した場合は、Processを呼び出します。

関連する問題