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

C# 使用时间戳列表记录和重放输入,c#,unity3d,C#,Unity3d,我正在尝试录制播放器的输入并回放。我这样做是通过制作一个列表,每次玩家点击时,我都会在其中添加当前帧。回放时,我会将列表与当前帧进行比较。当播放器单击的帧与当前播放帧相等时,将发生一个动作 public float recordingFrames; public float playbackFrames; public List<float> clickFrames; public bool recording; public bool playing; if (recording

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

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!")
        }
    }
}
公共浮动记录帧;
公共浮动播放框架;
公共列表点击框;
公共广播录音;
公共足球;
如果(录音)
{
recordingFrames+=Time.deltaTime;
if(输入。GetMouseButton(0))
{
单击帧。添加(录制帧);
}
}
如果(播放)
{
playbackrames+=Time.deltaTime;
对于(int i=0;i

从未收到调试日志。我怎样才能解决这个问题?谢谢大家!

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

这还可以避免重复执行while
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!");
        }
    }
}
公共浮动记录帧;
公共浮动播放框架;
公共列表点击框;
公共广播录音;
公共足球;
公共int-nextClickFrameIndex;
public void BeginPlayback()
{
nextClickFrameIndex=0;
回放=真;
}
public void InputRecordPlayback()
{
如果(录音)
{
recordingFrames+=Time.deltaTime;
if(输入。GetMouseButton(0))
{
单击帧。添加(录制帧);
}
}
如果(播放)
{
playbackrames+=Time.deltaTime;
//在重播中单击鼠标左键时循环
//从最后一帧开始,您可以单击播放
当(
nextClickFrameIndex您不能对
浮点值使用
=
。而是使用
if(Mathf.近似(clickFrames[i],playbackFrames))
或使用threshold
if(Mathf.Abs)(clickFrames[i]-playbackFrames)还有。您不应该检查大致的帧数,因为录制插曲和播放插曲之间的
deltaTime
不应相同,除非您在
FixedUpdate
中处理输入(您不应该这样做)