游戏环路
阅读
2023-07-25更新
最新编辑:晨1999
阅读:
更新日期:2023-07-25
最新编辑:晨1999
每刻(Tick)
Simulate
参考:
每个Tick (默认60次一秒), 客户端会向服务器发送一个命令(Command)。这个命令会被 simulated。这意味着它从命令获取输入(例如,新的视角)并将其应用到棋子上(列如,将朝向对齐视角)。
在它被发送到服务器的同时,客户端本地也会运行相同的命令。这被称作预测。这允许像移动,射击和跳跃这样的输入感觉上是即时的,没有延迟。
在客户端运行命令后,它会存储所有已更改的实体变量,当该tick的结果从服务器返回时,它对它们进行比较。如果它们不一样,则表示发生了预测错误。
每帧(Frame)
这些东西在客户端每帧都被调用。
BuildInput
参考:
每帧我们都会构建输入。这将把来自鼠标、键盘和控制器的输入转换成命令,并在下一个 tick 时发送到服务器。
在 BuildInput 中,您可以使用Input函数来操作输入 - 例如使用 Input.ClearActions() 来清除动作,以及为标有 [ClientInput] 的属性赋值。
这是通过将 InputBuilder 类传递给游戏模式 - 然后将其传递给当前的摄像机和棋子。这些回调通常用于将鼠标移动转换为视角等操作。
您可以通过在游戏类中重写 BuildInput函数来覆盖所有这些行为。
拟帧(Frame Simulate)
参考:
由于Simulate
只在每一刻(默认情况下为 60fps)发生一次,而玩家的显示器可能会显示远高于此的帧率,客户端在视线方向等方面会感觉非常不流畅。为了解决这种不匹配的问题,FrameSimulate
会在客户端的每一帧都被调用,让游戏有机会平滑任何可能出现的卡顿或不流畅。
这通常用于根据视线方向更新内容(例如 Pawn.AimRay)。
重要的是要意识到这只是客户端的设置,因此如果您在这里设置了什么,就需要在 Simulate中更新。如果您无法注释掉 FrameSimulate 代码并使游戏正常运行,那么您就做错了。
事件(Events)
您还可以让您的游戏代码在诸如 tick 等事件(event)发生时触发,这样您就可以在服务器端独立于客户端运行逻辑。