2016-12-03 2 views
0

J'utilise le motif de commande pour suivre le mouvement des "replays" plus tard. Lorsque je fais cela, les actions se rejouent correctement, mais plus lentement. J'ai essayé les deux coroutines et Update() et le problème persiste.Unité | Commande Mot de passe Lecture Différence Différence

I d'abord avoir une InvocateurPlayerControl qui contient une liste de ICommand « s.

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

Pour chaque commande invoquée, j'ajoute la commande à la liste.

//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(); 
} 

À un certain moment une « reprise » est déclenchée et j'itérer les commandes oldCommands.

Cette fonctionnalité fonctionne. Tout comme le fait l'entrée move, le déclenchement de la commande de déplacement s'exécute.

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

J'ai aussi fait cela dans une coroutine.

La lecture peut exécuter les mouvements dans le bon ordre et les mouvements peuvent se produire, mais le temps qu'il faut pour exécuter toute la séquence est plus longue que le temps qu'il a fallu à l'enregistrement initial. La lecture est plus longue.

Questions:

1) Est-ce la capture initiale

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

ajouter trop de commandes pour lire au rythme correct, ralenti par des temps d'exécution?

2) Y at-il une autre question potentiellement causer ce retard que je ne connais pas?

+0

Vous devez effectuer l'échantillonnage sur les objets du jeu que vous souhaitez stocker leur position puis stocker les données dans class.Maybe 30 fois par-sec? Cela dépend de la façon dont vous voulez qu'il soit lisse. Vous pouvez ensuite les boucler plus tard pour les lire et ensuite retarder avec l'heure dans la classe stockée. Commencez par [ici] (http://stackoverflow.com/a/40732139/3785314). – Programmer

+0

Cela ne va-t-il pas à l'encontre d'un modèle de commande? Au lieu de stocker toutes les données pour la classe, vous appelez simplement les mêmes commandes dans le même ordre et la relecture doit être identique. – Ryanthehouse

Répondre

0

Je refactorisé tout le processus et le problème est résolu. Dans mes commandes de mouvement, j'avais une commande qui effacait le mouvement (qui était initialement basé sur la vélocité, mettant la vélocité à zéro). Cela se produisait à chaque image afin de ne pas permettre à la vélocité de continuer à se déplacer au-delà d'une pression sur un bouton.

Enregistrer cette commande doublait les commandes enregistrées dans la liste de lecture faisant prendre plus de temps. Lorsque j'ai changé le mouvement pour une mise à jour de position et que j'ai supprimé la commande d'effacement, la lecture a été corrigée et la lecture est normale.