2016-12-03 1 views
0

커맨드 패턴을 사용하여 나중에 "리플레이"의 움직임을 추적합니다. 이렇게하면 작업이 올바르게 재생되지만 속도는 느려집니다. 나는 coroutines와 Update() 두 가지를 모두 시도했지만 문제가 지속됩니다.Unity | 커맨드 패턴 플레이 백 타이밍 차이

먼저 호출자PlayerControl이 있으며 ICommand의 목록이 있습니다.

//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

전체 프로세스를 리팩토링하여 문제가 해결되었습니다. 내 이동 명령에는 이동을 지우는 명령이 있습니다.이 명령은 처음에는 속도를 기반으로했으며 속도를 0으로 설정했습니다. 이것은 각 프레임에서 버튼 누름보다 속도가 계속 움직이지 않도록하기 위해 발생했습니다.

이 명령을 저장하면 목록에 저장된 명령이 두 배로되어 재생 속도가 오래 걸릴 수 있습니다. 움직임을 위치 업데이트로 변경하고 clear 명령을 제거하면 재생이 정정되고 재생이 정상입니다.