áááºá¹ááá¬áá«á áá»áœááºá¯ááºááẠPixonic á០áá¬áá¬áá±á¬á·ááºáá²áá±ážáá¬ážáá° Nikita Brizhak ááŒá
áºáá«áááºá áá®áá±á·áá±á¬á· mobile multiplayer ááŸá¬ ááŸá±ážááœá±ážááŸá¯á¡ááœáẠáá»á±á¬áºááŒá±ážáá±ážááá·áºá¡ááŒá±á¬ááºáž ááŒá±á¬áá»ááºáá«áááºá
áá¯ááŸá¬ážáá¬áá¬ááŒáá·áº á¡áá«á¡ááẠáá¬áá¬áá±á¬ááºáá»ááŒááºážáá»á±á¬áºááŒá±ážááœá±á¡ááŒá±á¬ááºáž áá±á¬ááºážáá«ážáá»á¬ážá áœá¬ááᯠáá±ážáá¬ážáá¬ážáááºá á€áááºážááá¬ááᯠ90sááŸá±á¬ááºážááá¯ááºážááááºážá multiplayer FPS áááºáá®ážááŸá¯ááœáẠáááºááŒáœá áœá¬á¡áá¯á¶ážááŒá¯áá¬áá±á¬ááŒá±á¬áá·áº á¡á¶á·ááŒá áá¬ááá¯ááºáá«á á¥ááá¬á¡á¬ážááŒáá·áºá áááºážááá¯á¡áá¯á¶ážááŒá¯áá²á·ááá·áº ááááá¯á¶ážáá±á¬ QuakeWorld mod ááᯠáááºááŸááºááááá¯ááºáááºá
áááºážááᯠáá»áœááºá¯ááºááá¯á·á ááá¯ááá¯ááºážááºáá á¬ážááá¬ážáá±á«ááºážá á¯á¶ áá±áááºááá¬áž Dino Squad ááœááºáááºáž á¡áá¯á¶ážááŒá¯áá«áááºá
á€áá±á¬ááºážáá«ážááœááºá áá»áœááºá¯ááºááááºááŸááºážáá»ááºááŸá¬ á¡ááŒáááºáá
áºáá±á¬ááºáá±ážáá¬ážááŒá®ážáá±á¬ á¡áá¬ááᯠááŒááºáá¯ááºáááºááá¯ááºáá²á áá»áœááºá¯ááºááá¯á·ááááºážááá¬á¡á
á¯á¡áá±ážááŸáá·áº á¡áááááááºážáá
á¬ážááŒááºážá¡ááºá¹áá«áááºáá»á¬ážááᯠááá·áºááœááºážá
ááºážá
á¬ážáᬠáá»áœááºá¯ááºááá¯á·áááááºážááœáẠáá±á¬ááºáá»áá»á±á¬áºááŒá±ážááᯠáááºááá¯á·á¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºááᯠááŒá±á¬ááŒáááºááŒá
áºáááºá
áá»áœááºá¯ááºááá¯á·á Cortex ááŸáá·áº áááºážááá¬á¡ááŒá±á¬ááºáž á
áá¬ážá¡áááºážáááºá
Dino Squad ááẠááœááºáááºááá¯ááá¯ááºáž PvP áá±áááºááá¬ážááŒá áºáááºá áá á¬ážááá¬ážáá»á¬ážááẠáááºáááºáá»áá¯ážá á¯á¶áááºáááºáá¬ážáá±á¬ ááá¯ááºááá¯áá±á¬áá»á¬ážááᯠááááºážáá»á¯ááºááŒá®áž 6v6 á¡ááœá²á·áá»á¬ážááœáẠá¡áá»ááºážáá»ááºáž ááá¯ááºááá¯ááºááŒáááºá
client ááŸáá·áº server ááŸá áºáá¯áá¯á¶ážááẠUnity ááá¯á¡ááŒá±áá¶áááºá áááá¯áá¬áááºáá¬ááẠáá±áááºááá¬ážáá»á¬ážá¡ááœáẠá¡áá±á¬áºáá±áž ááá¹ááááºááŒá áºáááº- áá¬áá¬ááẠá¡á¬áá¬ááŸááºááŒá áºááŒá®ážá áááá¯ááºážááá·áºááá·áºááŸááºážáá»ááºááẠáá¯á¶ážá áœá²áá°áá»á¬ážáá±á«áºááœáẠá¡áá¯ááºáá¯ááºáááºá ááááºážá á¥áºážá á¬ážáá¯á¶ááᯠin-house ECS áá¯á¶ážááŒá®áž áá±ážáá¬ážáá¬ážááŒá®áž server ááŸáá·áº client ááŸá áºáá¯áá¯á¶ážááœáẠá¡áá¯á¶ážááŒá¯áá«áááºá
á¡áááºá áá±á¬ááºáá»áá»á±á¬áºááŒá±ážá¡ááŒá±á¬ááºáž ááẠááááá¯á¶ážá¡ááŒááẠááŒá¬ážááááá«áá á€ááœáẠááŒá¿áá¬á¡ááœáẠá¡áá»ááºážáá»á¯á¶áž áá±á·áá¬áá±ážááá®áž ááŒá áºáá«áááºá
áá á¬ážáá°á¡áá»á¬ážá¡ááŒá¬áž FPS ááááºážáá»á¬ážááœááºá ááœá²ááᯠá¡áá»á¬ážá¡á¬ážááŒáá·áº á¡áá±ážááááºážáá¬áá¬ááœáẠáá¯á¶á á¶áá°ááŒá¯áá¯ááºáá¬ážáááºá áá á¬ážáá°áá»á¬ážááẠáááºážááá¯á·á ááá·áºááœááºážááŸá¯ (ááá¯ááºáá»á¬ážá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááº) ááᯠáá¬áá¬ááá¯á· áá±ážááá¯á·ááŒááŒá®ážá áá¬áá¬ááẠáááºážááá¯á·á¡á¬áž áááºáá¶áááŸáááá·áº á¡áá»ááºá¡áááºááᯠááá·áºááœááºážá ááºážá á¬ážáᬠááœááºážáá¶áá¬ážáá±á¬ ááááºážá¡ááŒá±á¡áá±áá áºáá¯ááᯠáá±ážááá¯á·áááºá á€á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯á¡á á®á¡á ááºááŒáá·áºá ááŸá±á·ááá¯á·ááá¯ááºááá¯ááŸáááºááŒááºážááŸáá·áº á ááááºáá±á«áºááœáẠáá á¬ážáá°áá¬ááºáá±á¬ááºááœá±á·áá»á¬ážááá·áºá¡áá»áááºá¡ááŒá¬áž ááŸá±á¬áá·áºááŸá±ážááŸá¯ááẠping ááẠá¡ááŒá²ááá¯áá±áááºááŒá áºáááºá
ááŒááºááœááºážááœááºáááºáá»á¬ážááœáẠá€ááŸá±á¬áá·áºááŸá±ážááŒááºáž (á¡áááºá¡ááœááºáá±á¬ááºáá»ááŒááºáž) ááẠáááááá¬ážááááá¯ááºáá±á¬áºáááºáž á¡ááºáá¬áááºááŸáá áºááá·áº áá á¬ážááá·áºá¡áá« áá¬ááºáá±á¬ááºáá áºáá¯ááᯠááááºážáá»á¯ááºááá·áºá¡áá« âáá±áá²áá±á«áºáá»áŸá±á¬áá»ááŒááºážâ áá¶á á¬ážáá»ááºááᯠáááºáá®ážáá±ážáá«áááºá á€ááŒá¿áá¬ááẠááá¯ááá¯ááºážááœááºáááºáá»á¬ážá¡ááœáẠááŸá áºááááºááá¯ááºááŒá®áž áá á¬ážááá¬ážáá áºáŠážá ping ááẠ200 ms ááŒá áºáá±á¬á¡áá«ááœáẠáá±á¬ááºážááœááºáá±á¬áá»áááºáááºááŸá¯áᯠáá°ááá²ááŒá áºáááºá áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº ping ááẠ350á 500 ááá¯á·ááá¯áẠ1000 ms ááŒá áºááá¯ááºáááºá ááá¯á·áá±á¬áẠinput lag ááŒáá·áº á¡ááŒááºáá±áááºááá¬ážááᯠáá á¬ážááẠáááŒá áºááá¯ááºááá±á¬áẠááŒá áºáá¬áááºá
á€ááŒá¿áá¬á¡ááœáẠááŒá±ááŸááºážáá»ááºááŸá¬ client-side simulation ááá·áºááŸááºážáá»ááºááŒá áºáááºá á€ááœáẠáááá¯ááºážááá·áºááá¯ááºááá¯ááºá áá¬áá¬á០áá¯á¶á·ááŒááºáá»ááºááᯠáá á±á¬áá·áºáá² áá á¬ážááá¬ážáá¬ááºáá±á¬ááºá¡ááœáẠááá·áºááœááºážááŸá¯ááᯠá¡áá¯á¶ážáá»áááºá á¡ááŒá±áááŸááá±á¬á¡áá«ááœáẠáááºážááẠááááºáá»á¬ážááᯠááŸáá¯ááºážááŸááºáᬠááŒáá¯ááºáááºáá»á¬ážá áá¬áá°ážáá»á¬ážááᯠá¡ááºááááºáá¯ááºáááºá á€ááá á¹á ááœáẠá ááááºáá±á«áºááœáẠáá±á¬á·ááá¯ááŸáááºááŒááºážááŸáá·áº ááááºááŒáááŒááºážááŒá¬ážááŸá±á¬áá·áºááŸá±ážááŸá¯ááẠá¡áááºážáááºáá»áŸáá¬ááŒá áºáááºá
á€áá±áá¬ááœáẠááœá²ááŒá¬ážááŸá¯ááᯠáá¬ážáááºááẠá¡áá±ážááŒá®ážáááº- áááá¯ááºážááá·áºááẠáááºážááá±á¬ááºáá¯á¶ážááá·áºááœááºážááŸá¯á¡á á¡ááŒá²áááºáž áá°á·ááá¯ááºáá° ááœá²áááºáᬠáááºáá°áá»á¬áž - áá¬áá¬á០áá±áá¬á០ááááºá¡ááŒá±á¡áá±á¡ááá¯ááºáž ááœááºáááºááŸá±á¬áá·áºááŸá±ážááŸá¯ááŸáá·áºá¡áá°á ááá¯ááá¯áááºááŸá¬ áááºáá°ááᯠáá
áºáááºáá±á¬á¡áá« áá
á¬ážááá¬ážá áá°á·ááᯠá¡ááááºá áá°á·ááá¯ááºáá° ááŒááºáááºá áá±á¬ááºáááºááá·áºááŸááºážáá»ááºá¡ááŒá±á¬ááºáž áá±á¬ááºáááº
ááá¯á·ááŒá±á¬áá·áºá áá±á¬ááºáááºááá·áºááŸááºážáá»ááºááẠááŒá¿áá¬áá áºáá¯ááᯠááŒá±ááŸááºážááá¯ááºáá±á¬áºáááºáž á¡ááŒá¬ážáá áºáá¯ááᯠáááºáá®ážáááº- áá á¬ážááá¬ážáá áºáŠážááẠááááºááááºáá°ááŸááá²á·ááá·áºáá±áá¬ááá¯á áá¬áá¬áá±á«áºá áá áºáááºáá«áá áááºáá°ááẠááá¯áá±áá¬ááœáẠááŸááá±á¬á·áááºááá¯ááºáá«á á€ááŒá¿áá¬ááᯠááŒá±ááŸááºážááẠáá¬áᬠáá±á¬ááºáá»áá±áá±á¬ áá»á±á¬áºááŒá±ážááœá± ááŒáá¯ážáááºážááŸá¯áá»á¬ážá áááºáááºáá áºáᯠáá áºáááºááá¯ááºáá±á¬á¡áá« áá¬áá¬ááẠáá áºáááºáá»áááºááœáẠáá á¬ážááá¬ážá ááŒááºááœááºážá ááŒááºááœá±á·áá²á·áááá·áº ááááºážá¡ááŒá±á¡áá±ááᯠááŒááºáááºááá°ááŒá®áž áááºáá°ááᯠá¡ááŸááºáááẠááááŸááºááŒááºáž ááŸáá áááŸá á á áºáá±ážáááºá á¡áááºá á¡ááŒá±ááẠ"Yes" ááŒá áºáá«áá áááºáá°ááẠááá¯á¡áá»áááºááœáẠáá¬áá¬ááœááºáááŸááá±á¬á·áá»áŸááºááẠhit ááá¯áá±ááœááºáááºá
á€á¡ááááá¬ááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠDino Squad ááœáẠáá¬áá¬áá±á¬ááºáá»áá»á±á¬áºááŒá±ážááᯠá áááºá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá ááááŠážá áœá¬á client áááºááŒááºáá±á¬á¡áá¬ááá¯áá¬áá¬ááœááºáááºááá¯á·ááŒááºáááºááá°ááááºáááºážá á¡ááá¡áá»áá¬ááœá±ááŒááºáá¯ááºáááŸá¬áá²? áá»áœááºá¯ááºááá¯á·áááááºážááœááºá áááºáááºáá»á¬ážááŸáá·áº á áœááºážáááºáá»á¬ážá០ááááŸááºááŸá¯áá»á¬ážááᯠraycasts ááŸáá·áº overlays áá»á¬ážááŸáááá·áº ááœááºáá»ááºááẠ- ááá¯ááá¯áááºááŸá¬ áááºáá°ááá¯ááºááá¯ááºážááá¯ááºáá¬ááááááŒááºážáá»á¬ážááŸáá·áº á¡ááŒááºá¡ááŸááºá¡á¬ážááŒáá·áºá ááá¯á·ááŒá±á¬áá·áºá áá á¬ážááá¬ážááẠáá¬áá¬ááœáẠá ááºááœááºážááŸá âááŒááºáááºâ áá°áá±á¬ á¡ááá¯áá« ááá¯ááºááááá·áº á¡áá±á¡áá¬ážááᯠááŒááºáááºáá¯ááºáá¯ááºááẠááá¯á¡ááºáá«áááºá ááá¯á¡áá»áááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠUnity áá¬ážááŸááºáž 2018.x ááᯠá¡áá¯á¶ážááŒá¯áá±áá«áááºá ááá¯áá±áá¬ááœáẠáá°ááá±á API ááẠáááºááŒáááºáá±ááŒá®áž áá¯ááºááá¯ááºážááá¯ááºáá¬ááá¹áá¬ááẠáá±á¬áºáá®áá áºáá¯áááºážááœáẠááŸááá±áááºá áááºážáá¡ááŒá±á¡áá±ááᯠááááºážáááºážááŒá®ážáá±á¬áẠáááºážááᯠá¡ááœááºá០ááŒááºáááºááá°ááẠáááºážáááºážáááŸááá«á áá«ááᯠáá¬áá¯ááºáááá²á
ááŒá±ááŸááºážáá»ááºááẠáá»ááºááŸá¬ááŒááºáá±á«áºááœááºááŸáááŒá®áž á¡ááŒá¬ážááŒá¿áá¬áá»á¬ážááá¯ááŒá±ááŸááºážáááºá¡ááœáẠáááºážáááŒááºá ááºá¡á¬ážáá¯á¶ážááᯠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯áá¬ážááŒá®ážááŒá áºáááºá
- áá±á¬ááºáááºáá áºáŠážá á®á¡ááœááºá áá°ááẠááá¯ááºáá»á¬ážááᯠááŸáááºááá¯ááºáá±á¬á¡áá«ááœáẠááŒáá¯ááºáááºáá»á¬ážááᯠáá°áááºá¡áá»áááºááœá±á·ááŒááºááááºááᯠáááááºááá¯áááºá áá»áœááºá¯ááºááá¯á·ááẠá€á¡áá»ááºá¡áááºááᯠááá·áºááœááºážááá·áº áááºáá±á·áá»áºááœáẠáá±ážáá¬ážááŒá®ážááŒá áºááŒá®áž áá¯á¶ážá áœá²áá°á ááá·áºááŸááºážááŸá¯ááᯠáá»áááºááŸáááẠáááºážááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá
- ááááºážááŒááºáááºáá»á¬ážááááá¯ááºážááᯠááááºážáááºážáá¬ážááá¯ááºáááºááá¯á¡ááºáááºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á ááŒáá¯ááºáááºáá»á¬áž (ááá¯á·ááŒá±á¬áá·áº áááºážááá¯á·á ááá¯ááºáááá°áá»á¬áž) á áááºáááºáá»ááºáá»á¬ážááᯠááááºážáá¬ážááá¯ááºáááºááŒá
áºáááºá áá»áœááºá¯ááºááá¯á·ááœáẠáá¬áá¬áá±á«áºááœáẠááŒááºáááºááŸááºáááºážáá
áºáá¯ááŸááá¬ážááŒá®ážá áááºážááᯠáááºáá±á¬ááºááẠá¡áá¯á¶ážááŒá¯áá²á·áááºá
ááŒá áºááá»áœááºážáá±á«áºáá±á . ááŸááºáááºáá±á¬á¡áá»áááºááᯠááááŸáááŒááºážááŒáá·áº áááá¯ááºážááœáẠááŸááºáááºáá±á¬á¡ááŒá±á¡áá±ááᯠáá»áœááºá¯ááºááá¯á· á¡ááœááºááá° ááŸá¬ááœá±ááá¯ááºáááºááŒá áºáááºá - ááá¯áá»áœááºá¯ááºááá¯á·áááºáá²ááœááºáááá¯ááºážááŸááááºážá¡ááŒá±á¡áá±ááŸááá±á¬ááŒá±á¬áá·áºáá»áœááºá¯ááºááá¯á·áááºáá á¬ážááá¬ážáá±áá¬ááá¯áá¯ááºááá¯ááºážááá¯ááºáá¬ááá¹áá¬áá¡ááŒá±á¡áá±ááŸáá·áºáá áºááŒáá¯ááºáááºážáá»áááºááá¯ááºááá¯ááºáááºááá¯á¡ááºáááºá ááŸáááŒá®ážáá¬áž ááá¯ááºááááŸá¯áá»á¬áž - ááœáŸá±á·áááºá áá»á±á¬ááºáá¯á¶ážáá±áá±á¬ á¡áá¬áá»á¬áž - áááºáá®ážáá«á áááá¯á¡ááºáá±á¬ á¡áá¬áá»á¬áž - áá»ááºáá®ážáá«á á€áá¯áá¹áááá±áááá¯áááºáž áá±ážáá¬ážáá¬ážááŒá®áž ECS á áá áºáá»á¬ážá áœá¬ áá«áááºáá«áááºá 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;
}
}
áá»ááºáá¬á¡á¬ážáá¯á¶ážá ááá¯ááºáá»ááºááœá±áá²á· á áœááºážáááºááœá±ááᯠá¡ááœááºááá° áá»á±á¬áºááŒá±ážáá±ážááá¯á· áá®á ááºááᯠáááºááá¯á¡áá¯á¶ážááŒá¯áááá²ááá¯áᬠá¡ááŒá±ááŸá¬ááá¯á·áá²áá»ááºáá±á¬á·áááºá
á¡ááá¯ážááŸááºážáá¯á¶ážá¡ááŒá±á¡áá±ááœááºá á ááºááŒááºáá»á¬ážááẠhitscan áá áºáá¯áááºážááá¯á¡ááŒá±áá¶áá±á¬á¡áá«á á¡áá¬á¡á¬ážáá¯á¶ážááẠááŸááºážáááºážááœá¬ážáá¯á¶áá±á«áºáááº- áá á¬ážááá¬ážáááá¯ááºáá®ááœááºá áá°ááẠáá¯ááºááá¯ááºážááá¯ááºáá¬ááá¹áá¬ááᯠá¡ááá¯ááŸááá±á¬á¡ááŒá±á¡áá±ááá¯á· ááŒááºááŸáá·áºááẠááá¯á¡ááºáááºá raycast áá¯ááºáá«á hit ááá¯á·ááá¯áẠmiss ááá¯áá±ááœááºáááºá ááá¹áá¬ááŒá®ážááᯠáá°áá¡ááŒá±á¡áá±ááá¯á· ááŒááºááá¯á·áá«á
ááá¯á·áá±á¬áº Dino Squad ááœáẠááá¯ááá¯á·áá±á¬ á ááºááŒááºááŸá¯ á¡ááœááºáááºážáá«ážáá«áááºá ááááºážááŸááááºáááºá¡áá»á¬ážá á¯ááẠáá°áá®áá±á¬ááœáŸá¬ážáá»á¬ážá áœá¬á¡ááœáẠáá»á¶áááºážááá¯ááºáá±á¬ááŒá¬ááŸááºáá»ááºáááºáá»á¬áž (á¡áá»áá¯á·ááá á¹á áá»á¬ážááœááºá ááŸááºáá»á¬ážá áœá¬) ááᯠáááºáá®ážáááºá áá°ááá¯á·áá²á·áá¬áá¯ááºáááá²á áááºá¡áá»áááºáá»á¶áááºážáááá²á
Ð
áá»áœááºá¯ááºááá¯á·ááœáẠá€ááœá±ážáá»ááºááœáá·áºáááŸááá«- áá¯á¶ážáá»ááºá¡ááŒá±áá¶áááºáááºáá»á¬ážááẠááááºážáá®ááá¯ááºážá á¡áááá¡ááºá¹áá«áááºáá áºáá¯ááŒá áºáááºá á¡á²áá®áá±á¬á· áá áºáá¯áá¯áá±á¬á· áá¯ááºáááŸá¬áá±á«á·á á¡áá»áá¯á·áá±á¬ áŠážááŸá±á¬ááºáá±á¬ááºá á¬ážááŒá®ážáá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá¯ááºááŒá áºáá¯á¶áááá·áº ááœá±ážá áá¬ááŸá áºáá¯ááᯠáá±ážááœá²áá²á·áááº-
1. áá»áœááºá¯ááºááá¯á·ááẠáááºážááá¯áááºáá®ážáá±á¬ áá á¬ážááá¬ážáá¡áá»áááºááŸáá·áº áá¯á¶ážáá»ááºááᯠáá»áááºáá¬ážáááºá áá á¬ážáá°ááá¯ááºážá áá»ááºáá¶ááá¯ááºážá¡ááœáẠáá¬áá¬áá¯á¶ááá¹áá¬ááºá á¡ááŸááºááŒá áºááá¯ááºážá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºááá¯ááºážááá¯ááºáá¬ááá¹áá¬ááᯠáá¯á¶ážá áœá²áá°á¡ááŒá±á¡áá±ááá¯á· ááŒááºááŸáá·áºááŒá®áž ááá¯á¡ááºáá±á¬ ááœááºáá»ááºááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºáá«áááºá á€áá»ááºážáááºááŸá¯ááẠáá¬áá¬áá±á«áºááœáẠááŒáá·áºáá±áá¬ážáá±á¬áááºááŸáá·áº áá¯á¶ážáá»ááºáá»á¬ážá áá»á¶áááºážáá»áááºááᯠááá·áºááŸááºážááá¯ááºá á±áááºá áá»áœááºá¯ááºááá¯á·ááœáẠáááºáá°á·áá áºááœáŸááºááá·áº áá¯á¶ážáá»ááºáá»á¬ážá¡áá«á¡ááẠáá±á¬ááºáááºá¡áá±á«áº ááá·áºááŸááºážáá¬ážááá·áº áá»ááºáááºáá»á¬ážá¡á¬ážáá¯á¶ážááŸááá±á¬ááŒá±á¬áá·áº ááŒáá¯áááºááá·áºááŸááºážááá¯ááºááŸá¯ááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠá¡áá°ážá¡áá±ážááŒá®ážáá«áááºá
áá¯á¶ááœááºá tick 30 ááŸááá
á¬ážááá¬ážááẠáá»áŸá±á¬áºááá·áºáá¬ážááá·áºá¡ááá¯ááºáž áá¯á¶ážáá»ááºáá
áºá
ááºážááᯠáá
áºááœáŸááºááá¯ááºáááº- áááºáá°ááẠáááºááá·áº áŠážáááºáá¬ááá¯á· ááŒá±ážáá±áááºááᯠááŒááºááŒá®áž áá¯á¶ážáá»ááºá á¡áá®ážá
ááºáá¯á¶áž á¡ááŒááºááŸá¯ááºážááᯠáááááºá 33rd tick ááŸá¬ áá
áºááŸááºááᯠááááœá¬ážáá¬ááᯠáá±áá¡ááá¯áẠááŒááºáá«áááºá áá±á¬ááºáá»áá±á¬ áá»á±á¬áºááŒá±ážááœá±ááŒá±á¬áá·áº áááºážááẠáá¬áá¬áá±á«áºááœááºáááºáž áá±á«áºáá¬áááá·áºáááºá
2. áá»áœááºá¯ááºááá¯á·ááẠáááááœá±ážáá»ááºááŸá¯ááœáẠáá°áá®ááá·áºá¡áá¬á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºáá«áááºá ááá¯á·áá±á¬áº áá»ááºáá¶áá¯á¶áá°ááŒááºážá á¡ááŸááºá¡áá¬ážáá áºáá¯ááᯠáá±ááœááºááŒá®ážáá±á¬ááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠááááºááá·áºáá² áááºážááá»á¶áááºážááŸá¯ááᯠáá°áá®áá±á¬áá¬áá¬ááœáẠá¡ááŸááºá¡áá¬ážááŒá¯áᬠáááºáááºáá¯ááºáá±á¬ááºááŒá®áž áááºážáá¡áá»áááºááᯠáá¬áá¬ááá¯á· áá®ážáááºáá¬ááá·áºá¡áá«ááá¯ááºážá áá áºáá¯ááŒá®ážáá áºáᯠtick ááŸáá·áº collider áá¬áá°ážáá»á¬ážááᯠá¡ááºááááºáá¯ááºááŒááºážá ááŸá áºáá¯áá²á០áá áºáá¯ááŒá áºáá¬áááºá¡áá áá»áœááºá¯ááºááá¯á· á€á¡áá¬ááᯠáá¯ááºáá±á¬ááºáááº-
- áá»ááºáá¶á áááºáááºážáá¯ááºááœá¬ážááŒá®á ááá¯ááá¯áááºááŸá¬ ááœááºáá»ááºááŸá¯áá»á¬áž ááŒá®ážááœá¬ážáááºá ááœá²áá»á±á¬áºááŸá¯ ááá¯á·ááá¯áẠááááŸááºááŸá¯ááᯠááœááºáá»ááºááá¯ááºáááºá áá«á áá áºáááºáá¶ááá²á· áá°áá®áá²á· á¡ááŸááºá¡áá¬ážáá«á áá«ááá¯á·á¡ááœáẠáá«á á¡áá±á«ááºáž áá²á· á¡áá¯áẠááŸá áºáá¯áá¯á¶ážáá²á á¡áá±á«ááºáž- á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº áá±áááºáá áºáá á¬ážááá¬ážá¡ááœáẠáááºážááẠááááŸááºááŒááºážááŸáá·áº áááºáá°ááá»ááºážáá¬áá±ážááᯠáá»áááºážá á±ááŒááºážááŒá¬ážááŸá±á¬áá·áºááŸá±ážááŸá¯ááᯠáááááá¬áá¬áá»áŸá±á¬á·áá»áá±ážáá±á¬ááŒá±á¬áá·áºááŒá áºáááºá á¡á¬ážáááºážáá»ááºááŸá¬ ááŒáá¯ááºáááºáá á¬ážááá¬ážááᯠáá áºáááºáá±á¬á¡áá«ááœáẠáá°áá®áá±á¬á¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááᯠáááááŒá¯áááááº- áááºáá°ááẠááŸá±ážááœá±ážáá±á¬ áá¯á¶ážáá»á¶ááá¯áᬠáá áºááœáŸááºááá¯ááºáá¯á¶áááŒá®áž áá»ááºá á®ážáá¯á¶ážááŸá¯á¶ážááŸá¯ááᯠáá±ááœááºááŒá®ážáá¬ážááŒá áºáááºá
- áá»ááºáááºááẠáá¬áá¬á¡áá»áááºááá¯á· áá±á¬ááºááŸáááœá¬ážáá«ááŒá®á á€ááá á¹á ááœááºá áááºážá ááá¯ááºáá±á¬áºáá¯á¶ááẠáá±á¬ááºáá»áá±á¬ áá»á±á¬áºááŒá±ážááœá± ááá«áá² áá±á¬ááºáá¬áá¬ááœáẠá¡ááŸááºááŒá áºáá±áá«áááºá ááŸá±ážááœá±ážáá±á¬ projectiles áá»á¬ážá¡ááœááºá áááºážááẠáá®á¡áá¯áá®á¡á áááááœá±ážáá»ááºááŸá¯ááẠáá°ááá±á ááŸáá·áºááŒááºááŸá¯á¡áá±á¡ááœááºááᯠáá»áŸá±á¬á·áá»ááá¯ááºáááºá áá áºáá»áááºáááºážááŸá¬áááºá simulation ááœáẠááá®áá¬áá±á¬ load ááá¯ážáá¬áááº- áá¬áá¬ááẠááŸá¯ááºááŸá¯ááºááŸá¬ážááŸá¬ážááŒá áºáá±ááẠááá¯á·ááá¯áẠáá¬áá¬áá áºáá¯ááœáẠáááºážááẠáá»ááºáá¶áá»á¬ážá áœá¬á¡ááœáẠáá«áááºááŸáá·áºáá»á®áá±á¬ simulation tick áá»á¬ážááᯠááœááºáá»ááºáá±áááºá
ááááºáá¯á¶ááœááºáá²á·ááá¯á· áá¬ááºáááºážáááºáá°áá±á¬áºáááºáž áá¯áááá¡á
á®á¡á
á¥áºá¡á ááœááºáá»ááºáá«áááºá áá
áºáááºááŸá¯ááŒá
áºááœá¬ážááá·áºá¡áá»áááºáááºážá áá¬áá¬á¡áá»áááºááŸáá·áºá¡áá° áá¯á¶ážáá»ááºááẠ"áááºážáááááº" ááŒá
áºáᬠááááŸááºááŸá¯ááᯠáá±á¬ááºáá
áºááŒáááºááœáẠá
á±á¬á
á®ážá
áœá¬ áá±ááœááºááá¯ááºáááºá 31st tick ááœááºá á€ááá
á¹á
ááœááºá áá±á¬ááºáá»áá±á¬áá»á±á¬áºááŒá±ážááœá±ááᯠá¡áá¯á¶ážáááŒá¯áá±á¬á·áá«á
áá»áœááºá¯ááºááá¯á·á á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááœááºá á€áá»ááºážáááºááŸá¯ááŸá áºáá¯ááẠáá¯ááºáá»ááºážááŸá áºááŒá±á¬ááºážáá»áŸáᬠááœá²ááŒá¬ážáá±á¬ááŒá±á¬áá·áº ááŸá áºáá¯áá¯á¶ážááᯠáááºáá®ážáá²á·ááŒá®áž áááºážááá¯á·ááẠá¡áá»áááºá¡áá±á¬áºááŒá¬ ááŒáá¯ááºáá°áááºááŸááá±áá²á·áááºá áááºáááºá á ááºááŒááºááŸáá·áº áá»ááºáááºá á¡ááŒááºááŸá¯ááºážáá±á«áºáá°áááºá ááá¯ááºááá¯áá±á¬áá áºáá¯á á®á¡ááœáẠáá áºáᯠááá¯á·ááá¯áẠá¡ááŒá¬ážááœá±ážáá»ááºááŸá¯áá áºáá¯ááᯠááœá±ážáá»ááºáá²á·áááºá á€áá±áá¬ááœáẠá¡áá»áá¯ážá¡ááœá±á·áá áºáá¯ááŸá¬ âááá¯áá²á·ááá¯á·áá±á¬á¡áá»áááºáá»áá¯ážááœáẠáááºáá°ááᯠá¡ááŒáááºáá»á¬ážá áœá¬ááááŸááºáá«á ááá¯áá²á·ááá¯á·áá±á¬ áá±á¬áááºá áºááᯠááá°ááá¯ááºáá«â áá²á·ááá¯á·áá±á¬ á ááºááŒááºááááºážááœáẠá¡ááœááºá¡ááŒááºááŒá áºáááºá áááºáá°ááᯠááá¯ááºááá¯ááºááá·áºá¡áá»áááºá áááºááá·áºá ááºááŒááºáááºáááᯠá¡áá±ážááŒá®ážáá±á¬ á¡áááºážááá¹áááŸáá«áááºááŒá®áž áá¯ááááá»ááºážáááºááŸá¯ááŒáá·áº áá¯ááºáá±á¬ááºááẠááŒááºážááá¯áá¬ážáááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠáááááœá±ážáá»ááºááŸá¯ááŒáá·áº ááŒá®ážáá¯á¶ážááœá¬ážáá²á·ááŒá®áž ááá¯á¡áá« áááºážááẠááááºážá¡ááœááºážááŸá áááºáááºáá»á¬ážá¡á¬ážáá¯á¶ážááŸáá·áº áááºááŒáœáá±á¬á áœááºážáááºáá»á¬ážá¡á¬ážáá¯á¶ážááŸáá·áº áááºááá¯ááºáá«áááºá
áá®ážááŒá¬ážá¡á¬ážááŒáá·áºá á áœááºážáá±á¬ááºáááºááá¯áááºááŒááá»áá¯ážáááºáááºá áá«ááœá±á¡á¬ážáá¯á¶áž ááŸá±ážááœá±ážáááºááá¯á· áááºážáááºááẠáá«ááŒá±áááºá á ááºážáá¯á¶ážááŸá¯ ááẠááá¯ááºááŸá¯áá»á¬ážá¡á¬áž ááœá±á·áá»á¬ážá á±ááŒá®áž á¡ááœáá·áºá¡áááẠáá¯ááºáá¬ááœáẠá¡áá±á¬áºáá±áž ááŸá±ážááœá±ážáá«áááºá Dino Squad ááœááºá "á¡ááá¯ážáá¯á¶áž" á¡ááŒá±á¡áá±ááœááºá ááá¯ááºááœá²ááœáẠáááŒáá¯ááºáááºáááºáž ááŸááá±áá±á¬ áá»ááºáááºáá¬áá±á«ááºážáá»á¬ážá áœá¬ ááŸáááá¯ááºáá«áááºá áá¯á¶ážáá»á¶áá áºáá¯á á®ááᯠáá±ááœááºááẠáá±á¬áá·áºááá¯ááºááŸá¯áá»á¬ážááᯠááœá±á·áá»á¬ážááŒááºážááẠáááºááá¯ááºáá±á¬ ááááºáá¶áá á¹á ááºážáá áºáá¯ááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áºá áá°ááá±á ârollbacksâ á¡áá±á¡ááœááºááᯠá¡áááºážáá¯á¶ážáá»áŸá±á¬á·áá»ááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠáááŸááááŒá áºááá¯á¡ááºáá«áááºá áá«ááá¯áá¯ááºááá¯á·á áá á¬ážááá¬ážáá²á·á¡áá»áááºááᯠááŸááºáááºážáááºáá¬ážáá²á· 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);
}
}
}
}
áá»ááºáá¬á¡á¬ážáá¯á¶ážá á¡áá±ážá áááºááᯠconfigure áá¯ááºáááºááŒá áºáááº-
1. á¡áá»áááºá¡ááœááºáž ááŸá¯ááºááŸá¬ážááŸá¯á á¡áá»á¬ážáá¯á¶ážá¡ááœá¬á¡áá±ážááᯠáááºáá»áŸááá·áºáááºááááºááᯠáá¬ážáááºáá«á
áá¶á·áá»ááºážáá±á¬ááá¯ááá¯ááºážááœááºáááºá¡ááŒá±á¡áá±áá»á¬ážááœáẠááááºážááᯠáááºááá¯ááºááá»áŸáááºáá±á¬ááºááá¯ááºá á±áááºá¡ááœáẠá¡áá±ážááŒá®ážáááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠáá¬ááºáááºážááᯠá¡áá¬ážááẠ30 tick (tick rate 20 Hz) ááŒáá·áºááá·áºáááºáá¬ážáááºá áááºážááẠáá á¬ážááá¬ážáá»á¬ážá¡á¬áž á¡ááœááºááŒáá·áºáá¬ážáá±á¬ pings ááœááºááẠááŒáá¯ááºáááºáá»á¬ážááᯠááááá¯ááºá á±áá«áááºá
2. áááºááá·áºá¡áá¬ááá¹áá¯ááᯠá¡áá»áááºááŸáá·áºáááŒá±ážáá® ááœá±á·áá»á¬ážááá¯ááºáááºááᯠáá¯á¶ážááŒááºáá«á
áá»áœááºáá±á¬áºááá¯á·áá²á· ááŒáá¯ááºáááºááœá±ááᯠááŸá¯ááºááŸá¬ážáá±áá¬áá±á¬á· áá±áá»á¬áá«áááºá ááá¯á·áá±á¬áº áááºáááºááá¯ááºáá±á¬ á áœááºážá¡ááºááá¯ááºážáá»á¬ážááẠá¥ááá¬á¡á¬ážááŒáá·áº ááá¯ááºáá«á á¡áœááºááá¯ááºážáá±áááºááá¬ážáá»á¬ážááœáẠáááŒá¬ááááŒá¯áá¯ááºáá±á·ááŸáááá·áºá¡ááá¯ááºáž áá¶á á áºá áœááºážáááºááᯠáŠážá á¬ážáá±ážááẠááá¯áá±á¬ááºážááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á· áá¯á¶ážááŒááºáá²á·áááºá áá á¬ážááá¬ážááẠáááºááŸáááœáẠááá¯ááºážáá áºáá¯ááᯠáá»áá¬ážááŒá®ážáá«áá á¡ááááºá០áá»á±á¬áºááŒá±ážáá±ážáá±á¬ áá»ááºáááºáá»á¬ážááẠáááºážááᯠááŒááºáááœá¬ážááá¯ááºáá±á
3. ááá¯ááºááá¯áá±á¬áá»á¬ážá á¡á áœááºážá¡á áá»á¬áž- ááá¯ááºááŒááºážá á¡ááŒá®ážááá¯ážááŒááºáž á áááºááá¯á·ááᯠáá»á±á¬áºááŒá±ážáá±ážááẠááá¯á¡ááºáááºááá¯áááºááᯠáá¯á¶ážááŒááºáá«á ááá¯á¡ááºáááºáá»á¬ážááᯠáá¯á¶ážááŒááºááŒá®áž áá»ááºáááºáá»á¬ážáá²á·ááá¯á· áá°áá®áá±á¬ á ááºážáá»ááºážáá»á¬ážá¡ááá¯ááºáž áá¯ááºáá±á¬ááºáá«áááºá
4. áá±á¬ááºáá»áá»á±á¬áºááŒá±ážáá±ážááá·áº áá á¬ážááá¬ážá ááá¯ááºááááŸá¯áá»á¬ážááŸáá·áº áááºááá¯á·áá¯ááºáá±á¬ááºááááºááᯠáá¯á¶ážááŒááºáá«á áá±á¬ááºážáá±á¬áááºážááŒáá·áºá áááºážááá¯á·á áááºáááºáá»ááºááẠá¡ááááºááá¯á· áááŒá±á¬ááºážááá·áºáá«á áá á¬ážááá¬ážááẠááᯠáá¬áá¬ááœáẠááŸááá±ááá·áºá¡áá»áááºááŸáá·áº áá áºáá»áááºáááºážááœáẠáá°á·ááá¯ááºáá° ááŒááºááá·áºáááºá ááá¯á·áá±á¬áºá áá»áœááºá¯ááºááá¯á·ááẠáá±áááºáá áºáá á¬ážááá¬ážá ááá¯ááºááááŸá¯áá»á¬ážááá¯áááºáž ááŒááºááŸáá·áºáá¬á áááºážá¡ááœáẠá¡ááŒá±á¬ááºážáááºážáá»á¬ážá áœá¬ááŸááá«áááºá
áŠážá áœá¬á áááºážááẠá¡á á¯ááá¯ááºááœá²á·ááŒááºážááᯠááá¯ááá¯áá±á¬ááºážááœááºá á±áááº- áá»áœááºá¯ááºááá¯á·ááẠá¡áá®ážááẠpings ááŸááá±á¬ áá á¬ážááá¬ážá¡á¬ážáá¯á¶ážá¡ááœáẠáá°áá®áá±á¬ áá¯ááºááá¯ááºážááá¯ááºáá¬á¡ááŒá±á¡áá±ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
áá¯áááá¡áá±ááŒáá·áºá raycast áá»á¬ážááŸáá·áº áááºáá±ááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááœáẠá áœááºážáááºáá»á¬áž ááá¯á·ááá¯áẠprojectiles áá»á¬ážááᯠááá¯ááºááá¯ááºááá·áº áá á¬ážááá¬ážá ááá¯ááºááááŸá¯áá»á¬ážááᯠá¡ááŒá²áááºáž áááºáá¯ááºáá¬ážáá«áááºá Dino Squad ááœááºá áá á¬ážááá¬ážáá»á¬ážááẠáá±áááºááá¬ážá á¶áá»áááºá á¶ááœáŸááºážá¡á áá¯á¶ááŸááºááá¯ááºáá±á¬ áá»á®ááŒáá±ááŒá®ááŸááá±á¬ ááá¯ááºááá¯áá±á¬áá»á¬ážááᯠááááºážáá»á¯ááºáááºá áá á¬ážááá¬ážááẠáá¯á¶ááŸááºááá¯ááºáá±á¬ áá±á¬áá·áºáá áºáá¯ááœáẠáá áºáááºááŒá®áž áá»ááºáááºá áááºážááŒá±á¬ááºážááẠáá á¬ážááá¬ážá ááá¯ááºááá¯áá±á¬ ááá¯ááºááááœá¬ážááá·áºááá¯áẠáá»ááºáááºááẠáááºážááᯠáá»á áºáá»á°ááŸá¯áááºááŒá áºáááºá
ááááá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠááŸá±ážááœá±ážááŸá¯áá áááºáá®ááẠECS ááŸáá±áá¬ááá¯á¡áá¯á¶ážááŒá¯á á áœááºážáááºááá¯á¡áá¯á¶ážááŒá¯ááá·áº ááá¯ááºááá¯áá±á¬áááºáááºáá»á¬ážá á¡áá±á¡áá¬ážáá»á¬ážááᯠááœááºáá»ááºáá«áááºá
ááááºá¡áá±ááŒáá·áºá áá±á¬ááºáá»-áá»á±á¬áºááŒá±ážáá±ážáá±á¬ áá á¬ážááá¬ážá ááá¯ááºááááá·áº á¡áá±á¡áá¬ážááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠá¡áá±ážáááŒá®ážáá«á ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠááá¯ááá¯á¡áá»áá¯ážááŸáááŒá®áž ááá¯ááá¯ááá¯ážááŸááºážáá±á¬áááºážááŒá±á¬ááºážááᯠáá áºáá»áááºáááºážááœáẠáá¯ááºáá±á¬ááºáá²á·áááºá
ááœááºááẠlatency ááᯠááá¯ážááŸááºážá áœá¬ áááºááŸá¬ážááááá«á áááºážááá¯áᬠáá¯á¶ážá¡á¯ááºáá¬ážááá¯ááºáááºá á¡ááŒá¬ážáá¯á¶áá»ááºáááºážáá²á·ááá¯á·áááºá áá¬áá¬áá±á¬ááºáá»ááŒááºážáá»á±á¬áºááŒá±ážááẠáááºážáá¡áá±ážá¡áá°áá»á¬ážááŸááááºá áááºážááẠáá áºáááºáá¶áááá·áº áá á¬ážááá¬ážá áá¯ááºáá»á ááááºááŒá±á¬áá·áº ááááºážáá á¬ážáá°á ááááºážá¡ááœá±á·á¡ááŒá¯á¶ááᯠááá¯ááá¯áá±á¬ááºážááœááºá á±áááºá ááá¯á·áá±á¬áº Dino Squad á¡ááœááºá á€áá±áá¬ááœáẠááœá±ážáá»ááºááŸá¯ááẠáááºááŸá¬ážáááºá
áá¯ááºáá«áááºá áááá¯ááááºáá¬ááœá±áá²á· ááááºážáá®ááá¯ááºáá¬ááœá±á¡ááœááºáá±á¬ áá¬áá¬áá¯ááºáá áºáá¯áá¯á¶ážáá²á· ááŸá¯ááºááœá±ážááŸá¯ááœá± ááá¯áá»á¬ážáá¬áá²á·á¡ááœáẠáá«ááá¯áááºáž áá±ážáá±á¬ááºáááŸá¬ ááŒá áºáá«áááºá á¡áááºá á¡á á±á¬ááá¯ááºážááœáẠááá¯ááºáá±á¬áºáá¯á¶ááẠááá¯ážááŸááºážáá±á¬ ááá·áºáá²áá±á«áºááá¯ááŸá¯á áá áºáá áºáá¯ááŒá áºáá²á·áá«áá ááá¯á·áá±á¬ááºááœáẠááŸá±ážááœá±ážááá·áºáá»á±á¬áºááŒá±ážá nested loops ááŸáá·áº á¡ááá¯ááºážá¡áááºáá»á¬áž áá±á«áºáá¬áááºá á¡áá¯ááºá¡áááºááŒá±á¡á±á¬ááºáááºáž á¡áá»á¬ážááŒá®ážááŒáá¯ážá á¬ážáá²á·ááá«áááºá
2019 áá¬ážááŸááºážááœáẠ(á¡áááºážáááºá á±á¬ááá¯ááºáááº)á Unity ááẠááœááºáááºáá±á¬áá¯ááºááá¯ááºážááá¯ááºáá¬ááŒááºááœááºážáá»á¬ážá¡ááœáẠá¡ááŒáá·áºá¡ááá¶á·ááá¯ážááŸá¯áá±ážáá¬ážáááºá á¡áááºážá¡á¬ážáá¯á¶ážá áá¯ááºááá¯ááºážááá¯ááºáá¬ááá¹áá¬ááᯠá¡ááŒááºáááºááŸá¬ážááá¯áá±á¬ááŒá±á¬áá·áº á¡ááºááááºáá¯ááºááŒá®ážáá±á¬áẠáá»ááºáá»ááºážáá®ážáá«áž áááºážááá¯á·ááᯠáá¬áá¬ááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá
áá»áœááºá¯ááºááá¯á·ááẠááááºážá¡áááºážáá áºáá¯á á®ááᯠáááºážáááá¯ááºááá¯ááºáá¯ááºááá¯ááºážááá¯ááºáá¬ááŒááºááœááºážááᯠáá±ážáá²á·ááŒá®áž ááá¯ááºáá±á¬áºááŸá¯áááœááºáá»ááºáá® áá áºáááºáááºážááá±áá¬á០ááŒááºááœááºážááᯠâááŸááºážâ ááẠááá¯á¡ááºááŸá¯ááᯠáááºááŸá¬ážáá²á·áááºá ááááŠážá áœá¬á áááºážááẠáá¯ááºáá¯ááºá áœááºážá¡á¬ážááᯠáááá¬áááºááŸá¬ážá áœá¬ ááŒáŸáá·áºáááºáá±ážáááºá áá¯áááá¡áá±ááŸáá·áºá áááá¯ááááºáá¬ááẠááááºážááŒááºá ááºá¡áá áºáá»á¬ážááá·áºááá·áºá¡áá« ááŒááºááœááºážááŸááºážáááºážáá±ážáá¯ááºááœáẠá¡ááŸá¬ážá¡ááœááºážáá áºáá¯ááŒá¯áá¯ááºáá«á áá±á«áºáá±á«ááºáá¬áá±á¬ bug á¡á¬ážáá¯á¶ážááᯠáááºááŸá¬ážááá¯ááºá á±áá«áááºá ááá¯ááá¯á·áá±á¬ á¡ááŸá¬ážáá»á¬ážááẠá¡ááŸá¬ážááŒááºááẠáááºáá²ááŒá®áž áááºážááá¯á·ááẠá¡áááºážáá áºáá¯á á¡áááºážá¡áá»ááºážááŸá áá¯ááºááá¯ááºážááá¯ááºáᬠá¡áá¬ááá¹áá¯áá»á¬ážá á¡ááŒá±á¡áá±ááᯠá¡ááŒá¬ážá¡áááºážááá¯á· "á á®ážáááºáž" ááœá¬ážá á±áááºáááºá
ááá¯á·á¡ááŒááºá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºááá¯ááºážááá¯ááºáá¬ááá¹áá¬ááááá¯ááºážááŒá±á¬ááºážááᯠááááºážáááºážáááºá¡ááœáẠáá¯ááºááá¯ááºážááá¯ááºáá¬ááŒááºááœááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºááŒááºážááŸááááŸáááᯠáá¯áá±ááááŒá¯áá²á·áá«áááºá ááá¯ááá¯áááºááŸá¬á á¡áááºážáá
áºáá¯á
á®ááœáẠááŒááºááœááºážáá
áºáá¯á០ááá¯ááºáá² ááŒááºááœááºáž 30 ááᯠááœá²áá±áá±ážááŒá®áž áá¬ááºáááºážááᯠááááºážáááºážáááºá¡ááœáẠáááºážááá¯á·áá²á០á
ááºáá®ážá
á®ážááŒá¬ážáá¶áá
áºáᯠááŒá¯áá¯ááºáá«á áá±áá°áá»á¡á¬ážááŒáá·áºá á¡ááá¯áá«ááœá±ážáá»ááºááŸá¯ááẠá¡áá¯ááºááŒá
áºáá²á·áá±á¬áºáááºáž áá»áœááºá¯ááºááá¯á·á áááºážááᯠá¡áá±á¬ááºá¡áááºááá±á¬áºáá²á·áá«- áááºážááẠáá¯ááºáá¯ááºá
áœááºážá¡á¬ážááá¯ážáá¬ááŸá¯ááᯠáááŒááá²á á¡áá¹ááá¬ááºááŸááá±á¬ á¡ááŒá±á¬ááºážá¡áá²áá»á¬áž ááá¯á¡ááºáá«áááºá ááŒááºááœááºážáá»á¬ážá
áœá¬ááŒáá·áº á¡áá»áááºá¡ááŒá¬ááŒá®áž á¡áá¯ááºáá¯ááºáá±á¬á¡áá« áá¬áá¬ááẠáááºááá¯á·ááŒá¯áá°áááºááᯠááá·áºááŸááºážááááºáá«áááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠá
ááºážáááºážááᯠááá¯ááºáá¬áááº-"áá®áá¬ááá»ááºá
á®ážáá°ážááá¯áááºáá«ááá¯áááŒááºáá«áá²á·"á
source: www.habr.com