2016-12-03 8 views
0

私は後で "再生"の動きを追跡するためにコマンドパターンを使用しています。私がこれをすると、アクションは正しく再生されますが、遅くなります。私はコルーチンとUpdate()の両方を試しましたが、問題は解決しません。ユニティ|コマンドパターン再生タイミングの差

私が最初ICommand年代のリストを保持している実行者PlayerControlを持っています。

//Properties 
private List<ICommand> oldCommands = new List<ICommand>(); 
private int updateIterationTracker = 0; 

すべての呼び出されたコマンドについて、コマンドをリストに追加します。

//If Input moves up, invoke the move up command 
if (dirVector.y > 0) 
{ 
    oldCommands.Add(dirUp); //Add the command to the list of commands 
    dirUp.Execute(); 
} 

いくつかの時点で、「リプレイ」がトリガされ、私はoldCommandsのコマンドを反復。

この機能は機能します。移動入力が行うのと同じように、移動するコマンドを起動すると実行されます。

private void IterateUpdateOnReplay(){ 
    if(iteration < oldCommands.Count){ 
     transform.position = replayStartPosition; 
    } 
    oldCommands[iteration].Execute(); 
    iteration++; 
} 

私はこれをコルーチンでも行っています。

再生は正しい順序で動きを実行し、動きが発生する可能性がありますが、シーケンス全体の実行に要する時間は最初の記録時よりも長くなります。 再生時間が長くなります。

質問:

1)が正しいペースで再生するための非常に多くのコマンドを追加する最初のキャプチャ

oldCommands.Add(dirUp); //Add the command to the list of commands 

です、実行時間によって減速?

2)この遅延を引き起こす別の問題が、私が気づいていないことはありますか?

+0

ポジションを保存したいゲームオブジェクトに対してサンプリングを実行し、クラスにデータを保存する必要がありますか?毎秒30回ですか?どのように滑らかにしたいのかによって異なります。後でループして再生し、保存されたクラスの時間を遅らせることができます。 [ここ]から開始してください(http://stackoverflow.com/a/40732139/3785314)。 – Programmer

+0

コマンドパターンのポイントに逆らっていませんか?クラスのすべてのデータを格納するのではなく、同じコマンドを同じ順序で呼び出して、再生を同じにする必要があります。 – Ryanthehouse

答えて

0

私はプロセス全体をリファクタリングし、問題は解決されました。私の移動コマンドでは、動きをクリアするコマンドがありました(最初は速度に基づいていて、速度をゼロに設定していました)。これは、ボタンの押下を超えてもベロシティを継続しないように、各フレームで発生しました。

このコマンドを保存すると、リストに格納されているコマンドが2倍になり、再生に時間がかかります。動きをポジション更新に変更してクリアコマンドを削除すると、リプレイが修正され、再生は正常です。

関連する問題