Как ΠΌΡ‹ обвСсили ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ баллистичСского расчСта для мобильного ΡˆΡƒΡ‚Π΅Ρ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ компСнсации сСтСвой Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ

Как ΠΌΡ‹ обвСсили ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ баллистичСского расчСта для мобильного ΡˆΡƒΡ‚Π΅Ρ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ компСнсации сСтСвой Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, я Никита Π‘Ρ€ΠΈΠΆΠ°ΠΊ, сСрвСрный Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ· Pixonic. БСгодня я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ компСнсации Π»Π°Π³ΠΎΠ² Π² мобильном ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅Π΅Ρ€Π΅.

ΠŸΡ€ΠΎ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ Π»Π°Π³ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠ°Ρ†ΠΈΡŽ написано ΠΌΠ½ΠΎΠ³ΠΎ статСй, Π² Ρ‚ΠΎΠΌ числС Π½Π° русском языкС. Π’ этом Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ, вСдь эта тСхнология Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ создании ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… FPS Π΅Ρ‰Π΅ с ΠΊΠΎΠ½Ρ†Π° 90-Ρ‹Ρ…. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ QuakeWorld, ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΠ²ΡˆΠΈΠΉ ΠΊ Π½Π΅ΠΉ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ….

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π΅ ΠΈ ΠΌΡ‹ Π² своСм мобильном ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅Π΅Ρ€Π½ΠΎΠΌ ΡˆΡƒΡ‚Π΅Ρ€Π΅ Dino Squad.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ моя Ρ†Π΅Π»ΡŒ ― Π½Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ написано ΡƒΠΆΠ΅ тысячу Ρ€Π°Π·, Π½ΠΎ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΡ‹ внСдряли Π»Π°Π³ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠ°Ρ†ΠΈΡŽ Π² Π½Π°ΡˆΡƒ ΠΈΠ³Ρ€Ρƒ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ нашСго тСхнологичСского стэка ΠΈ особСнностСй ΠΊΠΎΡ€-гСймплСя.

Π’ ΠΏΠ°Ρ€Π΅ слов ΠΎ нашСм ΠΊΠΎΡ€Π΅ ΠΈ тСхнологиях.

Dino Squad ― сСтСвой ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ PvP-ΡˆΡƒΡ‚Π΅Ρ€. Π˜Π³Ρ€ΠΎΠΊΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€Π°ΠΌΠΈ, ΠΎΠ±Π²Π΅ΡˆΠ°Π½Π½Ρ‹ΠΌΠΈ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌ Π²ΠΎΠΎΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈ ΡΡ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ 6 Π½Π° 6.

И ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΈ сСрвСр Ρƒ нас Π½Π° Unity. АрхитСктура довольно классичСская для ΡˆΡƒΡ‚Π΅Ρ€ΠΎΠ²: сСрвСр ― Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π°Ρ€Π½Ρ‹ΠΉ, Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ клиСнтскоС прСдсказаниС. Π˜Π³Ρ€ΠΎΠ²Π°Ρ симуляция написана с использованиСм in-house ECS ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Π½Π° сСрвСрС, Ρ‚Π°ΠΊ ΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅.

Если Π²Ρ‹ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΡƒΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ ΠΏΡ€ΠΎ Π»Π°Π³ΠΎΠΊΠΎΠΌΠΏΠ΅Π½ΡΠ°Ρ†ΠΈΡŽ, Π²ΠΎΡ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ экскурс Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΠΊΡƒ.

Π’ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… FPS-ΠΈΠ³Ρ€Π°Ρ… ΠΌΠ°Ρ‚Ρ‡, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, симулируСтся Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ сСрвСрС. Π˜Π³Ρ€ΠΎΠΊΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π½Π° сСрвСр свой ΠΈΠ½ΠΏΡƒΡ‚ (ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π½Π°ΠΆΠ°Ρ‚Ρ‹Ρ… ΠΊΠ»Π°Π²ΠΈΡˆΠ°Ρ…), Π° Π² ΠΎΡ‚Π²Π΅Ρ‚ сСрвСр присылаСт ΠΈΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ состояниС ΠΈΠ³Ρ€Ρ‹ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ схСмС взаимодСйствия Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ Π½Π° ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Β«Π²ΠΏΠ΅Ρ€Π΅Π΄Β» ΠΈ Ρ‚Π΅ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° пСрсонаТ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π½Π° экранС сдвинСтся с мСста, всСгда Π±ΡƒΠ΄Π΅Ρ‚ большС ΠΏΠΈΠ½Π³Π°.

Если Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях эта Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° (Π² Π½Π°Ρ€ΠΎΠ΄Π΅ имСнуСмая input lag) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½Π°, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ³Ρ€Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΎΠ½Π° создаСт ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅ «скольТСния ΠΏΠΎ Π»ΡŒΠ΄ΡƒΒ» ΠΏΡ€ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ пСрсонаТСм. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²Π΄Π²ΠΎΠΉΠ½Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π° для ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… сСтСй, Π³Π΄Π΅ случай, ΠΊΠΎΠ³Π΄Π° Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΏΠΈΠ½Π³ составляСт 200 мс, считаСтся Π΅Ρ‰Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ соСдинСниСм. Часто ΠΏΠΈΠ½Π³ Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΈ 350, ΠΈ 500, ΠΈ 1000 мс. Π’ΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ с ΠΈΠ½ΠΏΡƒΡ‚ Π»Π°Π³ΠΎΠΌ Π² быстрый ΡˆΡƒΡ‚Π΅Ρ€ становится практичСски Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

РСшСниСм этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ становится прСдсказаниС симуляции Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π—Π΄Π΅ΡΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ сам примСняСт ΠΈΠ½ΠΏΡƒΡ‚ ΠΊ пСрсонаТу ΠΈΠ³Ρ€ΠΎΠΊΠ°, Π½Π΅ доТидаясь ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ сСрвСра. А ΠΊΠΎΠ³Π΄Π° ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½, просто свСряСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈ обновляСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠΎΠ². Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ Π½Π° ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½Π° экранС Π² этом случаС минимальна.

Π’ΡƒΡ‚ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ нюанс: сСбя ΠΊΠ»ΠΈΠ΅Π½Ρ‚ всСгда рисуСт ΠΏΠΎ послСднСму своСму ΠΈΠ½ΠΏΡƒΡ‚Ρƒ, Π° Π²Ρ€Π°Π³ΠΎΠ² ― с сСтСвой Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ, ΠΏΠΎ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… с сСрвСра. Π’ΠΎ Π΅ΡΡ‚ΡŒ, стрСляя Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°, ΠΈΠ³Ρ€ΠΎΠΊ Π²ΠΈΠ΄ΠΈΡ‚ Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сСбя. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ клиСнтскоС прСдсказаниС ΠΌΡ‹ писали Ρ€Π°Π½Π΅Π΅.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ клиСнтскоС прСдсказаниС Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π½ΠΎ создаСт Π΄Ρ€ΡƒΠ³ΡƒΡŽ: Ссли ΠΈΠ³Ρ€ΠΎΠΊ стрСляСт Π² Ρ‚Ρƒ Ρ‚ΠΎΡ‡ΠΊΡƒ, Π³Π΄Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊ находился Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ, Π½Π° сСрвСрС ΠΏΡ€ΠΈ выстрСлС Π² эту ΠΆΠ΅ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ° Π² Ρ‚ΠΎΠΌ мСстС ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΆΠ΅ ΠΈ Π½Π΅ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ. БСрвСрная лагкомпСнсация пытаСтся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. ΠŸΡ€ΠΈ выстрСлС ΠΈΠ· оруТия сСрвСр восстанавливаСт Ρ‚ΠΎ состояниС ΠΈΠ³Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΈΠ΄Π΅Π» ΠΈΠ³Ρ€ΠΎΠΊ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выстрСла локально, ΠΈ провСряСт, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ ΠΎΠ½ ΠΌΠΎΠ³ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°. Если ΠΎΡ‚Π²Π΅Ρ‚ Β«Π΄Π°Β», ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ засчитываСтся, Π΄Π°ΠΆΠ΅ Ссли ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ° Π² этой Ρ‚ΠΎΡ‡ΠΊΠ΅ Π½Π° сСрвСрС ΡƒΠΆΠ΅ Π½Π΅Ρ‚.

Π’ΠΎΠΎΡ€ΡƒΠΆΠΈΠ²ΡˆΠΈΡΡŒ этими знаниями, ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ Π»Π°Π³ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠ°Ρ†ΠΈΡŽ Π² Dino Squad. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго прСдстояло ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π° сСрвСрС Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄Π΅Π» ΠΊΠ»ΠΈΠ΅Π½Ρ‚? И Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ? Π’ нашСй ΠΈΠ³Ρ€Π΅ попадания оруТия ΠΈ способностСй Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· рСйкасты ΠΈ ΠΎΠ²Π΅Ρ€Π»Π°ΠΏΡ‹ ― Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Ρ‡Π΅Ρ€Π΅Π· взаимодСйствия с физичСскими ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€Π°ΠΌΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°. БоотвСтствСнно, Ρ‚ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ этих ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Β«Π²ΠΈΠ΄Π΅Π»Β» ΠΈΠ³Ρ€ΠΎΠΊ локально, Π½Π°ΠΌ ΠΈ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ воспроизвСсти Π½Π° сСрвСрС. На Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ использовали Unity вСрсии 2018.x. API Ρ„ΠΈΠ·ΠΈΠΊΠΈ Ρ‚Π°ΠΌ статичСский, физичСский ΠΌΠΈΡ€ сущСствуСт Π² СдинствСнном экзСмплярС. ВозмоТности ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ состояниС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ Π΅Π³ΠΎ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ, Π½Π΅Ρ‚. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ?

РСшСниС Π±Ρ‹Π»ΠΎ Π½Π° повСрхности, всС Π΅Π³ΠΎ элСмСнты ΡƒΠΆΠ΅ Π½Π°ΠΌΠΈ использовались для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡:

  1. ΠŸΡ€ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ½ Π²ΠΈΠ΄Π΅Π» ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠΎΠ², ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΆΠΈΠΌΠ°Π» Π½Π° клавиши. ΠœΡ‹ ΡƒΠΆΠ΅ писали эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈΠ½ΠΏΡƒΡ‚Π° ΠΈ использовали Π΅Π΅ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ клиСнтского прСдсказания.
  2. Нам Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ состояний ΠΈΠ³Ρ€Ρ‹. ИмСнно Π² Π½Π΅ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠΎΠ² (Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΈ ΠΈΡ… ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ²). На сСрвСрС история состояний Ρƒ нас ΡƒΠΆΠ΅ Π±Ρ‹Π»Π°, ΠΌΡ‹ использовали Π΅Π΅ для построСния Π΄Π΅Π»ΡŒΡ‚. Зная Π½ΡƒΠΆΠ½ΠΎΠ΅ врСмя, ΠΌΡ‹ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½ΠΎΠ΅ состояниС Π² истории.
  3. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π½Π° Ρ€ΡƒΠΊΠ°Ρ… Π΅ΡΡ‚ΡŒ состояниС ΠΈΠ³Ρ€Ρ‹ ΠΈΠ· истории, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ± ΠΈΠ³Ρ€ΠΎΠΊΠ°Ρ… с состояниСм физичСского ΠΌΠΈΡ€Π°. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€Ρ‹ ― ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ, Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ ― ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, лишниС ― ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ. Π­Ρ‚Π° Π»ΠΎΠ³ΠΈΠΊΠ° Ρƒ нас Ρ‚ΠΎΠΆΠ΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° написана ΠΈ состояла ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ECS систСм. Использовали ΠΌΡ‹ Π΅Π΅ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСсколько ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠ½Π°Ρ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ Unity-процСссС. И ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ физичСский ΠΌΠΈΡ€ ― ΠΎΠ΄ΠΈΠ½ Π½Π° процСсс, Π΅Π³ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠ½Π°Ρ‚Π°ΠΌΠΈ. ΠŸΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Ρ‚ΠΈΠΊΠΎΠΌ симуляции ΠΌΡ‹ «сбрасывали» состояниС физичСского ΠΌΠΈΡ€Π° ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ ΠΏΠΎ максимуму ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Unity Ρ‡Π΅Ρ€Π΅Π· Ρ…ΠΈΡ‚Ρ€ΡƒΡŽ систСму ΠΏΡƒΠ»ΠΎΠ². ΠžΡΡ‚Π°Π²Π°Π»ΠΎΡΡŒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ эту ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΡƒ для ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ состояния ΠΈΠ· ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ.

Π‘ΠΎΠ±Ρ€Π°Π² всС эти элСмСнты вмСстС, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Β«ΠΌΠ°ΡˆΠΈΠ½Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈΒ», которая ΡƒΠΌΠ΅Π»Π° ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ состояниС физичСского ΠΌΠΈΡ€Π° Π΄ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°. Код получился нСзамысловатый:

public class TimeMachine : ITimeMachine
{
     //Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… состояний
     private readonly IGameStateHistory _history;

     //Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ состояниС Π½Π° сСрвСрС
     private readonly ExecutableSystem[] _systems;

     //Набор систСм, Ρ€Π°ΡΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€Ρ‹ Π² физичСском ΠΌΠΈΡ€Π΅ 
     //ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ состояния
     private readonly GameState _presentState;

     public TimeMachine(IGameStateHistory history, GameState presentState, ExecutableSystem[] timeInitSystems)
     {
         _history = history; 
         _presentState = presentState;
         _systems = timeInitSystems;  
     }

     public GameState TravelToTime(int tick)
     {
         var pastState = tick == _presentState.Time ? _presentState : _history.Get(tick);
         foreach (var system in _systems)
         {
             system.Execute(pastState);
         }
         return pastState;
     }
}

ΠžΡΡ‚Π°Π²Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΌΠ°ΡˆΠΈΠ½Ρƒ для лагкомпСнсации выстрСлов ΠΈ способностСй.

Π’ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠΈ построСны Π½Π° ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ хитсканС, Π²Ρ€ΠΎΠ΄Π΅ всС понятно: ΠΏΠ΅Ρ€Π΅Π΄ выстрСлом ΠΈΠ³Ρ€ΠΎΠΊΠ° Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ физичСский ΠΌΠΈΡ€ Π΄ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ состояния, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ рСйкаст, Π·Π°ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΌΠ°Ρ… ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΌΠΈΡ€ Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС.

Но Π² Dino Squad Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ! Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ оруТия Π² ΠΈΠ³Ρ€Π΅ создаСт ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»Ρ‹ ― Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ ΠΏΡƒΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ лСтят нСсколько Ρ‚ΠΈΠΊΠΎΠ² симуляции (Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ― дСсятки Ρ‚ΠΈΠΊΠΎΠ²). Как Π±Ρ‹Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ, Π² ΠΊΠ°ΠΊΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»Π΅Ρ‚Π΅Ρ‚ΡŒ?

Π’ Π΄Ρ€Π΅Π²Π½Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΎ сСтСвой стСк Half-Life рСбята ΠΈΠ· Valve задавались Ρ‚Π΅ΠΌ ΠΆΠ΅ вопросом, ΠΈ ΠΈΡ… ΠΎΡ‚Π²Π΅Ρ‚ Π±Ρ‹Π» Ρ‚Π°ΠΊΠΎΠΉ: лагкомпСнсация ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½Π°, ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ Π΅Π΅ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ.

Π£ нас этой ΠΎΠΏΡ†ΠΈΠΈ Π½Π΅ Π±Ρ‹Π»ΠΎ: ΠΎΡ€ΡƒΠΆΠΈΠ΅, основанноС Π½Π° ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»Π°Ρ…, Π±Ρ‹Π»ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒ. НСмного ΠΏΠΎΠ±Ρ€Π΅ΠΉΠ½ΡˆΡ‚ΠΎΡ€ΠΌΠΈΠ², ΠΌΡ‹ сформулировали Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ показались Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ:

1. ΠœΡ‹ привязываСм ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ» ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π³ΠΎ создал. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΊ сСрвСрной симуляции для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡƒΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΌΡ‹ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ физичСский ΠΌΠΈΡ€ Π΄ΠΎ клиСнтского состояния ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ вычислСния. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволял ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° сСрвСр ΠΈ прСдсказуСмоС врСмя ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»ΠΎΠ². ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ для нас Π±Ρ‹Π»Π° особСнно Π²Π°ΠΆΠ½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас всС ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠΎΠ², ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅.

Как ΠΌΡ‹ обвСсили ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ баллистичСского расчСта для мобильного ΡˆΡƒΡ‚Π΅Ρ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ компСнсации сСтСвой Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ
На ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ ΠΈΠ³Ρ€ΠΎΠΊ Π² 30-ΠΎΠΌ Ρ‚ΠΈΠΊΠ΅ стрСляСт Ρ€Π°ΠΊΠ΅Ρ‚ΠΎΠΉ Π½Π° ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ‚, Π² ΠΊΠ°ΠΊΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π±Π΅ΠΆΠΈΡ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊ, ΠΈ Π·Π½Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°ΠΊΠ΅Ρ‚Ρ‹. Π›ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΠ°Π» Π² Ρ†Π΅Π»ΡŒ Π² 33-Π΅ΠΌ Ρ‚ΠΈΠΊΠ΅. Благодаря лагкомпСнсации ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ ΠΎΠ½ ΠΈ Π½Π° сСрвСрС

2. ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ всС Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅, Π½ΠΎ, посчитав ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΊ симуляции ΠΏΡƒΠ»ΠΈ, Π½Π΅ останавливаСмся, Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠΈΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΠΏΠΎΠ»Π΅Ρ‚ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ сСрвСрного Ρ‚ΠΈΠΊΠ°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· приблиТая Π΅Π΅ врСмя ΠΊ сСрвСрному Π½Π° ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΊ ΠΈ обновляя ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ². Π”Π΅Π»Π°Π΅ΠΌ ΠΌΡ‹ это Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ случится ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ…:

  • Π‘Ρ€ΠΎΠΊ ΠΆΠΈΠ·Π½ΠΈ ΠΏΡƒΠ»ΠΈ истСк. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ вычислСния ΠΎΠΊΠΎΠ½Ρ‡Π΅Π½Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ°Ρ… ΠΈΠ»ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅. И это Π² Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ выстрСл! Для нас это Π±Ρ‹Π»ΠΎ ΠΈ плюсом, ΠΈ минусом. Плюсом ― ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для ΡΡ‚Ρ€Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° это сущСствСнно ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π»ΠΎ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΡ Π²Ρ€Π°Π³Π°. ΠœΠΈΠ½ΡƒΡΠΎΠΌ ― ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ эффСкт наблюдался ΠΏΡ€ΠΈ ΡΡ‚Ρ€Π΅Π»ΡŒΠ±Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠΎΠ² ΠΏΠΎ ΠΈΠ³Ρ€ΠΎΠΊΡƒ: ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊ, казалось Π±Ρ‹, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выстрСлил ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ Ρ€Π°ΠΊΠ΅Ρ‚ΠΎΠΉ, Π° ΡƒΡ€ΠΎΠ½ ΡƒΠΆΠ΅ засчитали.
  • ΠŸΡƒΠ»Ρ достигла сСрвСрного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ этом случаС Π΅Π΅ симуляция продолТится Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ сСрвСрном Ρ‚ΠΈΠΊΠ΅ ΡƒΠΆΠ΅ Π±Π΅Π· лагкомпСнсации. Для ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»ΠΎΠ² это тСорСтичСски ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ число Β«ΠΎΡ‚ΠΊΠ°Ρ‚ΠΎΠ²Β» Ρ„ΠΈΠ·ΠΈΠΊΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя возрастала Π½Π΅Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° ΡΠΈΠΌΡƒΠ»ΡΡ†ΠΈΡŽ: сСрвСр Ρ‚ΠΎ простаивал, Ρ‚ΠΎ Π·Π° ΠΎΠ΄ΠΈΠ½ сСрвСрный Ρ‚ΠΈΠΊ просчитывал дСсяток Ρ‚ΠΈΠΊΠΎΠ² симуляции для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡƒΠ»ΡŒ.

Как ΠΌΡ‹ обвСсили ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ баллистичСского расчСта для мобильного ΡˆΡƒΡ‚Π΅Ρ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ компСнсации сСтСвой Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ
Π’ΠΎΡ‚ ΠΆΠ΅ сцСнарий, Ρ‡Ρ‚ΠΎ ΠΈ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅, Π½ΠΎ посчитанный ΠΏΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ схСмС. Π Π°ΠΊΠ΅Ρ‚Π° Β«Π΄ΠΎΠ³Π½Π°Π»Π°Β» сСрвСрноС врСмя Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Ρ‚ΠΈΠΊΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» выстрСл, ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΊ. Π’ 31-ΠΎΠΌ Ρ‚ΠΈΠΊΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС лагкомпСнсация ΡƒΠΆΠ΅ Π½Π΅ примСняСтся

Π’ нашСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ эти Π΄Π²Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΎΡ‚Π»ΠΈΡ‡Π°Π»ΠΈΡΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΏΠ°Ρ€ΠΎΠΉ строчСк ΠΊΠΎΠ΄Π°, поэтому Π·Π°ΠΏΠΈΠ»ΠΈΠ»ΠΈ ΠΌΡ‹ ΠΎΠ±Π°, ΠΈ Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя ΠΎΠ½ΠΈ Ρƒ нас сущСствовали ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Π’ зависимости ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠΈ оруТия ΠΈ скорости ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΏΡƒΠ»ΠΈ ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π»ΠΈ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€Π°. ΠŸΠ΅Ρ€Π΅Π»ΠΎΠΌΠ½Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ‚ΡƒΡ‚ стало появлСниС Π² ΠΈΠ³Ρ€Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊ Ρ‚ΠΈΠΏΠ° «Ссли Ρ‚Ρ‹ ΠΏΠΎΠΏΠ°Π» ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ-Ρ‚ΠΎ Ρ€Π°Π· ΠΏΠΎ Π²Ρ€Π°Π³Ρƒ Π·Π° Ρ‚Π°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя, ΠΏΠΎΠ»ΡƒΡ‡ΠΈ Ρ‚Π°ΠΊΠΎΠΉ-Ρ‚ΠΎ бонус». Π›ΡŽΠ±Π°Ρ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠ°, Π³Π΄Π΅ врСмя, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ³Ρ€ΠΎΠΊ ΠΏΠΎΠΏΠ°Π» ΠΏΠΎ Π²Ρ€Π°Π³Ρƒ, ΠΈΠΌΠ΅Π»ΠΎ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ, ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Π»Π°ΡΡŒ Π΄Ρ€ΡƒΠΆΠΈΡ‚ΡŒ со Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅, ΠΈ сСйчас ΠΎΠ½ примСняСтся для всСго оруТия ΠΈ всСх Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… способностСй Π² ΠΈΠ³Ρ€Π΅.

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоит ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ вопрос ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Если Π²Π°ΠΌ показалось, Ρ‡Ρ‚ΠΎ всС это Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽ: Ρ‚Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ², ΠΈΡ… Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Unity Π΄Π΅Π»Π°Π΅Ρ‚ довольно ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Π’ Dino Squad Π² Β«Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌΒ» случаС Π² бою ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ нСсколько сотСн ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»ΠΎΠ². Π”Π²ΠΈΠ³Π°Ρ‚ΡŒ ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ― Π½Π΅ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ€ΠΎΡΠΊΠΎΡˆΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π±Ρ‹Π»ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ число Β«ΠΎΡ‚ΠΊΠ°Ρ‚ΠΎΠ²Β» Ρ„ΠΈΠ·ΠΈΠΊΠΈ. Для этого ΠΌΡ‹ создали ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² ECS, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ записываСм врСмя ΠΈΠ³Ρ€ΠΎΠΊΠ°. Π•Π³ΠΎ ΠΌΡ‹ повСсили Π½Π° всС энтити, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ лагкомпСнсации (ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»Ρ‹, способности ΠΈ Ρ‚. Π΄.). ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ‚Π°ΠΊΠΈΡ… энтитСй, ΠΌΡ‹ кластСризуСм ΠΈΡ… ΠΏΠΎ этому Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΈΡ… вмСстС, откатывая физичСский ΠΌΠΈΡ€ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ кластСра.

На этом этапС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π² Ρ†Π΅Π»ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ систСму. Π•Π΅ ΠΊΠΎΠ΄ Π² нСсколько ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅:

public sealed class LagCompensationSystemGroup : ExecutableSystem
{
     //Машина Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
     private readonly ITimeMachine _timeMachine;

     //Набор систСм лагкомпСнсации
     private readonly LagCompensationSystem[] _systems;
     
     //Наша рСализация кластСризатора
     private readonly TimeTravelMap _travelMap = new TimeTravelMap();

    public LagCompensationSystemGroup(ITimeMachine timeMachine, 
        LagCompensationSystem[] lagCompensationSystems)
     {
         _timeMachine = timeMachine;
         _systems = lagCompensationSystems;
     }

     public override void Execute(GameState gs)
     {
         //На Π²Ρ…ΠΎΠ΄ кластСризатор ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ состояниС,
         //Π° Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄ Π²Ρ‹Π΄Π°Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ Β«ΠΊΠΎΡ€Π·ΠΈΠ½Β». Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΡ€Π·ΠΈΠ½Π΅ Π»Π΅ΠΆΠ°Ρ‚ энтити,
         //ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ для лагкомпСнсации Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΈΠ· истории.
         var buckets = _travelMap.RefillBuckets(gs);

         for (int bucketIndex = 0; bucketIndex < buckets.Count; bucketIndex++)
         {
             ProcessBucket(gs, buckets[bucketIndex]);
         }

         //Π’ ΠΊΠΎΠ½Ρ†Π΅ лагкомпСнсации ΠΌΡ‹ восстанавливаСм физичСский ΠΌΠΈΡ€ 
         //Π² исходноС состояниС
         _timeMachine.TravelToTime(gs.Time);
     }

     private void ProcessBucket(GameState presentState, TimeTravelMap.Bucket bucket)
     {
         //ΠžΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ врСмя ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹
         var pastState = _timeMachine.TravelToTime(bucket.Time);

         foreach (var system in _systems)
         {
               system.PastState = pastState;
               system.PresentState = presentState;

               foreach (var entity in bucket)
               {
                   system.Execute(entity);
               }
          }
     }
}

ΠžΡΡ‚Π°Π²Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈ:

1. ΠŸΠΎΠ½ΡΡ‚ΡŒ, насколько сильно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ пСрСмСщСния Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Для нас Π±Ρ‹Π»ΠΎ Π²Π°ΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ максимально доступной Π² условиях ΠΏΠ»ΠΎΡ…ΠΈΡ… ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… сСтСй, поэтому ΠΌΡ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ»ΠΈ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ с запасом ― 30-ю Ρ‚ΠΈΠΊΠ°ΠΌΠΈ (ΠΏΡ€ΠΈ Ρ‚ΠΈΠΊΡ€Π΅ΠΉΡ‚Π΅ Π² 20 Π³Ρ†). Π­Ρ‚ΠΎ позволяСт ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠΎΠ² Π΄Π°ΠΆΠ΅ Π½Π° ΠΎΡ‡Π΅Π½ΡŒ высоких ΠΏΠΈΠ½Π³Π°Ρ….

2. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅Ρ‚.

ΠŸΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠΎΠ² ΠΌΡ‹, понятно, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ. А Π²ΠΎΡ‚ устанавливаСмыС энСргСтичСскиС Ρ‰ΠΈΡ‚Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅Ρ‚. ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‚Π½ΠΎΠΉ способности, ΠΊΠ°ΠΊ часто ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² сСтСвых ΡˆΡƒΡ‚Π΅Ρ€Π°Ρ…. Если ΡƒΠΆ ΠΈΠ³Ρ€ΠΎΠΊ поставил Ρ‰ΠΈΡ‚ Π² настоящСм, лагкомпСнсируСмыС ΠΏΡƒΠ»ΠΈ ΠΈΠ· ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π°Ρ‚ΡŒ сквозь Π½Π΅Π³ΠΎ.

3. Π Π΅ΡˆΠΈΡ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Π»Π°Π³ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ способности Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€ΠΎΠ²: укус, ΡƒΠ΄Π°Ρ€ хвостом ΠΈ Ρ‚. ΠΏ. ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ, ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΈΡ… ΠΏΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡƒΠ»ΠΈ.

4. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€Π°ΠΌΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠ°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ выполняСтся лагкомпСнсация. По-Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΌΡƒ, ΠΈΡ… позиция Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅: ΠΈΠ³Ρ€ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ сСбя Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ находится сСйчас Π½Π° сСрвСрС. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€Ρ‹ ΡΡ‚Ρ€Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ, ΠΈ Π½Π° Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ нСсколько ΠΏΡ€ΠΈΡ‡ΠΈΠ½.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΊΠ»Π°ΡΡ‚Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ: ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ физичСскоС состояниС для всСх ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² с Π±Π»ΠΈΠ·ΠΊΠΈΠΌ ΠΏΠΈΠ½Π³ΠΎΠΌ.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²ΠΎ всСх рСйкастах ΠΈ ΠΎΠ²Π΅Ρ€Π»Π°ΠΏΠ°Ρ… ΠΌΡ‹ ΠΈ Ρ‚Π°ΠΊ всСгда ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€Ρ‹ ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ способности ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ΄ΠΆΠ΅ΠΊΡ‚Π°ΠΉΠ»Ρ‹. Π’ Dino Squad ΠΈΠ³Ρ€ΠΎΠΊΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€Π°ΠΌΠΈ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… достаточно нСстандартная ΠΏΠΎ ΠΌΠ΅Ρ€ΠΊΠ°ΠΌ ΡˆΡƒΡ‚Π΅Ρ€ΠΎΠ² гСомСтрия. Π”Π°ΠΆΠ΅ Ссли ΠΈΠ³Ρ€ΠΎΠΊ стрСляСт ΠΏΠΎΠ΄ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΡƒΠ³Π»ΠΎΠΌ, ΠΈ траСктория ΠΏΡƒΠ»ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€ Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°, пуля Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚.

Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ оруТия Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€Π° ΠΈΠ»ΠΈ Ρ‚ΠΎΡ‡ΠΊΡƒ примСнСния способности ΠΌΡ‹ вычисляСм ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ· ECS Π΅Ρ‰Π΅ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° лагкомпСнсации.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² лагкомпСнсируСмого ΠΈΠ³Ρ€ΠΎΠΊΠ° для нас нСсущСствСнно, поэтому ΠΌΡ‹ пошли ΠΏΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΈ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя Π±ΠΎΠ»Π΅Π΅ простому ΠΏΡƒΡ‚ΠΈ.

Π‘Π΅Ρ‚Π΅Π²ΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ нСльзя просто ΡƒΠ±Ρ€Π°Ρ‚ΡŒ, Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΌΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Как ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ маскировки, сСрвСрная лагкомпСнсация ΠΈΠΌΠ΅Π΅Ρ‚ свои Ρ‚Ρ€Π΅ΠΉΠ΄ΠΎΡ„Ρ„Ρ‹. Она ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ ΠΎΠΏΡ‹Ρ‚ ΡΡ‚Ρ€Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π·Π° счСт Ρ‚ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΡ‚Ρ€Π΅Π»ΡΡŽΡ‚. Для Dino Squad, Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π²Ρ‹Π±ΠΎΡ€ здСсь Π±Ρ‹Π» ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π° это всС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΅Ρ‰Π΅ ΠΈ Π²ΠΎΠ·Ρ€ΠΎΡΡˆΠ΅ΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ сСрвСрного ΠΊΠΎΠ΄Π° Π² Ρ†Π΅Π»ΠΎΠΌ ― ΠΊΠ°ΠΊ для программистов, Ρ‚Π°ΠΊ ΠΈ для Π³Π΅ΠΉΠΌΠ΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€ΠΎΠ². Если Ρ€Π°Π½ΡŒΡˆΠ΅ симуляция прСдставляла ΠΈΠ· сСбя простой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² систСм, Ρ‚ΠΎ с лагкомпСнсациСй Π² Π½Π΅ΠΉ появились Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ вСтвлСния. На Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ с Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π½Π΅ΠΌΠ°Π»ΠΎ сил.

Π’ 2019 вСрсии (Π° ΠΌΠΎΠΆΠ΅Ρ‚, ΠΈ Ρ‡ΡƒΡ‚ΡŒ Ρ€Π°Π½ΡŒΡˆΠ΅), Π² Unity появилась плюс-минус полноцСнная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° нСзависимых физичСских сцСн. ΠœΡ‹ ΠΏΠΎΡ‡Ρ‚ΠΈ сразу послС обновлСния Π²Π½Π΅Π΄Ρ€ΠΈΠ»ΠΈ ΠΈΡ… Π½Π° сСрвСрС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ поскорСС ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ для всСх ΠΊΠΎΠΌΠ½Π°Ρ‚ физичСского ΠΌΠΈΡ€Π°.

ΠœΡ‹ Π²Ρ‹Π΄Π°Π»ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅ ΠΏΠΎ своСй физичСской сцСнС ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ избавились ΠΎΡ‚ нСобходимости Β«ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒΒ» сцСну ΠΎΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… сосСднСй ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ расчСтом симуляции. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это Π΄Π°Π»ΠΎ сущСствСнный прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Ρ†Π΅Π»ΠΎΠ³ΠΎ класса Π±Π°Π³ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ Π² случаС, Ссли программист допустил ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΠΊΠΎΠ΄Π΅ очистки сцСны ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… элСмСнтов. Π’Π°ΠΊΠΈΠ΅ ошибки Π±Ρ‹Π»ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅, ΠΈ ΠΎΠ½ΠΈ часто ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ состояниС физичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² со сцСны ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹ Β«ΠΏΠ΅Ρ€Π΅Ρ‚Π΅ΠΊΠ°Π»ΠΎΒ» Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ.

Помимо этого, ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Π»ΠΈ нСбольшоС исслСдованиС Π½Π° Ρ‚Π΅ΠΌΡƒ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ физичСскиС сцСны для хранСния истории физичСского ΠΌΠΈΡ€Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ, условно, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅ Π½Π΅ ΠΎΠ΄Π½Ρƒ сцСну, Π° 30 сцСн, ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… цикличСский Π±ΡƒΡ„Π΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ. Π’ Ρ†Π΅Π»ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ оказался Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ, Π½ΠΎ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ ΠΌΡ‹ Π΅Π³ΠΎ Π½Π΅ стали: ΠΎΠ½ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π» ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΡΡƒΠΌΠ°ΡΡˆΠ΅Π΄ΡˆΠ΅Π³ΠΎ прироста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π» довольно рискованных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π‘Π»ΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΎΠ²Π΅Π΄Π΅Ρ‚ сСбя сСрвСр ΠΏΡ€ΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ‚Π°ΠΊΠΈΠΌ количСством сцСн. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ послСдовали ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ: Β«If it ain’t broke, don’t fix itΒ».

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com