Запись и воспроизведение ввода с использованием списка временных меток - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь записать вход проигрывателя и воспроизвести его.Я делаю это, делая список, в который я добавляю текущий кадр каждый раз, когда игрок нажимает.при воспроизведении я сравниваю список с текущим кадром.когда кадр, по которому щелкнул игрок, равен текущему кадру воспроизведения, произойдет действие.

public float recordingFrames;
public float playbackFrames;
public List<float> clickFrames;
public bool recording;
public bool playing;

if (recording)
{
    recordingFrames += Time.deltaTime;
    if (Input.GetMouseButton(0))
    {
        clickFrames.Add(recordingFrames);
    }
}

if (playback)
{
    playbackFrames += Time.deltaTime;
    for (int i = 0; i < clickFrames.Count; i++)
    {
        if (clickFrames[i] == playbackFrames)
        {
            Debug.Log("hello!")
        }
    }
}

журнал отладки не будет получен.Как я могу это исправить?спасибо!

1 Ответ

1 голос
/ 25 сентября 2019

Нет никаких оснований ожидать, что Time.deltaTime будет постоянным.Вы, вероятно, никогда не будете получать такое же общее количество времени таким образом.Вам лучше нажимать, если следующая временная метка меньше или равна текущей временной метке, и отслеживать, где вы находитесь в списке clickFrames соответственно.

Это также позволяет избежать итерациив то время как clickFrames перечисляет каждый кадр:

public float recordingFrames;
public float playbackFrames;
public List<float> clickFrames;
public bool recording;
public bool playing;
public int nextClickFrameIndex;

public void BeginPlayback()
{
    nextClickFrameIndex = 0;
    playback = true;
}

public void InputRecordPlayback()
{
    if (recording)
    {
        recordingFrames += Time.deltaTime;
        if (Input.GetMouseButton(0))
        {
            clickFrames.Add(recordingFrames);
        }
    }

    if (playback)
    {
        playbackFrames += Time.deltaTime;

        // loop while you have clicks left in the replay
        // AND you have clicks to playback since the last frame
        while (
                nextClickFrameIndex < playBackFrames.Count 
                && clickFrames[nextClickFrameIndex] <= playbackFrames 
                )
        {
            nextClickFrameIndex++;
            Debug.Log("hello!");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...