рдПрдХ рдореЛрдмрд╛рдЗрд▓ PvP рд╢реВрдЯрд░ рдХреЗ рд▓рд┐рдП рднреМрддрд┐рдХреА, рдпрд╛ рдХреИрд╕реЗ рд╣рдо рдПрдХ рддреНрд░рд┐-рдЖрдпрд╛рдореА рдореЗрдВ рджреЛ-рдЖрдпрд╛рдореА рдЧреЗрдо рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ



рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдиреЗ рдмрд╛рдд рдХреА рдереА рдХрд┐ рдХреИрд╕реЗ рд╣рдордиреЗ рдЕрдкрдиреЗ рдореЛрдмрд╛рдЗрд▓ рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рд╢реВрдЯрд░ рдореЗрдВ рджреЛ-рдЖрдпрд╛рдореА рднреМрддрд┐рдХреА рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдФрд░ рдЕрдм рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдордиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рдерд╛, рдЙрд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдлреЗрдВрдХ рджрд┐рдпрд╛ рдФрд░ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ - рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рдЕрдкрдиреЗ рдЦреЗрд▓ рдХреЛ 2 рдбреА рджреБрдирд┐рдпрд╛ рд╕реЗ 3 рдбреА рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ред

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



рдФрд░ рдЗрд╕рд▓рд┐рдП:



рддрдХрдиреАрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереАрдВ:

  • рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЖрдХрд╛рд░ - 100 ├Ч 100 рдореАрдЯрд░;
  • рдКрдВрдЪрд╛рдИ рдЕрдВрддрд░ - 40 рдореАрдЯрд░;
  • рд╕реБрд░рдВрдЧреЛрдВ, рдкреБрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди;
  • рд╡рд┐рднрд┐рдиреНрди рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдкрд░ рдирд┐рд╢рд╛рдиреЗ рдкрд░;
  • рд╕реНрдерд┐рд░ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ (рд╣рдо рдЦреЗрд▓ рдореЗрдВ рдЕрдиреНрдп рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ);
  • рдореБрдХреНрдд рдЧрд┐рд░ рднреМрддрд┐рдХреА;
  • рдЧреНрд░реЗрдиреЗрдб рдлреЗрдВрдХ рднреМрддрд┐рдХреАред

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

рд╡рд┐рдХрд▓реНрдк рдПрдХ: рд╕реНрддрд░рд┐рдд рд╕рдВрд░рдЪрдирд╛


рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рднреМрддрд┐рдХреА рдЗрдВрдЬрди рдХреЛ рдирд╣реАрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛, рд▓реЗрдХрд┐рди "рд╕реНрдЯреЛрд░рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛" рд╕реНрддрд░реЛрдВ рдХреА рдХрдИ рдкрд░рддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдЗрдорд╛рд░рдд рдореЗрдВ рдлрд░реНрд╢ рдХреА рдпреЛрдЬрдирд╛ рдЬреИрд╕рд╛ рдХреБрдЫ рдирд┐рдХрд▓рд╛:



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

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



рдПрдХ рд╢рдмреНрдж рдореЗрдВ, рд╣рдордиреЗ рдЬрд▓реНрджреА рд╕реЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ 2 рдбреА рдкрд░рддреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ - рдФрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рднреМрддрд┐рдХ рдЗрдВрдЬрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдХрд░ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред

рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдЗрд╕ рдмрд╣реБрдд рд╣реА рдЗрдВрдЬрди рдХреЛ рдЪреБрдирдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рдЧреНрд░рд╛рд╣рдХ рдФрд░ рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреИрджрд╛ рдХреАред

рд╡рд┐рдХрд▓реНрдк рджреЛ: рдПрдХ рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ


рдЪреВрдВрдХрд┐ рдЧреЗрдо рдХреНрд▓рд╛рдЗрдВрдЯ рдпреВрдирд┐рдЯреА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рднреМрддрд┐рдХ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХрддрд╛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - PhysXред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЧреЗрдо рдореЗрдВ 3 рдбреА рднреМрддрд┐рдХреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЧреЗрдо рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдереАред рдЗрд╕рдореЗрдВ рдпрд╣ рддрдереНрдп рд╢рд╛рдорд┐рд▓ рдерд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ C # рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛:

  • рд▓рд┐рдирдХреНрд╕ рдкрд░ IL2CPP рдХреЗ рд╕рд╛рде рдПрдХрддрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдХрдореА, рдЬреЛ рдмрд▓реНрдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рдЧрдИ, рдХреНрдпреЛрдВрдХрд┐ рдирд╡реАрдирддрдо рд░рд┐рд▓реАрдЬ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╣рдордиреЗ рдЕрдкрдиреЗ рдЧреЗрдо рд╕рд░реНрд╡рд░ рдХреЛ .net Core 2.1 рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдирдХреНрд╕ рдорд╢реАрдиреЛрдВ рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛;
  • рдПрдХрддрд╛ рдкрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдХрдореА;
  • рдПрдХрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рдореНрди рдкреНрд░рджрд░реНрд╢рди: рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рднреМрддрд┐рдХ рдЗрдВрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдФрд░ рдПрдХрддрд╛ рдореЗрдВ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВред

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

рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдиреЗ рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рднреА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдлрд┐рд░ рд╣рдордиреЗ рдЧреЗрдо рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ .Net Core 2.1 рдкрд░ рдЫреЛрдбрд╝рдиреЗ рдФрд░ VolatilePhysics рдХреЗ рдмрдЬрд╛рдп рдЪреБрдирдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛, C # рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдФрд░ рдЦреБрд▓рд╛ рднреМрддрд┐рдХ рдЗрдВрдЬрдиред рдЕрд░реНрдерд╛рддреН, рд╣рдореЗрдВ C # рдЗрдВрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо C ++ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдЗрдВрдЬрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рджреБрд░реНрдШрдЯрдирд╛рдУрдВ рд╕реЗ рдбрд░рддреЗ рдереЗред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЬрдиреЛрдВ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛:


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

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП Bepu Physics v1, Bepu Physics v2 рдФрд░ Jitter Physics рдЗрдВрдЬрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ Bepu Physics v2 рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╕рд╛рдмрд┐рдд рд╣реБрдЖред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ рдЗрди рддреАрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ рдЬреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, Bepu Physics v2 рдиреЗ Unity рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рд╢реЗрд╖ рдПрдХреАрдХрд░рдг рдорд╛рдирджрдВрдб рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛: рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА SIMD рд╕рдВрдЪрд╛рд▓рди рдФрд░ System.Numerics рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ IL2CPP рдХреЗ рд╕рд╛рде рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдХреЛрдИ SIMD рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП Bepu рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рднреА рд▓рд╛рдн рдЦреЛ рдЧрдП рдереЗред IPhone 5S рдкрд░ iOS рдкрд░ рдмрд┐рд▓реНрдб рдореЗрдВ рдбреЗрдореЛ рд╕реАрди рдмрд╣реБрдд рдзреАрдорд╛ рдерд╛ред рд╣рдо рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗред

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

рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╣реА рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЧрд▓рддрдлрд╣рдореА рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдЕрддреНрдпрдВрдд рджреБрд░реНрд▓рдн рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рднреМрддрд┐рдХ рд╕реА # рдЗрдВрдЬрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдорд┐рд▓рд╛: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ iPhone 5S рдкрд░ рд╕реНрдерд┐рд░ 30 рдПрдлрдкреАрдПрд╕ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред

рд╡рд┐рдХрд▓реНрдк рддреАрди, рдЕрдВрддрд┐рдо: рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдВрдЬрди


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

рдирддреАрдЬрддрди, рд╣рдордиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рднреМрддрд┐рдХреА рдпреВрдирд┐рдЯреА - рдлрд┐рдЬрд┐рдХреНрд╕ - рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдмреАрдкреБ рдлрд┐рдЬрд┐рдХреНрд╕ v2ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рднреМрддрд┐рдХ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛:

рдХреЛрдб рджреЗрдЦреЗрдВ
using System; using System.Collections.Generic; using System.Numerics; namespace Prototype.Common.Physics { public interface IPhysicsWorld : IDisposable { bool HasBody(uint id); void SetCurrentSimulationTick(int tick); void Update(); RayCastHit RayCast(Vector3 origin, Vector3 direction, float distance, CollisionLayer layer, int ticksBehind = 0, List<uint> ignoreIds = null); RayCastHit SphereCast(Vector3 origin, Vector3 direction, float distance, float radius, CollisionLayer layer, int ticksBehind = 0, List<uint> ignoreIds = null); RayCastHit CapsuleCast(Vector3 origin, Vector3 direction, float distance, float radius, float height, CollisionLayer layer, int ticksBehind = 0, List<uint> ignoreIds = null); void CapsuleOverlap(Vector3 origin, float radius, float height, BodyMobilityField bodyMobilityField, CollisionLayer layer, List<Overlap> overlaps, int ticksBehind = 0); void RemoveOrphanedDynamicBodies(WorldState.TableSet currentWorld); void UpdateBody(uint id, Vector3 position, float angle); void CreateStaticCapsule(Vector3 origin, Quaternion rotation, float radius, float height, uint id, CollisionLayer layer); void CreateDynamicCapsule(Vector3 origin, Quaternion rotation, float radius, float height, uint id, CollisionLayer layer); void CreateStaticBox(Vector3 origin, Quaternion rotation, Vector3 size, uint id, CollisionLayer layer); void CreateDynamicBox(Vector3 origin, Quaternion rotation, Vector3 size, uint id, CollisionLayer layer); } } 


рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдореЗрдВ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЗ: рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдкрд░ рд╣рдордиреЗ Bepu рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ - рдПрдХрддрд╛ред

рдпрд╣рд╛рдВ рдпрд╣ рд╕рд░реНрд╡рд░ рдкрд░ рд╣рдорд╛рд░реА рднреМрддрд┐рдХреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

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



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

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

 private readonly SimulationSlice[] _simulationHistory = new SimulationSlice[PhysicsConfigs.HistoryLength]; public BepupPhysicsWorld() { _currentSimulationTick = 1; for (int i = 0; i < PhysicsConfigs.HistoryLength; i++) { _simulationHistory[i] = new SimulationSlice(_bufferPool); } } 

рд╣рдорд╛рд░реЗ рдИрд╕реАрдПрд╕ рдореЗрдВ, рднреМрддрд┐рдХреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рд░реАрдб-рд░рд╛рдЗрдЯ рд╕рд┐рд╕реНрдЯрдо рд╣реИрдВ:

  • InitPhysicsWorldSystem;
  • SpawnPhysicsDynamicsBodiesSystem;
  • DestroyPhysicsDynamicsBodiesSystem;
  • UpdatePhysicsTransformsSystem;
  • MovePhysicsSystem,

рдФрд░ рд╕рд╛рде рд╣реА рдХрдИ рд░реАрдб-рдУрдирд▓реА рд╕рд┐рд╕реНрдЯрдо, рдЬреИрд╕реЗ рд╢реЙрдЯреНрд╕ рд╕реЗ рд╣рд┐рдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рд╕реНрдЯрдо, рдЧреНрд░реЗрдиреЗрдб рд╕реЗ рд╡рд┐рд╕реНрдлреЛрдЯ, рдЖрджрд┐ред

рд╡рд┐рд╢реНрд╡ рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдХ рдкрд░, InitPhysicsWorldSystem рдХреЛ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рднреМрддрд┐рдХ рдЗрдВрдЬрди рдХреЗ рд╡рд░реНрддрдорд╛рди рдЯрд┐рдХ рдирдВрдмрд░ (рд╕рд┐рдореБрд▓реЗрд╢рдирд╕реНрд▓рд╛рдЗрд╕) рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

 public void SetCurrentSimulationTick(int tick) { var oldTick = tick - 1; var newSlice = _simulationHistory[tick % PhysicsConfigs.HistoryLength]; var oldSlice = _simulationHistory[oldTick % PhysicsConfigs.HistoryLength]; newSlice.RestoreBodiesFromPreviousTick(oldSlice); _currentSimulationTick = tick; } 

RestoreBodiesFromPrepretTick рд╡рд┐рдзрд┐ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рд╕реЗ рдкрд┐рдЫрд▓реЗ рдЯрд┐рдХ рдХреЗ рд╕рдордп рднреМрддрд┐рдХ рдЗрдВрдЬрди рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреА рд╣реИ:

рдХреЛрдб рджреЗрдЦреЗрдВ
 public void RestoreBodiesFromPreviousTick(SimulationSlice previous) { var oldStaticCount = previous._staticIds.Count; // add created static objects for (int i = 0; i < oldStaticCount; i++) { var oldId = previous._staticIds[i]; if (!_staticIds.Contains(oldId)) { var oldHandler = previous._staticIdToHandler[oldId]; var oldBody = previous._staticHandlerToBody[oldHandler]; if (oldBody.IsCapsule) { var handler = CreateStatic(oldBody.Capsule, oldBody.Description.Pose, true, oldId, oldBody.CollisionLayer); var body = _staticHandlerToBody[handler]; body.Capsule = oldBody.Capsule; _staticHandlerToBody[handler] = body; } else { var handler = CreateStatic(oldBody.Box, oldBody.Description.Pose, false, oldId, oldBody.CollisionLayer); var body = _staticHandlerToBody[handler]; body.Box = oldBody.Box; _staticHandlerToBody[handler] = body; } } } // delete not existing dynamic objects var newDynamicCount = _dynamicIds.Count; var idsToDel = stackalloc uint[_dynamicIds.Count]; int delIndex = 0; for (int i = 0; i < newDynamicCount; i++) { var newId = _dynamicIds[i]; if (!previous._dynamicIds.Contains(newId)) { idsToDel[delIndex] = newId; delIndex++; } } for (int i = 0; i < delIndex; i++) { var id = idsToDel[i]; var handler = _dynamicIdToHandler[id]; _simulation.Bodies.Remove(handler); _dynamicHandlerToBody.Remove(handler); _dynamicIds.Remove(id); _dynamicIdToHandler.Remove(id); } // add created dynamic objects var oldDynamicCount = previous._dynamicIds.Count; for (int i = 0; i < oldDynamicCount; i++) { var oldId = previous._dynamicIds[i]; if (!_dynamicIds.Contains(oldId)) { var oldHandler = previous._dynamicIdToHandler[oldId]; var oldBody = previous._dynamicHandlerToBody[oldHandler]; if (oldBody.IsCapsule) { var handler = CreateDynamic(oldBody.Capsule, oldBody.BodyReference.Pose, true, oldId, oldBody.CollisionLayer); var body = _dynamicHandlerToBody[handler]; body.Capsule = oldBody.Capsule; _dynamicHandlerToBody[handler] = body; } else { var handler = CreateDynamic(oldBody.Box, oldBody.BodyReference.Pose, false, oldId, oldBody.CollisionLayer); var body = _dynamicHandlerToBody[handler]; body.Box = oldBody.Box; _dynamicHandlerToBody[handler] = body; } } } } 


рдЙрд╕рдХреЗ рдмрд╛рдж, SpawnPhysicsDynamicsBodiesSystem рдФрд░ DestroyPhysicsDynamicsBodiesSystem рд╕рд┐рд╕реНрдЯрдо рдЕрдВрддрд┐рдо ECS рдЯрд┐рдХ рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓реЗ рдЧрдП, рдЗрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднреМрддрд┐рдХ рдЗрдВрдЬрди рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рдпрд╛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж UpdatePhysicsTransformsSystem ECS рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рднреА рдЧрддрд┐рд╢реАрд▓ рдирд┐рдХрд╛рдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕реЗ рд╣реА рдИрд╕реАрдПрд╕ рдФрд░ рднреМрддрд┐рдХреА рдЗрдВрдЬрди рдореЗрдВ рдбреЗрдЯрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВ, рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреА рдЧрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рд╕рднреА рдкрдврд╝рдиреЗ-рд▓рд┐рдЦрдиреЗ рдХреЗ рдСрдкрд░реЗрд╢рди рдкреВрд░реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЧреЗрдо рд▓реЙрдЬрд┐рдХ (рд╢реЙрдЯреНрд╕, рд╡рд┐рд╕реНрдлреЛрдЯ, рдпреБрджреНрдз рдХрд╛ рдХреЛрд╣рд░рд╛ ...) рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд░реАрдб-рдУрдирд▓реА рд╕рд┐рд╕реНрдЯрдо рдЦреЗрд▓рддреЗ рд╣реИрдВред

рдмрд╛рдкреВ рднреМрддрд┐рдХреА рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рд┐рдореБрд▓реЗрд╢рдирд╕реНрд▓рд╛рдЗрдЬрд╝ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб:

рдХреЛрдб рджреЗрдЦреЗрдВ
 using System; using System.Collections.Generic; using System.Numerics; using BepuPhysics; using BepuPhysics.Collidables; using BepuUtilities.Memory; using Quaternion = BepuUtilities.Quaternion; namespace Prototype.Physics { public partial class BepupPhysicsWorld { private unsafe partial class SimulationSlice : IDisposable { private readonly Dictionary<int, StaticBody> _staticHandlerToBody = new Dictionary<int, StaticBody>(); private readonly Dictionary<int, DynamicBody> _dynamicHandlerToBody = new Dictionary<int, DynamicBody>(); private readonly Dictionary<uint, int> _staticIdToHandler = new Dictionary<uint, int>(); private readonly Dictionary<uint, int> _dynamicIdToHandler = new Dictionary<uint, int>(); private readonly List<uint> _staticIds = new List<uint>(); private readonly List<uint> _dynamicIds = new List<uint>(); private readonly BufferPool _bufferPool; private readonly Simulation _simulation; public SimulationSlice(BufferPool bufferPool) { _bufferPool = bufferPool; _simulation = Simulation.Create(_bufferPool, new NarrowPhaseCallbacks(), new PoseIntegratorCallbacks(new Vector3(0, -9.81f, 0))); } public RayCastHit RayCast(Vector3 origin, Vector3 direction, float distance, CollisionLayer layer, List<uint> ignoreIds=null) { direction = direction.Normalized(); BepupRayCastHitHandler handler = new BepupRayCastHitHandler(_staticHandlerToBody, _dynamicHandlerToBody, layer, ignoreIds); _simulation.RayCast(origin, direction, distance, ref handler); var result = handler.RayCastHit; if (result.IsValid) { var collidableReference = handler.CollidableReference; if (handler.CollidableReference.Mobility == CollidableMobility.Static) { _simulation.Statics.GetDescription(collidableReference.Handle, out var description); result.HitEntityId = _staticHandlerToBody[collidableReference.Handle].Id; result.CollidableCenter = description.Pose.Position; } else { _simulation.Bodies.GetDescription(collidableReference.Handle, out var description); result.HitEntityId = _dynamicHandlerToBody[collidableReference.Handle].Id; result.CollidableCenter = description.Pose.Position; } } return result; } public RayCastHit SphereCast(Vector3 origin, Vector3 direction, float distance, float radius, CollisionLayer layer, List<uint> ignoreIds = null) { direction = direction.Normalized(); SweepCastHitHandler handler = new SweepCastHitHandler(_staticHandlerToBody, _dynamicHandlerToBody, layer, ignoreIds); _simulation.Sweep(new Sphere(radius), new RigidPose(origin, Quaternion.Identity), new BodyVelocity(direction.Normalized()), distance, _bufferPool, ref handler); var result = handler.RayCastHit; if (result.IsValid) { var collidableReference = handler.CollidableReference; if (handler.CollidableReference.Mobility == CollidableMobility.Static) { _simulation.Statics.GetDescription(collidableReference.Handle, out var description); result.HitEntityId = _staticHandlerToBody[collidableReference.Handle].Id; result.CollidableCenter = description.Pose.Position; } else { var reference = new BodyReference(collidableReference.Handle, _simulation.Bodies); result.HitEntityId = _dynamicHandlerToBody[collidableReference.Handle].Id; result.CollidableCenter = reference.Pose.Position; } } return result; } public RayCastHit CapsuleCast(Vector3 origin, Vector3 direction, float distance, float radius, float height, CollisionLayer layer, List<uint> ignoreIds = null) { direction = direction.Normalized(); var length = height - 2 * radius; SweepCastHitHandler handler = new SweepCastHitHandler(_staticHandlerToBody, _dynamicHandlerToBody, layer, ignoreIds); _simulation.Sweep(new Capsule(radius, length), new RigidPose(origin, Quaternion.Identity), new BodyVelocity(direction.Normalized()), distance, _bufferPool, ref handler); var result = handler.RayCastHit; if (result.IsValid) { var collidableReference = handler.CollidableReference; if (handler.CollidableReference.Mobility == CollidableMobility.Static) { _simulation.Statics.GetDescription(collidableReference.Handle, out var description); result.HitEntityId = _staticHandlerToBody[collidableReference.Handle].Id; result.CollidableCenter = description.Pose.Position; } else { var reference = new BodyReference(collidableReference.Handle, _simulation.Bodies); result.HitEntityId = _dynamicHandlerToBody[collidableReference.Handle].Id; result.CollidableCenter = reference.Pose.Position; } } return result; } public void CapsuleOverlap(Vector3 origin, float radius, float height, BodyMobilityField bodyMobilityField, CollisionLayer layer, List<Overlap> overlaps) { var length = height - 2 * radius; var handler = new BepupOverlapHitHandler( bodyMobilityField, layer, _staticHandlerToBody, _dynamicHandlerToBody, overlaps); _simulation.Sweep( new Capsule(radius, length), new RigidPose(origin, Quaternion.Identity), new BodyVelocity(Vector3.Zero), 0, _bufferPool, ref handler); } public void CreateDynamicBox(Vector3 origin, Quaternion rotation, Vector3 size, uint id, CollisionLayer layer) { var shape = new Box(size.X, size.Y, size.Z); var pose = new RigidPose() { Position = origin, Orientation = rotation }; var handler = CreateDynamic(shape, pose, false, id, layer); var body = _dynamicHandlerToBody[handler]; body.Box = shape; _dynamicHandlerToBody[handler] = body; } public void CreateStaticBox(Vector3 origin, Quaternion rotation, Vector3 size, uint id, CollisionLayer layer) { var shape = new Box(size.X, size.Y, size.Z); var pose = new RigidPose() { Position = origin, Orientation = rotation }; var handler =CreateStatic(shape, pose, false, id, layer); var body = _staticHandlerToBody[handler]; body.Box = shape; _staticHandlerToBody[handler] = body; } public void CreateStaticCapsule(Vector3 origin, Quaternion rotation, float radius, float height, uint id, CollisionLayer layer) { var length = height - 2 * radius; var shape = new Capsule(radius, length); var pose = new RigidPose() { Position = origin, Orientation = rotation }; var handler =CreateStatic(shape, pose, true, id, layer); var body = _staticHandlerToBody[handler]; body.Capsule = shape; _staticHandlerToBody[handler] = body; } public void CreateDynamicCapsule(Vector3 origin, Quaternion rotation, float radius, float height, uint id, CollisionLayer layer) { var length = height - 2 * radius; var shape = new Capsule(radius, length); var pose = new RigidPose() { Position = origin, Orientation = rotation }; var handler = CreateDynamic(shape, pose, true, id, layer); var body = _dynamicHandlerToBody[handler]; body.Capsule = shape; _dynamicHandlerToBody[handler] = body; } private int CreateDynamic<TShape>(TShape shape, RigidPose pose, bool isCapsule, uint id, CollisionLayer collisionLayer) where TShape : struct, IShape { var activity = new BodyActivityDescription() { SleepThreshold = -1 }; var collidable = new CollidableDescription() { Shape = _simulation.Shapes.Add(shape), SpeculativeMargin = 0.1f, }; var capsuleDescription = BodyDescription.CreateKinematic(pose, collidable, activity); var handler = _simulation.Bodies.Add(capsuleDescription); _dynamicIds.Add(id); _dynamicIdToHandler.Add(id, handler); _dynamicHandlerToBody.Add(handler, new DynamicBody { BodyReference = new BodyReference(handler, _simulation.Bodies), Id = id, IsCapsule = isCapsule, CollisionLayer = collisionLayer }); return handler; } private int CreateStatic<TShape>(TShape shape, RigidPose pose, bool isCapsule, uint id, CollisionLayer collisionLayer) where TShape : struct, IShape { var capsuleDescription = new StaticDescription() { Pose = pose, Collidable = new CollidableDescription() { Shape = _simulation.Shapes.Add(shape), SpeculativeMargin = 0.1f, } }; var handler = _simulation.Statics.Add(capsuleDescription); _staticIds.Add(id); _staticIdToHandler.Add(id, handler); _staticHandlerToBody.Add(handler, new StaticBody { Description = capsuleDescription, Id = id, IsCapsule = isCapsule, CollisionLayer = collisionLayer }); return handler; } public void RemoveOrphanedDynamicBodies(TableSet currentWorld) { var toDel = stackalloc uint[_dynamicIds.Count]; var toDelIndex = 0; foreach (var i in _dynamicIdToHandler) { if (currentWorld.DynamicPhysicsBody.HasCmp(i.Key)) { continue; } toDel[toDelIndex] = i.Key; toDelIndex++; } for (int i = 0; i < toDelIndex; i++) { var id = toDel[i]; var handler = _dynamicIdToHandler[id]; _simulation.Bodies.Remove(handler); _dynamicHandlerToBody.Remove(handler); _dynamicIds.Remove(id); _dynamicIdToHandler.Remove(id); } } public bool HasBody(uint id) { return _staticIdToHandler.ContainsKey(id) || _dynamicIdToHandler.ContainsKey(id); } public void RestoreBodiesFromPreviousTick(SimulationSlice previous) { var oldStaticCount = previous._staticIds.Count; // add created static objects for (int i = 0; i < oldStaticCount; i++) { var oldId = previous._staticIds[i]; if (!_staticIds.Contains(oldId)) { var oldHandler = previous._staticIdToHandler[oldId]; var oldBody = previous._staticHandlerToBody[oldHandler]; if (oldBody.IsCapsule) { var handler = CreateStatic(oldBody.Capsule, oldBody.Description.Pose, true, oldId, oldBody.CollisionLayer); var body = _staticHandlerToBody[handler]; body.Capsule = oldBody.Capsule; _staticHandlerToBody[handler] = body; } else { var handler = CreateStatic(oldBody.Box, oldBody.Description.Pose, false, oldId, oldBody.CollisionLayer); var body = _staticHandlerToBody[handler]; body.Box = oldBody.Box; _staticHandlerToBody[handler] = body; } } } // delete not existing dynamic objects var newDynamicCount = _dynamicIds.Count; var idsToDel = stackalloc uint[_dynamicIds.Count]; int delIndex = 0; for (int i = 0; i < newDynamicCount; i++) { var newId = _dynamicIds[i]; if (!previous._dynamicIds.Contains(newId)) { idsToDel[delIndex] = newId; delIndex++; } } for (int i = 0; i < delIndex; i++) { var id = idsToDel[i]; var handler = _dynamicIdToHandler[id]; _simulation.Bodies.Remove(handler); _dynamicHandlerToBody.Remove(handler); _dynamicIds.Remove(id); _dynamicIdToHandler.Remove(id); } // add created dynamic objects var oldDynamicCount = previous._dynamicIds.Count; for (int i = 0; i < oldDynamicCount; i++) { var oldId = previous._dynamicIds[i]; if (!_dynamicIds.Contains(oldId)) { var oldHandler = previous._dynamicIdToHandler[oldId]; var oldBody = previous._dynamicHandlerToBody[oldHandler]; if (oldBody.IsCapsule) { var handler = CreateDynamic(oldBody.Capsule, oldBody.BodyReference.Pose, true, oldId, oldBody.CollisionLayer); var body = _dynamicHandlerToBody[handler]; body.Capsule = oldBody.Capsule; _dynamicHandlerToBody[handler] = body; } else { var handler = CreateDynamic(oldBody.Box, oldBody.BodyReference.Pose, false, oldId, oldBody.CollisionLayer); var body = _dynamicHandlerToBody[handler]; body.Box = oldBody.Box; _dynamicHandlerToBody[handler] = body; } } } } public void Update() { _simulation.Timestep(GameState.TickDurationSec); } public void UpdateBody(uint id, Vector3 position, float angle) { if (_staticIdToHandler.TryGetValue(id, out var handler)) { _simulation.Statics.GetDescription(handler, out var staticDescription); staticDescription.Pose.Position = position; staticDescription.Pose.Orientation = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), angle); _simulation.Statics.ApplyDescription(handler, staticDescription); } else if(_dynamicIdToHandler.TryGetValue(id, out handler)) { BodyReference reference = new BodyReference(handler, _simulation.Bodies); reference.Pose.Position = position; reference.Pose.Orientation = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), angle); } } public void Dispose() { _simulation.Clear(); } } public void Dispose() { _bufferPool.Clear(); } } } 


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

Bepu рдХреА рддрд░рд╣, PhysX рдХрд╛ рдХреЛрдИ рдЗрддрд┐рд╣рд╛рд╕ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ рд╣рдордиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдХ рдХреЗ рд▓рд┐рдП рдХрдИ рднреМрддрд┐рдХ рд╕рд┐рдореБрд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХрддрд╛ рднреМрддрд┐рдХ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдЕрдкрдиреА рдЦреБрдж рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХрддрд╛ 2018.4 (LTS) рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЧрдИ рдереА, рдФрд░ рдХреБрдЫ рдПрдкреАрдЖрдИ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реА рдЬреИрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдПрдХрддрд╛ рдиреЗ рдПрдХ рдЕрд▓рдЧ рднреМрддрд┐рдХ рд╕рд┐рдореБрд▓реЗрд╢рди (рдпрд╛, PhysX рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ, рдПрдХ рджреГрд╢реНрдп) рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдереА, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдПрдХрддрд╛ рдкрд░ рднреМрддрд┐рдХреА рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рджреГрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред

рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╢реНрдпреЛрдВ рдХреЗ рдКрдкрд░ рдПрдХ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦреА рдЧрдИ рдереА - рдпреВрдирд┐рдЯреАрдлрд┐рдЬрд┐рдХреНрд╕рд╣рд┐рд╕реНрдЯреНрд░реЛрд╕рд▓рд╛рдЗрдЬрд╝:

 public UnityPhysicsHistorySlice(SphereCastDelegate sphereCastDelegate, OverlapSphereNonAlloc overlapSphere, CapsuleCastDelegate capsuleCast, OverlapCapsuleNonAlloc overlapCapsule, string name) { _scene = SceneManager.CreateScene(name, new CreateSceneParameters() { localPhysicsMode = LocalPhysicsMode.Physics3D }); _physicsScene = _scene.GetPhysicsScene(); _sphereCast = sphereCastDelegate; _capsuleCast = capsuleCast; _overlapSphere = overlapSphere; _overlapCapsule = overlapCapsule; _boxPool = new PhysicsSceneObjectsPool<BoxCollider>(_scene, "box", 0); _capsulePool = new PhysicsSceneObjectsPool<UnityEngine.CapsuleCollider>(_scene, "sphere", 0); } 

рдпреВрдирд┐рдЯреА рдХреА рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рднреМрддрд┐рдХреА рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рд░реНрдп рднреМрддрд┐рдХреА рд╕реНрдереИрддрд┐рдХ рд╡рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреА рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рджреГрд╢реНрдп рдореЗрдВ рд░реЗрдХреЙрд╕реНрдЯ рдФрд░ рд╕реНрд╡реАрдкрдХрд╛рд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИред рдпрд╣ рдПрдкреАрдЖрдИ рдХреЗрд╡рд▓ рдПрдХ рд╕рдХреНрд░рд┐рдп рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, PhysX рдЗрдВрдЬрди рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рджреГрд╢реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕рд╣реА рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХрддрд╛ рдиреЗ Physics.cs рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдРрд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЫрд┐рдкрд╛ рджрд┐рдпрд╛, рдЬреЛ рдХрд┐ рд╕рднреА рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдордиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛:

рдХреЛрдб рджреЗрдЦреЗрдВ
 MethodInfo raycastMethod = typeof(Physics).GetMethod("Internal_SphereCast", BindingFlags.NonPublic | BindingFlags.Static); var sphereCast = (SphereCastDelegate) Delegate.CreateDelegate(typeof(SphereCastDelegate), raycastMethod); MethodInfo overlapSphereMethod = typeof(Physics).GetMethod("OverlapSphereNonAlloc_Internal", BindingFlags.NonPublic | BindingFlags.Static); var overlapSphere = (OverlapSphereNonAlloc) Delegate.CreateDelegate(typeof(OverlapSphereNonAlloc), overlapSphereMethod); MethodInfo capsuleCastMethod = typeof(Physics).GetMethod("Internal_CapsuleCast", BindingFlags.NonPublic | BindingFlags.Static); var capsuleCast = (CapsuleCastDelegate) Delegate.CreateDelegate(typeof(CapsuleCastDelegate), capsuleCastMethod); MethodInfo overlapCapsuleMethod = typeof(Physics).GetMethod("OverlapCapsuleNonAlloc_Internal", BindingFlags.NonPublic | BindingFlags.Static); var overlapCapsule = (OverlapCapsuleNonAlloc) Delegate.CreateDelegate(typeof(OverlapCapsuleNonAlloc), overlapCapsuleMethod); 


рдЕрдиреНрдпрдерд╛, UnepPhysicsHistorySlice рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб BepuSimulationSlice рдореЗрдВ рдЬреЛ рдерд╛, рдЙрд╕рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рдерд╛ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдЧреЗрдо рднреМрддрд┐рдХреА рдХреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓реЗ: рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ред

рдЕрдЧрд▓рд╛ рдЪрд░рдг рдкрд░реАрдХреНрд╖рдг рд╣реИред

рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЗ "рд╕реНрд╡рд╛рд╕реНрдереНрдп" рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдХреЗрддрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдЧрд▓рддрдлрд╣рдореА рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рднреМрддрд┐рдХ рдЗрдВрдЬрдиреЛрдВ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕реВрдЪрдХ 1-2% рдХреЗ рднреАрддрд░ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, 9000 рдЯрд┐рдХ (рдпрд╛ 5 рдорд┐рдирдЯ) рдХреА рд▓рдбрд╝рд╛рдИ рдХреЗ рджреМрд░рд╛рди рд╣рдо 90-180 рд╕рд┐рдореБрд▓реЗрд╢рди рдЯрд┐рдХ рдореЗрдВ рдЧрд▓рдд рдереЗред рд╕реЙрдлреНрдЯ рд▓рд╛рдЙрдВрдЬ рдореЗрдВ рдЧреЗрдо рдХреЗ рдХрдИ рд░рд┐рд▓реАрдЬ рдкрд░ рд╣рдореЗрдВ рдпреЗ рдирддреАрдЬреЗ рдорд┐рд▓реЗред рд╡рд┐рднрд┐рдиреНрди рдЗрдВрдЬрдиреЛрдВ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдЗрд╕ рд╕рдВрдХреЗрддрдХ рдХреА рдордЬрдмреВрдд рд╡реГрджреНрдзрд┐ рдХреА рдЙрдореНрдореАрдж рдХреА - рд╢рд╛рдпрдж рдХрдИ рдмрд╛рд░ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдм рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣реЗ рдереЗ, рдФрд░ рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬрд▓реНрджреА рд╕реЗ рдЬрдорд╛ рд╣реЛ рдЬрд╛рдПрдВрдЧреАред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╡рд┐рд╕рдВрдЧрддрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ 0.2-0.5% рдмрдврд╝рд╛ рдФрд░ рдкреНрд░рддрд┐ рдпреБрджреНрдз 2-2.5% рдФрд╕рдд рд░рд╣рд╛, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдмрдврд╝рд╛рдпрд╛ред

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

рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рд╣реИ?


рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ:

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


All Articles