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
列表中的位置
这还可以避免重复执行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!");
}
}
}
公共浮动记录帧;
公共浮动播放框架;
公共列表点击框;
公共广播录音;
公共足球;
公共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))
或使用thresholdif(Mathf.Abs)(clickFrames[i]-playbackFrames)还有。您不应该检查大致的帧数,因为录制插曲和播放插曲之间的deltaTime
不应相同,除非您在FixedUpdate
中处理输入(您不应该这样做)