使用时间戳列表记录和重放输入



我正在尝试记录玩家输入并播放。 我通过制作一个列表来做到这一点,每次玩家单击时都会在其中添加当前帧。 当我播放它时,我将列表与当前帧进行比较。 当播放器单击的帧等于当前播放帧时,将发生操作。

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!")
}
}
}

永远不会收到调试日志。我该如何解决这个问题?谢谢!

没有理由期望Time.deltaTime是恒定的。您可能永远不会以这种方式获得相同的累积时间。只要下一个时间戳小于或等于当前时间戳,您最好单击,并相应地跟踪您在clickFrames列表中的位置。

这也可以让您避免循环访问 whileclickFrames列出每一帧:

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!");
}
}
}

最新更新