多人游戏中途加入的玩家
中途加入的玩家
在车辆受损之后才加入游戏的玩家看不到撞击过程,但损伤依然存在。服务器会保存每个车身的状态,之后连接的端会随复制一同收到该状态。没有任何“中途加入”的专门设置。其行为来自每个类如何复制自身的状态,因此本页会逐个介绍这些类。
加入者会收到什么
Section titled “加入者会收到什么”凹陷。 服务器的块会作为一个复制数组到达。加入的端根据这些块构建自己的晶格。晶格的几何形状由每一端根据相同的资产和设置计算得出,因此两端必须使用相同的配置文件。超出晶格索引范围或校验和不匹配的块会被计为有误,端会保留它原有的块。属于另一个修复代数的块会等待该代数到达。
一旦块构建完成晶格,且损伤不为零,OnDamageChanged 便会触发。加入者不需要为此设置单独的路径。
污垢。 污垢只存在于每一端本地,从不通过网络传输。加入者的车身一开始没有污垢,并根据其所见的车轮形成自己的污垢。清洗通过清洗次数复制,因此在清洗之后连接的加入者也会从干净的状态开始。
铰接部件。 服务器上已脱落的部件列表随修复代数一同到达。服务器上已脱落的部件,会在加入者首次看到车身时立即隐藏,不会有下落过程。On Detached 会在那里触发,bHiddenAtOnce 为 true,即在 BeginPlay 之后计时器的第一次 tick 时。该部件的位置也会从车身的碰撞中切除,因此其他车辆会碰到敞开的缺口。已被放开摆动的部件会从闭合位置开始摆动,并为其触发 On Started Swinging。
可破坏单元。 每个单元的等级随车身的代数一同到达,加入者会将每个单元显示在该等级上。单元的首次显示不会触发等级事件。加入者已有的损伤是否触发事件,取决于到达顺序:如果单元等级在游戏开始前到达,则游戏开始时的停稳不会触发事件;如果在之后到达,则每次等级变化都会触发一次事件。近期的破坏事件携带服务器的时间。早于 Break Event Max Age Seconds 的事件不会播放散射效果。该设置默认为 2 秒,位于 Project Settings › Plugins › Crushform Breakable › Network 中。游戏状态尚未到达的加入者会将每个事件视为过期。
倒下的树木。 树木的状态会被复制:它是否已屈服或停稳、停稳的位置和旋转,以及最后一次变化的服务器时间。加入者会将倒下的树放在它停稳的位置。对于早于 Break Event Max Age Seconds 的状态,或在游戏状态到达之前,OnYielded、OnSettled 和 OnRespawned 都不会触发。OnHit 和 OnLanded 来自本地物理,因此不会被延后。在加入者离开期间重生的树会直接贴合到其静止姿态。
玻璃。 每块玻璃板的裂纹都会被复制。加入者能够看到这些裂纹。玻璃板的首次复制不会播放声音,因此加入者没有看到的裂纹不会播放任何声音。
移动机关。 Proving Ground 的移动机关不复制任何内容。每一端都根据服务器的游戏时间计算其姿态,因此加入者看到的相位相同。
检查是否正常工作
Section titled “检查是否正常工作”启动一个监听服务器,然后将轿车撞向墙壁、撞向树木并撞向围栏。树木只有在被车撞到时才会倒下,围栏也只有被撞到时才会破坏,因此该测试需要驾驶,而不是控制台命令。然后添加一个在损伤之后加入的玩家。有两种方法:
- 在编辑器中。 打开 Editor Preferences › General › Experimental › PIE,勾选 Allow late joining。将 Net Mode 设为 Play As Listen Server,然后按 Play。关卡运行后,在 play 工具栏中按 Add Client。新的客户端会连接到正在运行的服务器。
- 作为第二个游戏实例。 从引擎的
Binaries\Win64文件夹启动它,并指定服务器地址:UnrealEditor.exe "<path to your .uproject>" 127.0.0.1:17777 -game -windowed。端口即 Play 设置中的 Server Port,默认为 17777。
在加入的实例中输入 Crushform.Stats。轿车那一行显示 client view,带有服务器的代数和大于零的块数,其 received 计数会随着块的到达而上升。服务器造成的凹陷会出现在加入者的屏幕上。该行的字段与复制与预测中那一行相同。服务器上已脱落的部件,在加入者的车身上根本不会显示。
加入者的轿车上没有任何凹陷
Section titled “加入者的轿车上没有任何凹陷”原因。 加入者会把它无法使用的块计为有误。当块的校验和失败,或其索引超出加入者的晶格范围时,就会出现这种情况。两端构建的晶格不同时,都会发生这种情况,例如它们使用了不同的配置文件资产或设置。
修复。 在加入者上查看 Crushform.Stats 中的 bad 计数。让两个构建使用相同的配置文件资产和相同的设置,然后再次检查该计数。
加入者屏幕上的裂纹是无声的
Section titled “加入者屏幕上的裂纹是无声的”原因。 尚未绘制任何内容的玻璃板是无声的,因此中途加入的玩家首次复制某块玻璃板时不会播放裂纹声音。已被复制等级打碎的玻璃板同样无声,它的破碎则会播放 Break 声音。
修复。 在加入者连接时读取玻璃板的裂纹,如下面关于树木的条目所示。插件不会为加入者没有看到的裂纹播放声音。
加入者连接之前倒下的树没有触发 OnYielded
Section titled “加入者连接之前倒下的树没有触发 OnYielded”原因。 对于早于 Break Event Max Age Seconds(默认 2 秒)的状态,以及游戏状态到达之前,OnYielded 都不会触发。
修复。 在加入者连接时读取树的状态,而不是等待事件。提高 Break Event Max Age Seconds 可以让较旧的事件触发,但同时也会让较旧的破坏事件播放其散射效果。