рдПрдХрддрд╛ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рднреМрддрд┐рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА

рдЫрд╡рд┐

рдЯреАрдПрд▓, рдбреЙ


рдореИрдВрдиреЗ рдПрдХ рдбреЗрдореЛ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХрддрд╛ рдореЗрдВ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╢рд╛рд░реАрд░рд┐рдХ рдЖрдВрджреЛрд▓рди рдХреА рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП - GitHub ред

рдкрд░рд┐рдЪрдп


2012 рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрд╛ рдХрд┐ рдпреВрдирд┐рдЯреА рдореЗрдВ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╢рд╛рд░реАрд░рд┐рдХ рдЖрдВрджреЛрд▓рди рдХреЗ рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдкрд░ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред Physics.Simulate () рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж , рдЙрд╕ рдЕрдирд╛рдбрд╝реА рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкреБрд░рд╛рдиреА рдкреЛрд╕реНрдЯ рдЕрднреА рднреА рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдзреБрдирд┐рдХ рдПрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрд▓рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ 2018 рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?


рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдЧреЗрдореНрд╕ рдореЗрдВ, рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдорддреМрд░ рдкрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рд╕рддреНрддрд╛рд╡рд╛рджреА рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЧреНрд░рд╛рд╣рдХ рд╕рд░реНрд╡рд░ рдХреЛ рджрд░реНрдЬ рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд░реНрд╡рд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдЖрдВрджреЛрд▓рди рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рднреЗрдЬрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рджреЗрд░реА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдХреНрд░рд┐рдп рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдПрдХ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рджреЗрд░реА рдХреЛ рдЫреБрдкрд╛рддреА рд╣реИ, рдпрд╣ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддреА рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдЖрдВрджреЛрд▓рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдФрд░ рддреБрд░рдВрдд рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдиреЗ рдХреНрдпрд╛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рд╣реИ, рдФрд░ рдпрджрд┐ рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рддреЛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЧрд▓рдд рдерд╛ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕реНрдиреИрдкрд╢реЙрдЯ рд╣рдореЗрд╢рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрддреАрдд рд╕реЗ рдЖрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рд░реНрд╡рд░ рдФрд░ рдмреИрдХ рдореЗрдВ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдореЗрдВ 150 рдПрдордПрд╕ рд▓рдЧрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо 150 рдПрдордПрд╕ рдХреА рджреЗрд░реА рд╣реЛрдЧреА)ред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЧрд▓рдд рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдЕрддреАрдд рдореЗрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЕрдВрддрд░ рдореЗрдВ рджрд░реНрдЬ рдХреА рдЧрдИ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╡рд╣ рд╣реИред рдпрджрд┐ рдЦреЗрд▓ рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдЪрд╛рд▓ рднреМрддрд┐рдХреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рддреЛ Physics.Simulate () рдХреЛ рдПрдХ рдлреНрд░реЗрдо рдореЗрдВ рдХрдИ рдЪрдХреНрд░реЛрдВ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХреЗрд╡рд▓ рдЪрд░рд┐рддреНрд░ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ (рдпрд╛ рдХреИрдкреНрд╕реВрд▓ рдХрд╛рд╕реНрдЯ, рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рднреМрддрд┐рдХреА рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред () - рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдореИрдВ рдпреВрдирд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ "рдиреЗрдЯрд╡рд░реНрдХ рдлрд┐рдЬрд┐рдХреНрд╕ рдХреЗ рдЧреНрд▓реЗрди рдлрд┐рдбрд▓рд░ рдЬреЗрди" рдирд╛рдордХ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдбреЗрдореЛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реВрдВрдЧрд╛ , рдЬрд┐рд╕рдХрд╛ рдореБрдЭреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЖрдирдВрдж рдорд┐рд▓рд╛ рд╣реИред рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдкрд╛рд╕ рдПрдХ рднреМрддрд┐рдХ рдШрди рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╣ рджреГрд╢реНрдп рдореЗрдВ рдзрдХреЗрд▓рддреЗ рд╣реБрдП рдмрд▓ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред рдбреЗрдореЛ рджреЗрд░реА рдФрд░ рдкреИрдХреЗрдЯ рд╣рд╛рдирд┐ рд╕рд╣рд┐рдд рд╡рд┐рднрд┐рдиреНрди рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред

рдХрд╛рдо рдкрд░ рд▓рдЧрдирд╛


рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рднреМрддрд┐рдХреА рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рд╣реИред рдпрджреНрдпрдкрд┐ Physics.Simulate () рд╣рдореЗрдВ рд╕рд┐рдореБрд▓реЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреМрддрд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдмрддрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдордп рдбреЗрд▓реНрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд┐рдореБрд▓реЗрд╢рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ " рдСрдЯреЛ рд╕рд┐рдореБрд▓реЗрд╢рди " рдмреЙрдХреНрд╕ рдХреЛ рдЕрдирдЪреЗрдХ рдХрд░рдХреЗ рдПрдбрд┐рдЯ-> рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕-> рднреМрддрд┐рдХреА рдореЗрдВ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрдВрдЧреЗред

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рдПрдХрд▓-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдВрдЧреЗред рдЗрдирдкреБрдЯ рдХреЛ рдирдореВрдирд╛ (рдбрдмреНрд▓реНрдпреВ, рдП, рдПрд╕, рдбреА рдХреЗ рд▓рд┐рдП рдЪрд▓рддреА рд╣реИ рдФрд░ рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣), рдФрд░ рдпрд╣ рд╕рднреА AddForce () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рдЧрд┐рдбреЙрдбреА рдкрд░ рд▓рд╛рдЧреВ рд╕рд░рд▓ рдмрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред

public class Logic : MonoBehaviour { public GameObject player; private float timer; private void Start() { this.timer = 0.0f; } private void Update() { this.timer += Time.deltaTime; while (this.timer >= Time.fixedDeltaTime) { this.timer -= Time.fixedDeltaTime; Inputs inputs; inputs.up = Input.GetKey(KeyCode.W); inputs.down = Input.GetKey(KeyCode.S); inputs.left = Input.GetKey(KeyCode.A); inputs.right = Input.GetKey(KeyCode.D); inputs.jump = Input.GetKey(KeyCode.Space); this.AddForcesToPlayer(player.GetComponent<Rigidbody>(), inputs); Physics.Simulate(Time.fixedDeltaTime); } } } 


рдкреНрд▓реЗрдпрд░ рддрдм рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

рд╕рд░реНрд╡рд░ рдкрд░ рдЗрдирдкреБрдЯ рднреЗрдЬрдирд╛


рдЕрдм рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЛ рдЗрдирдкреБрдЯ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдЧрддрд┐ рдХреЛрдб рдХреЛ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛, рдХреНрдпреВрдм рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬреЗрдВред

 // client private void Update() { this.timer += Time.deltaTime; while (this.timer >= Time.fixedDeltaTime) { this.timer -= Time.fixedDeltaTime; Inputs inputs = this.SampleInputs(); InputMessage input_msg; input_msg.inputs = inputs; input_msg.tick_number = this.tick_number; this.SendToServer(input_msg); this.AddForcesToPlayer(player.GetComponent<Rigidbody>(), inputs); Physics.Simulate(Time.fixedDeltaTime); ++this.tick_number; } } 

рдпрд╣рд╛рдВ рдЕрднреА рддрдХ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ tick_number рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЬреЛрдбрд╝рдирд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЬрдм рд╕рд░реНрд╡рд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╡рд╛рдкрд╕ рдШрди рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рднреЗрдЬрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдЗрд╕ рд░рд╛рдЬреНрдп рд╕реЗ рдХреНрдпрд╛ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХреЗрдВ (рдЬреЛ рд╣рдо рдмрд╛рдж рдореЗрдВ рдереЛрдбрд╝рд╛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ)ред

 // server private void Update() { while (this.HasAvailableInputMessages()) { InputMessage input_msg = this.GetInputMessage(); Rigidbody rigidbody = player.GetComponent<Rigidbody>(); this.AddForcesToPlayer(rigidbody, input_msg.inputs); Physics.Simulate(Time.fixedDeltaTime); StateMessage state_msg; state_msg.position = rigidbody.position; state_msg.rotation = rigidbody.rotation; state_msg.velocity = rigidbody.velocity; state_msg.angular_velocity = rigidbody.angularVelocity; state_msg.tick_number = input_msg.tick_number + 1; this.SendToClient(state_msg); } } 

рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╕рд░реНрд╡рд░ рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рд╡рд╣ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдШрдбрд╝реА рдЪрдХреНрд░ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рд╡рд╣ рдШрди рдХреА рдкрд░рд┐рдгрд╛рдореА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬрддрд╛ рд╣реИред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдерд┐рддрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ tick_number рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢ рдореЗрдВ tick_number рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ" рдореЗрд░реЗ рд▓рд┐рдП "100 рдирдВрдмрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐" рдХреЗ рд░реВрдк рдореЗрдВ "100 рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдорд╛рдк 100 рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдорд╛рдк 100 рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐ рдорд╛рдк 101 рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд░рд╛рдЬреНрдп рдмрдирд╛рддрд╛ рд╣реИред

рд░рд╛рдЬреНрдп n + рдЗрдирдкреБрдЯ n = рд░рд╛рдЬреНрдп n + 1


рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдЦреНрдп рдмрд╛рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕реНрдерд┐рд░рддрд╛ рд╣реИред

рдпрд╣ рднреА рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореИрдВ рдЗрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рднреЗрдЬ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдХрддрд╛рд░ рдореЗрдВ рд▓рд┐рдЦрдХрд░, рдкреИрдХреЗрдЯ рдореЗрдВ рджреЗрд░реА рдФрд░ рдиреБрдХрд╕рд╛рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╣реБрдП рдирдХрд▓ рдХрд░рддрд╛ рд╣реВрдВред рджреГрд╢реНрдп рдореЗрдВ рджреЛ рднреМрддрд┐рдХ рдШрди рд╣реЛрддреЗ рд╣реИрдВ - рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдПред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрдпреВрдм рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рд╕рд░реНрд╡рд░ рдХреНрдпреВрдм рдХреЗ рдЧреЗрдо рдСрдмрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЧрд▓рдд рдХреНрд░рдо рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдЙрдЫрд╛рд▓ рдФрд░ рдкреИрдХреЗрдЯ рд╡рд┐рддрд░рдг рдХрд╛ рдЕрдиреБрдХрд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рдзрд╛рд░рдгрд╛ рдмрдирд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╛рдкреНрдд рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирдпрд╛ рд╣реИред рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ "рдХреНрд▓рд╛рдЗрдВрдЯ" рдФрд░ "рд╕рд░реНрд╡рд░" рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдирдХрд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рдПрдХ рджреГрд╢реНрдп рдореЗрдВ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХреЗрдВред

рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддреЛ рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдШрдбрд╝реА рдЪрдХреНрд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдПрдЧрд╛ред рдпрд╣ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЗрди рдЪреВрдХ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЗрдирдкреБрдЯ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдХреЛ рднреА рдЬрдиреНрдо рджреЗрдЧрд╛ред рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрд╛рдж рдореЗрдВ рдирд┐рдкрдЯреЗрдВрдЧреЗред

рдпрд╣ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рд╣реИ, рдЬреЛ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдлрд╝рд┐рдЬрд╝рд┐рдХреНрд╕ рдХрд╣рддреЗ рд╕рдордп a) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рдХреНрдпреВрдм рд╕рдХреНрд╖рдо рд╣реИ, рдпрд╛ b) рдпрджрд┐ рд╕рд░реНрд╡рд░ рдХреЛ рдХрдИ рдХреНрдпреВрдмреНрд╕ рд╕реЗ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ, рддреЛ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВред


рджреЗрд░реА 75 рдПрдордПрд╕ (150 рдПрдордПрд╕ рджреМрд░ рдпрд╛рддреНрд░рд╛)
0% рдЦреЛ рдкреИрдХреЗрдЬ
рдкреАрд▓рд╛ рдШрди - рд╕рд░реНрд╡рд░ рдЦрд┐рд▓рд╛рдбрд╝реА
рдмреНрд▓реВ рдХреНрдпреВрдм - рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдЕрдВрддрд┐рдо рд╕реНрдиреИрдкрд╢реЙрдЯ

рдЕрдм рддрдХ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫреБрдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдкрд░ рдЬреЛ рдХреБрдЫ рднреА рджрд░реНрдЬ рдХрд┐рдпрд╛ рдерд╛, рдЙрд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдереЛрдбрд╝рд╛ рдЪреБрдирд┐рдВрджрд╛ рдерд╛ред

рдирд┐рд╢реНрдЪрдп рд╡рд┐рдлрд▓рддрд╛


рдЕрдм рдЗрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:


рдЖрдЙрдЪ ...

рдкреИрдХреЗрдЬ рдЦреЛрдП рдмрд┐рдирд╛ рдпрд╣ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рдореБрд▓реЗрд╢рди рдЕрднреА рднреА рдЙрд╕реА рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ - PhysX рдХреЛ рдХрд╛рдлреА рдирд┐рдпрддрд╛рддреНрдордХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдмрд╛рд░ рдбрд╛рдпрд╡рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧреЗрдордСрдмрдЬреЗрдХреНрдЯ рдХреНрдпреВрдмреНрд╕ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд╕рдХреНрд╖рдо рдФрд░ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реВрдВ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдпреВрдирд┐рдЯреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред рдпрд╣ рдПрдХ рдмрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ GitHub рдкрд░ рдХреЛрдб рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЧрд▓рдд рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдкрд░ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рддрдереНрдп рд╣реИрдВ, рддреЛ рдЪрд▓реЛ рдЙрдирдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдореИрдВ рд░рд┐рд╡рд╛рдЗрдВрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?


рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдЖрдВрджреЛрд▓рди рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдПрдХ рд╕реНрдерд┐рддрд┐ рдмрдлрд░ (рд╕реНрдерд┐рддрд┐ рдФрд░ рд░реЛрдЯреЗрд╢рди) рдФрд░ рдЗрдирдкреБрдЯ рдмрдЪрд╛рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдмрдлрд░ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рд╕реНрдерд┐рддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡реЗ рдмрд╣реБрдд рдмрдбрд╝реЗ рдореВрд▓реНрдп рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрддреАрдд рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рдШрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рдЙрдкрд╛рдпреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВред

 // client private ClientState[] client_state_buffer = new ClientState[1024]; private Inputs[] client_input_buffer = new Inputs[1024]; private void Update() { this.timer += Time.deltaTime; while (this.timer >= Time.fixedDeltaTime) { this.timer -= Time.fixedDeltaTime; Inputs inputs = this.SampleInputs(); InputMessage input_msg; input_msg.inputs = inputs; input_msg.tick_number = this.tick_number; this.SendToServer(input_msg); uint buffer_slot = this.tick_number % 1024; this.client_input_buffer[buffer_slot] = inputs; this.client_state_buffer[buffer_slot].position = rigidbody.position; this.client_state_buffer[buffer_slot].rotation = rigidbody.rotation; this.AddForcesToPlayer(player.GetComponent<Rigidbody>(), inputs); Physics.Simulate(Time.fixedDeltaTime); ++this.tick_number; } while (this.HasAvailableStateMessage()) { StateMessage state_msg = this.GetStateMessage(); uint buffer_slot = state_msg.tick_number % c_client_buffer_size; Vector3 position_error = state_msg.position - this.client_state_buffer[buffer_slot].position; if (position_error.sqrMagnitude > 0.0000001f) { // rewind & replay Rigidbody player_rigidbody = player.GetComponent<Rigidbody>(); player_rigidbody.position = state_msg.position; player_rigidbody.rotation = state_msg.rotation; player_rigidbody.velocity = state_msg.velocity; player_rigidbody.angularVelocity = state_msg.angular_velocity; uint rewind_tick_number = state_msg.tick_number; while (rewind_tick_number < this.tick_number) { buffer_slot = rewind_tick_number % c_client_buffer_size; this.client_input_buffer[buffer_slot] = inputs; this.client_state_buffer[buffer_slot].position = player_rigidbody.position; this.client_state_buffer[buffer_slot].rotation = player_rigidbody.rotation; this.AddForcesToPlayer(player_rigidbody, inputs); Physics.Simulate(Time.fixedDeltaTime); ++rewind_tick_number; } } } } 

рдмрдлрд░ рдЗрдирдкреБрдЯ рдФрд░ рд╕реНрдЯреЗрдЯрд╕ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкрд░рд┐рдкрддреНрд░ рдмрдлрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдорд╛рдк рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдореИрдВрдиреЗ рднреМрддрд┐рдХреА рдХреА рдШрдбрд╝реА рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП 64 рд╣рд░реНрдЯреНрдЬ рдХрд╛ рдорд╛рди рдЪреБрдирд╛, рдЕрд░реНрдерд╛рддреН 1024 рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдмрдлрд░ рд╣рдореЗрдВ 16 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред


рд╕реБрдзрд╛рд░ рдЬрд╛рд░реА рд╣реИ!

рдирд┐рд░рд░реНрдердХ рдЗрдирдкреБрдЯ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг


рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╣реЛрддреЗ рд╣реИрдВ - рджрдмрд╛рдП рдЧрдП рдмрдЯрди рдХреЛ рдереЛрдбрд╝реЗ рд╕реЗ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдорд╛рдк рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреИрд░реА рдХреЗ рд╕рд╛рде 8-рдмрд┐рдЯ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдЕрдВрддрд░рд╛рд▓ 0-255 рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ 9 рдпрд╛ 10 рдмрд┐рдЯ рддрдХ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпреЗ рд╕рдВрджреЗрд╢ рдХрд╛рдлреА рдЫреЛрдЯреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдореЗрдВ рдмрд╣реБрдд рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдЦреЛ рдЧрдпрд╛ рдерд╛)ред рд╣рдореЗрдВ рдХрд┐рддрдиреА рджреВрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЦреИрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рд╕рдВрджреЗрд╢ рдХреА рдорд╛рдк рд╕рдВрдЦреНрдпрд╛ рдкрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЙрдкрд╛рдп рд╕реЗ рдЖрдЧреЗ рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП рдирд┐рд░рд░реНрдердХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдкрд░ рдПрдХ рд╕реАрдорд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдбреЗрдореЛ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рддреИрдпрд╛рд░ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 while (this.HasAvailableStateMessage()) { StateMessage state_msg = this.GetStateMessage(); this.client_last_received_state_tick = state_msg.tick_number; 

рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдЧреНрд░рд╛рд╣рдХ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдкреНрд░рд╛рдкреНрдд рд╕реНрдерд┐рддрд┐ рд╕рдВрджреЗрд╢ рдХреА рдорд╛рдк рд╕рдВрдЦреНрдпрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИред

 Inputs inputs = this.SampleInputs(); InputMessage input_msg; input_msg.start_tick_number = this.client_last_received_state_tick; input_msg.inputs = new List<Inputs>(); for (uint tick = this.client_last_received_state_tick; tick <= this.tick_number; ++tick) { input_msg.inputs.Add(this.client_input_buffer[tick % 1024]); } this.SendToServer(input_msg); 

рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рдЖрдЗрдЯрдо рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред рдорд╛рдк рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реЗ рднрд╛рдЧ рдХреЛ рдПрдХ рдирдпрд╛ рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИ - рдЕрдм рдпрд╣ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдкрд╣рд▓реЗ рдЗрдирдкреБрдЯ рдХрд╛ рдорд╛рдк рд╕рдВрдЦреНрдпрд╛ рд╣реИред

 while (this.HasAvailableInputMessages()) { InputMessage input_msg = this.GetInputMessage(); // message contains an array of inputs, calculate what tick the final one is uint max_tick = input_msg.start_tick_number + (uint)input_msg.inputs.Count - 1; // if that tick is greater than or equal to the current tick we're on, then it // has inputs which are new if (max_tick >= server_tick_number) { // there may be some inputs in the array that we've already had, // so figure out where to start uint start_i = server_tick_number > input_msg.start_tick_number ? (server_tick_number - input_msg.start_tick_number) : 0; // run through all relevant inputs, and step player forward Rigidbody rigidbody = player.GetComponent<Rigidbody>(); for (int i = (int)start_i; i < input_msg.inputs.Count; ++i) { this.AddForcesToPlayer(rigidbody, input_msg.inputs[i]); Physics.Simulate(Time.fixedDeltaTime); } server_tick_number = max_tick + 1; } } 

рдЬрдм рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрджреЗрд╢ рдореЗрдВ рдкрд╣рд▓реЗ рдЗрдирдкреБрдЯ рдХреА рдорд╛рдк рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЕрдВрддрд┐рдо рдЗрдирдкреБрдЯ рдХреЗ рдорд╛рдк рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЕрдВрддрд┐рдо рдорд╛рдк рд╕рд░реНрд╡рд░ рдорд╛рдк рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЗрдирдкреБрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд░ рдиреЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рднреА рдирдП рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрджрд┐ рд╣рдо рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢ рдореЗрдВ рдирд┐рд░рд░реНрдердХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЦреЛрдпреЗ рд╣реБрдП рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рд┐рдореБрд▓реЗрд╢рди рдЧреИрдк рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╕рд░реНрд╡рд░ 100 рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдорд╛рдк 101 рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдорд╛рдк 105 рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рд╕рд░реНрд╡рд░ 105 рдкрд░ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рдирд╡реАрдирддрдо рдЬреНрдЮрд╛рдд рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдордзреНрдпрд╡рд░реНрддреА рдЙрдкрд╛рдпреЛрдВ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЖрдкрдХреЛ рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдирд┐рд░реНрдгрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЦреЗрд▓ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдЬреА рддреМрд░ рдкрд░, рдореИрдВ рд╕рд░реНрд╡рд░ рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд╕рдЯреНрдЯрд╛ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЬрдм рддрдХ рдХрдиреЗрдХреНрд╢рди рдмрд╣рд╛рд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рддрдм рддрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдбреЗрдореЛ "рдЬрд╝реЗрди рдСрдлрд╝ рдиреЗрдЯрд╡рд░реНрдХреЗрдб рдлрд╝рд┐рдЬрд╝рд┐рдХреНрд╕" рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ "рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореВрд╡реНрд╕" рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рдлрдВрдХреНрд╢рди рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡рд╣ рдирд┐рд░рд░реНрдердХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рддрднреА рднреЗрдЬрддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдкрд╣рд▓реЗ рдкреНрд░реЗрд╖рд┐рдд рдЗрдирдкреБрдЯ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рдЗрдирдкреБрдЯ рдбреЗрд▓реНрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЗрдирдкреБрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдФрд░ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдореИрдВрдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдбреЗрдореЛ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдХреЛрдИ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИред


рдирд┐рд░рд░реНрдердХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ: рдЬрдм 25% рдкреИрдХреЗрдЯ рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпреВрдм рдХреА рдЧрддрд┐ рдзреАрдореА рдФрд░ рд╣рд┐рд▓рддреА рд╣реИ, рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдирд┐рд░рд░реНрдердХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж: рдкреИрдХреЗрдЯ рдХреЗ 25% рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде, рдЕрднреА рднреА рдПрдХ рдЪрд┐рдХреЛрдЯреА рд╕реБрдзрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреВрдмреНрд╕ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЧрддрд┐ рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред

рдЪрд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЖрд╡реГрддреНрддрд┐


рдЗрд╕ рдбреЗрдореЛ рдореЗрдВ, рдЖрд╡реГрддреНрддрд┐ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рднреЗрдЬрддрд╛ рд╣реИ, рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдХрдо рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реБрдзрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдореЗрдВ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╣ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╡рд┐рдЪрд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреА рдЙрдЪреНрдЪ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде, рдкреИрдХреЗрдЯ рдХрд╛ рдиреБрдХрд╕рд╛рди рдмрд╣реБрдд рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЕрдЧрд▓реЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред


рд╕реНрдиреИрдкрд╢реЙрдЯ рдЖрд╡реГрддреНрддрд┐ 64 рд╣рд░реНрдЯреНрдЬ


рд╕реНрдиреИрдкрд╢реЙрдЯ рдЖрд╡реГрддреНрддрд┐ 16 рд╣рд░реНрдЯреНрдЬ


рд╕реНрдиреИрдкрд╢реЙрдЯ рдЖрд╡реГрддреНрддрд┐ 2 рд╣рд░реНрдЯреНрдЬ

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреА рдЖрд╡реГрддреНрддрд┐ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ, рдЙрддрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЬрд┐рддрдиреА рдмрд╛рд░ рд╕рдВрднрд╡ рд╣реЛ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреА рдорд╛рддреНрд░рд╛, рдЗрд╕рдХреА рд▓рд╛рдЧрдд, рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░реЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛, рд╕рд░реНрд╡рд░реЛрдВ рдХреА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд▓рд╛рдЧрдд рдФрд░ рдЗрд╕реА рддрд░рд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдЪреМрд░рд╕рд╛рдИ рд╕реБрдзрд╛рд░


рд╣рдо рдЧрд▓рдд рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рддрдирд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЭрдЯрдХреЗрджрд╛рд░ рд╕реБрдзрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХрддрд╛ / PhysX рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛, рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдЗрди рдЧрд▓рдд рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдиреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рднреА рдпрд╣ рдХрд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ - рдЕрдЧрд░ рдЖрдкрдХреЛ рднреМрддрд┐рдХреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдИ рдЪреАрдЬ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВред

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдкреБрд░рд╛рдиреА рдкреБрд░рд╛рдиреА рдЪреМрд░рд╕рд╛рдИ рдХреЗ рд╕рд╛рде рджрд░рд╛рд░реЛрдВ рдкрд░ рдЪрдордХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛! рдЬрдм рдХреЛрдИ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗрд╡рд▓ рдХрдИ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд░реЛрдЯреЗрд╢рди рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд░рддрд╛ рд╣реИред рднреМрддрд┐рдХ рдШрди рдЕрдкрдиреЗ рдЖрдк рд╣реА рддреБрд░рдВрдд рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рдЕрджреГрд╢реНрдп рд╣реИ), рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд╕рд░рд╛ рдШрди рд╣реИ, рдЬреЛ рдЪреМрд░рд╕рд╛рдИ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

 Vector3 position_error = state_msg.position - predicted_state.position; float rotation_error = 1.f - Quaternion.Dot(state_msg.rotation, predicted_state.rotation); if (position_error.sqrMagnitude > 0.0000001f || rotation_error > 0.00001f) { Rigidbody player_rigidbody = player.GetComponent<Rigidbody>(); // capture the current predicted pos for smoothing Vector3 prev_pos = player_rigidbody.position + this.client_pos_error; Quaternion prev_rot = player_rigidbody.rotation * this.client_rot_error; // rewind & replay player_rigidbody.position = state_msg.position; player_rigidbody.rotation = state_msg.rotation; player_rigidbody.velocity = state_msg.velocity; player_rigidbody.angularVelocity = state_msg.angular_velocity; uint rewind_tick_number = state_msg.tick_number; while (rewind_tick_number < this.tick_number) { buffer_slot = rewind_tick_number % c_client_buffer_size; this.client_input_buffer[buffer_slot] = inputs; this.client_state_buffer[buffer_slot].position = player_rigidbody.position; this.client_state_buffer[buffer_slot].rotation = player_rigidbody.rotation; this.AddForcesToPlayer(player_rigidbody, inputs); Physics.Simulate(Time.fixedDeltaTime); ++rewind_tick_number; } // if more than 2ms apart, just snap if ((prev_pos - player_rigidbody.position).sqrMagnitude >= 4.0f) { this.client_pos_error = Vector3.zero; this.client_rot_error = Quaternion.identity; } else { this.client_pos_error = prev_pos - player_rigidbody.position; this.client_rot_error = Quaternion.Inverse(player_rigidbody.rotation) * prev_rot; } } 

рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЧреНрд░рд╛рд╣рдХ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рддрд┐ / рд░реЛрдЯреЗрд╢рди рдЕрдВрддрд░ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рд╕реБрдзрд╛рд░ рдХреА рдХреБрд▓ рджреВрд░реА 2 рдореАрдЯрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдХреНрдпреВрдм рдмрд╕ рдПрдХ рдЭрдЯрдХреЗ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ - рдЪреМрд░рд╕рд╛рдИ рдЕрднреА рднреА рдЦрд░рд╛рдм рджрд┐рдЦреЗрдЧреА, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд▓реНрджреА рд╕реЗ рдЬрд▓реНрджреА рд▓реМрдЯрдиреЗ рджреЗрдВред

 this.client_pos_error *= 0.9f; this.client_rot_error = Quaternion.Slerp(this.client_rot_error, Quaternion.identity, 0.1f); this.smoothed_client_player.transform.position = player_rigidbody.position + this.client_pos_error; this.smoothed_client_player.transform.rotation = player_rigidbody.rotation * this.client_rot_error; 

рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ 10% рддрдХ рд╕рд╣реА рд╕реНрдерд┐рддрд┐ / рд░реЛрдЯреЗрд╢рди рдХреА рдУрд░ lerp / slerp рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЖрдВрджреЛрд▓рди рдХреЛ рдФрд╕рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рд╢рдХреНрддрд┐-рдХрд╛рдиреВрди рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдпрд╣ рдлреНрд░реЗрдо рджрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдбреЗрдореЛ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


250 рдПрдордПрд╕ рджреЗрд░реА
10% рдкреИрдХреЗрдЬ рдЦреЛ рджрд┐рдпрд╛
рдЪреМрд░рд╕рд╛рдИ рдХреЗ рдмрд┐рдирд╛, рд╕реБрдзрд╛рд░ рдмрд╣реБрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ


250 рдПрдордПрд╕ рджреЗрд░реА
10% рдкреИрдХреЗрдЬ рдЦреЛ рджрд┐рдпрд╛
рдЪреМрд░рд╕рд╛рдИ рдХреЗ рд╕рд╛рде, рд╕реБрдзрд╛рд░ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред

рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдПрдХ рдРрд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреИрдХреЗрдЯ рднреЗрдЬрддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рдирдХрд▓ рдХрд░рдиреЗ рдХреЗред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпрд╣ рднреМрддрд┐рдХ рдкреНрд▓рдЧ-рдЗрди рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХрддрд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрддрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИред

Source: https://habr.com/ru/post/hi432190/


All Articles