рдПрдХрддрд╛ рдореЗрдВ рд╖рдЯреНрдХреЛрдг рдорд╛рдирдЪрд┐рддреНрд░: рдпреБрджреНрдз рдХрд╛ рдХреЛрд╣рд░рд╛, рдорд╛рдирдЪрд┐рддреНрд░ рдЕрдиреБрд╕рдВрдзрд╛рди, рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреАрдврд╝реА

рднрд╛рдЧ 1-3: рдЬрд╛рд▓, рд░рдВрдЧ рдФрд░ рд╕реЗрд▓ рдКрдБрдЪрд╛рдИ

рднрд╛рдЧ 4-7: рдзрдХреНрдХреЛрдВ, рдирджрд┐рдпреЛрдВ рдФрд░ рд╕рдбрд╝рдХреЛрдВ

рднрд╛рдЧ 8-11: рдЬрд▓, рднреВ-рднрд╛рдЧ рдФрд░ рдкреНрд░рд╛рдЪреАрд░

рднрд╛рдЧ 12-15: рдмрдЪрдд рдФрд░ рд▓реЛрдбрд┐рдВрдЧ, рдмрдирд╛рд╡рдЯ, рджреВрд░рд┐рдпрд╛рдВ

рднрд╛рдЧ 16-19: рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдирд╛, рдЦрд┐рд▓рд╛рдбрд╝реА рджрд╕реНрддреЗ, рдПрдирд┐рдореЗрд╢рди

рднрд╛рдЧ 20-23: рдХреЛрд╣рд░реЗ рдХреЗ рдпреБрджреНрдз, рдорд╛рдирдЪрд┐рддреНрд░ рдЕрдиреБрд╕рдВрдзрд╛рди, рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреАрдврд╝реА

рднрд╛рдЧ 24-27: рдЬрд▓ рдЪрдХреНрд░, рдЕрдкрд░рджрди, рдмрд╛рдпреЛрдо, рдмреЗрд▓рдирд╛рдХрд╛рд░ рдирдХреНрд╢рд╛

рднрд╛рдЧ 20: рдпреБрджреНрдз рдХрд╛ рдХреЛрд╣рд░рд╛


  • рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╕реЗрд▓ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬреЗрдВред
  • рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди рдХреЗ рдмрд┐рдирд╛ рд░рд╛рд╣рдд рдкреНрд░рдХрд╛рд░ рдмрджрд▓реЗрдВред
  • рд╣рдо рджреГрд╢реНрдпрддрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВред
  • рдЕрджреГрд╢реНрдп рд╕рдм рдХреБрдЫ рдЕрдВрдзреЗрд░рд╛ред

рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдпреБрджреНрдз рдкреНрд░рднрд╛рд╡ рдХреЗ рдХреЛрд╣рд░реЗ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред

рдЕрдм рд╢реНрд░реГрдВрдЦрд▓рд╛ рдПрдХрддрд╛ 2017.1.0 рдкрд░ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред


рдЕрдм рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реЗрд▓ рдбреЗрдЯрд╛ Shader рдореЗрдВ


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

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

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

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

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

рд╕реЗрд▓ рдбреЗрдЯрд╛ рдкреНрд░рдмрдВрдзрди


рд╣рдореЗрдВ рд╕реЗрд▓ рдбреЗрдЯрд╛ рдпреБрдХреНрдд рдмрдирд╛рд╡рдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдЪрд▓реЛ рдПрдХ рдирдпрд╛ HexCellShaderData рдШрдЯрдХ HexCellShaderData рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рдХрд░реЗрдЧрд╛ред

 using UnityEngine; public class HexCellShaderData : MonoBehaviour { Texture2D cellTexture; } 

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

  public void Initialize (int x, int z) { cellTexture = new Texture2D( x, z, TextureFormat.RGBA32, false, true ); cellTexture.filterMode = FilterMode.Point; cellTexture.wrapMode = TextureWrapMode.Clamp; } 

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

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

  public void Initialize (int x, int z) { if (cellTexture) { cellTexture.Resize(x, z); } else { cellTexture = new Texture2D( cellCountX, cellCountZ, TextureFormat.RGBA32, false, true ); cellTexture.filterMode = FilterMode.Point; cellTexture.wrapMode = TextureWrapMode.Clamp; } } 

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

  Texture2D cellTexture; Color32[] cellTextureData; public void Initialize () { тАж if (cellTextureData == null || cellTextureData.Length != x * z) { cellTextureData = new Color32[x * z]; } else { for (int i = 0; i < cellTextureData.Length; i++) { cellTextureData[i] = new Color32(0, 0, 0, 0); } } } 

рд░рдВрдЧ 32 рдХреНрдпрд╛ рд╣реИ?
рдорд╛рдирдХ рдЕрд╕рдореНрдмрджреНрдз RGBA рдмрдирд╛рд╡рдЯ рдореЗрдВ рдЪрд╛рд░-рдмрд╛рдЗрдЯ рдкрд┐рдХреНрд╕реЗрд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЪрд╛рд░ рд░рдВрдЧ рдЪреИрдирд▓реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдмрд╛рдЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЙрдирдХреЗ рдкрд╛рд╕ 256 рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рди рд╣реИрдВред рдпреВрдирд┐рдЯреА Color рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЕрдВрддрд░рд╛рд▓ 0-1 рдореЗрдВ рдЗрд╕рдХреЗ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдШрдЯрдХ 0255 рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд╕реИрдВрдкрд▓ рд▓реЗрддреЗ рд╕рдордп, GPU рд╡реНрдпреБрддреНрдХреНрд░рдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХрд░рддрд╛ рд╣реИред

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

HexGrid рдХреЛ HexGrid рдореЗрдВ рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЖрд░рдВрднреАрдХрд░рдг рд╕реЗ HexGrid рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕рдореЗрдВ cellShaderData рдлрд╝реАрд▓реНрдб cellShaderData рдФрд░ cellShaderData рдЕрдВрджрд░ рдПрдХ рдШрдЯрдХ рдмрдирд╛рдПрдВрдЧреЗред

  HexCellShaderData cellShaderData; void Awake () { HexMetrics.noiseSource = noiseSource; HexMetrics.InitializeHashGrid(seed); HexUnit.unitPrefab = unitPrefab; cellShaderData = gameObject.AddComponent<HexCellShaderData>(); CreateMap(cellCountX, cellCountZ); } 

рдПрдХ рдирдпрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рддреЗ рд╕рдордп, cellShaderData рдХреЛ рднреА cellShaderData рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

  public bool CreateMap (int x, int z) { тАж cellCountX = x; cellCountZ = z; chunkCountX = cellCountX / HexMetrics.chunkSizeX; chunkCountZ = cellCountZ / HexMetrics.chunkSizeZ; cellShaderData.Initialize(cellCountX, cellCountZ); CreateChunks(); CreateCells(); return true; } 

рд╕реЗрд▓ рдбреЗрдЯрд╛ рдХрд╛ рд╕рдВрдкрд╛рджрди


рдЕрдм рддрдХ, рд╕реЗрд▓ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рдПрдХ рдпрд╛ рдХрдИ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕реЗрд▓рд░реНрд╕ рдХреЗ рдкрд╛рд╕ рд╢реИрдбрд░ рдореЗрдВ рд╕реЗрд▓ рдбреЗрдЯрд╛ рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, HexCell рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВред

  public HexCellShaderData ShaderData { get; set; } 

HexGrid.CreateCell рд╣рдо рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ shader рдбреЗрдЯрд╛ рдШрдЯрдХ рдЕрд╕рд╛рдЗрди HexGrid.CreateCell ред

  void CreateCell (int x, int z, int i) { тАж HexCell cell = cells[i] = Instantiate<HexCell>(cellPrefab); cell.transform.localPosition = position; cell.coordinates = HexCoordinates.FromOffsetCoordinates(x, z); cell.ShaderData = cellShaderData; тАж } 

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

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП RefreshTerrain рдПрдХ HexCellShaderData рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдЪрд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рдЫреЛрдбрд╝ рджреЗрдВред

  public void RefreshTerrain (HexCell cell) { } 

HexCell.TerrainTypeIndex рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдЖрджреЗрд╢ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

  public int TerrainTypeIndex { get { return terrainTypeIndex; } set { if (terrainTypeIndex != value) { terrainTypeIndex = value; // Refresh(); ShaderData.RefreshTerrain(this); } } } 

рд╣рдо рдЗрд╕реЗ рд╕реЗрд▓ рдЯреЙрдкреЛрдЧреНрд░рд╛рдлреА рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж HexCell.Load рдореЗрдВ рднреА рдХрд╣реЗрдВрдЧреЗред

  public void Load (BinaryReader reader) { terrainTypeIndex = reader.ReadByte(); ShaderData.RefreshTerrain(this); elevation = reader.ReadByte(); RefreshPosition(); тАж } 

рд╕реЗрд▓ рдЗрдВрдбреЗрдХреНрд╕


рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ HexCell рдореЗрдВ Index рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ HexCell ред рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕реЗрд▓ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛, рдЬреЛ рд╢реЗрдбрд░ рдореЗрдВ рджреА рдЧрдИ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

  public int Index { get; set; } 

рдпрд╣ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА HexGrid.CreateCell , рдЗрд╕рд▓рд┐рдП рдмрд╕ рдЗрд╕реЗ рдмрдирд╛рдП рдЧрдП рд╕реЗрд▓ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред

  void CreateCell (int x, int z, int i) { тАж cell.coordinates = HexCoordinates.FromOffsetCoordinates(x, z); cell.Index = i; cell.ShaderData = cellShaderData; тАж } 

рдЕрдм HexCellShaderData.RefreshTerrain рд╕реЗрд▓ рдбреЗрдЯрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЕрдкрдиреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЕрд▓реНрдлрд╛ рдШрдЯрдХ рдореЗрдВ рдЙрдиреНрдирдпрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рд╕рд╣реЗрдЬреЗрдВред рдпрд╣ 256 рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрд▓рд╛рдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

  public void RefreshTerrain (HexCell cell) { cellTextureData[cell.Index].a = (byte)cell.TerrainTypeIndex; } 

рдПрдХ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ GPU рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ Texture2D.SetPixels32 рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж Texture2D.Apply рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЦрдВрдбреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо LateUpdate рдкрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╡реЗ рдмрджрд▓реЗ рд╣реБрдП рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдлреНрд░реЗрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкреНрд░рджрд░реНрд╢рди рди рдХрд░ рд╕рдХреЗрдВред

  public void RefreshTerrain (HexCell cell) { cellTextureData[cell.Index].a = (byte)cell.TerrainTypeIndex; enabled = true; } void LateUpdate () { cellTexture.SetPixels32(cellTextureData); cellTexture.Apply(); enabled = false; } 

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдкреНрд░рд╛рд░рдВрдн рдХреЗ рдмрд╛рдж рдШрдЯрдХ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред

  public void Initialize (int x, int z) { тАж enabled = true; } 

рд╕реЗрд▓ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХрд╛ рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди


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

рд╣рдо useTerrainTypes рдЕрдкреНрд░рдЪрд▓рд┐рдд рдЖрдо рдлрд╝реАрд▓реНрдб useColors рдФрд░ useTerrainTypes ред рдЙрдиреНрд╣реЗрдВ рдПрдХ useCellData рд╕рд╛рде рдмрджрд▓реЗрдВред

 // public bool useCollider, useColors, useUVCoordinates, useUV2Coordinates; // public bool useTerrainTypes; public bool useCollider, useCellData, useUVCoordinates, useUV2Coordinates; 

рд╣рдо cellIndices рд╕реВрдЪреА рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ cellIndices рдХрд░рдиреЗ рдХрд╛ cellIndices ред рдЪрд▓реЛ cellWeights - cellWeights рдХреЛ cellWeights -рд░реАрдиреЗрдо рдирд╛рдо рднреА рджреЗрдВ - рдпрд╣ рдирд╛рдо рдмреЗрд╣рддрд░ рдХрд░реЗрдЧрд╛ред

 // [NonSerialized] List<Vector3> vertices, terrainTypes; // [NonSerialized] List<Color> colors; [NonSerialized] List<Vector3> vertices, cellIndices; [NonSerialized] List<Color> cellWeights; [NonSerialized] List<Vector2> uvs, uv2s; [NonSerialized] List<int> triangles; 

рдЪреЗрдВрдЬ Clear рддрд╛рдХрд┐ рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕реЗ рджреЛ рд╕реВрдЪрд┐рдпрд╛рдБ рдПрдХ рд╕рд╛рде рдорд┐рд▓реЗрдВ, рдФрд░ рдЕрд▓рдЧ рд╕реЗ рдирд╣реАрдВред

  public void Clear () { hexMesh.Clear(); vertices = ListPool<Vector3>.Get(); if (useCellData) { cellWeights = ListPool<Color>.Get(); cellIndices = ListPool<Vector3>.Get(); } // if (useColors) { // colors = ListPool<Color>.Get(); // } if (useUVCoordinates) { uvs = ListPool<Vector2>.Get(); } if (useUV2Coordinates) { uv2s = ListPool<Vector2>.Get(); } // if (useTerrainTypes) { // terrainTypes = ListPool<Vector3>.Get(); // } triangles = ListPool<int>.Get(); } 

рдЕрдкреНрд▓рд╛рдИ рдореЗрдВ рдПрдХ рд╣реА рдЧреНрд░реБрдкрд┐рдВрдЧ Apply ред

  public void Apply () { hexMesh.SetVertices(vertices); ListPool<Vector3>.Add(vertices); if (useCellData) { hexMesh.SetColors(cellWeights); ListPool<Color>.Add(cellWeights); hexMesh.SetUVs(2, cellIndices); ListPool<Vector3>.Add(cellIndices); } // if (useColors) { // hexMesh.SetColors(colors); // ListPool<Color>.Add(colors); // } if (useUVCoordinates) { hexMesh.SetUVs(0, uvs); ListPool<Vector2>.Add(uvs); } if (useUV2Coordinates) { hexMesh.SetUVs(1, uv2s); ListPool<Vector2>.Add(uv2s); } // if (useTerrainTypes) { // hexMesh.SetUVs(2, terrainTypes); // ListPool<Vector3>.Add(terrainTypes); // } hexMesh.SetTriangles(triangles, 0); ListPool<int>.Add(triangles); hexMesh.RecalculateNormals(); if (useCollider) { meshCollider.sharedMesh = hexMesh; } } 

рд╕рднреА AddTriangleColor рдФрд░ AddTriangleTerrainTypes рд╣рдЯрд╛ рджреЗрдВред рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреБрдХреНрдд AddTriangleCellData рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдмрджрд▓реЗрдВ, рдЬреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдФрд░ рднрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

  public void AddTriangleCellData ( Vector3 indices, Color weights1, Color weights2, Color weights3 ) { cellIndices.Add(indices); cellIndices.Add(indices); cellIndices.Add(indices); cellWeights.Add(weights1); cellWeights.Add(weights2); cellWeights.Add(weights3); } public void AddTriangleCellData (Vector3 indices, Color weights) { AddTriangleCellData(indices, weights, weights, weights); } 

рдЙрдкрдпреБрдХреНрдд AddQuad рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реА рдХрд░реЗрдВред

  public void AddQuadCellData ( Vector3 indices, Color weights1, Color weights2, Color weights3, Color weights4 ) { cellIndices.Add(indices); cellIndices.Add(indices); cellIndices.Add(indices); cellIndices.Add(indices); cellWeights.Add(weights1); cellWeights.Add(weights2); cellWeights.Add(weights3); cellWeights.Add(weights4); } public void AddQuadCellData ( Vector3 indices, Color weights1, Color weights2 ) { AddQuadCellData(indices, weights1, weights1, weights2, weights2); } public void AddQuadCellData (Vector3 indices, Color weights) { AddQuadCellData(indices, weights, weights, weights, weights); } 

HexGridChunk рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ


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

  static Color weights1 = new Color(1f, 0f, 0f); static Color weights2 = new Color(0f, 1f, 0f); static Color weights3 = new Color(0f, 0f, 1f); 

рдЪрд▓рд┐рдП TriangulateEdgeFan рдХреЛ рдареАрдХ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд▓реЗрдХрд┐рди рдЕрдм рдЙрд╕реЗ рдПрдХ рд╕реЗрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред AddTriangleTerrainTypes рдХреЛрдб рдХреЗ рд╕рд╛рде AddTriangleColor рдФрд░ AddTriangleTerrainTypes рдХреЛрдб рдХреЛ AddTriangleColor ред

  void TriangulateEdgeFan (Vector3 center, EdgeVertices edge, float index) { terrain.AddTriangle(center, edge.v1, edge.v2); terrain.AddTriangle(center, edge.v2, edge.v3); terrain.AddTriangle(center, edge.v3, edge.v4); terrain.AddTriangle(center, edge.v4, edge.v5); Vector3 indices; indices.x = indices.y = indices.z = index; terrain.AddTriangleCellData(indices, weights1); terrain.AddTriangleCellData(indices, weights1); terrain.AddTriangleCellData(indices, weights1); terrain.AddTriangleCellData(indices, weights1); // terrain.AddTriangleColor(weights1); // terrain.AddTriangleColor(weights1); // terrain.AddTriangleColor(weights1); // terrain.AddTriangleColor(weights1); // Vector3 types; // types.x = types.y = types.z = type; // terrain.AddTriangleTerrainTypes(types); // terrain.AddTriangleTerrainTypes(types); // terrain.AddTriangleTerrainTypes(types); // terrain.AddTriangleTerrainTypes(types); } 

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

  TriangulateEdgeFan(center, e, cell.Index); 

рдЕрдЧрд▓рд╛ TriangulateEdgeStrip ред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд░рд┐рдлреНрд▓реИрдХреНрдЯрд░-рд░реАрдиреЗрдо рдХрд╛ рдирд╛рдо c1 рдФрд░ c2 рд╕реЗ w1 рдФрд░ w2 ред

  void TriangulateEdgeStrip ( EdgeVertices e1, Color w1, float index1, EdgeVertices e2, Color w2, float index2, bool hasRoad = false ) { terrain.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); terrain.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); terrain.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); terrain.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); Vector3 indices; indices.x = indices.z = index1; indices.y = index2; terrain.AddQuadCellData(indices, w1, w2); terrain.AddQuadCellData(indices, w1, w2); terrain.AddQuadCellData(indices, w1, w2); terrain.AddQuadCellData(indices, w1, w2); // terrain.AddQuadColor(c1, c2); // terrain.AddQuadColor(c1, c2); // terrain.AddQuadColor(c1, c2); // terrain.AddQuadColor(c1, c2); // Vector3 types; // types.x = types.z = type1; // types.y = type2; // terrain.AddQuadTerrainTypes(types); // terrain.AddQuadTerrainTypes(types); // terrain.AddQuadTerrainTypes(types); // terrain.AddQuadTerrainTypes(types); if (hasRoad) { TriangulateRoadSegment(e1.v2, e1.v3, e1.v4, e2.v2, e2.v3, e2.v4); } } 

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

  TriangulateEdgeStrip( m, weights1, cell.Index, e, weights1, cell.Index ); тАж TriangulateEdgeStrip( e1, weights1, cell.Index, e2, weights2, neighbor.Index, hasRoad ); тАж void TriangulateEdgeTerraces ( EdgeVertices begin, HexCell beginCell, EdgeVertices end, HexCell endCell, bool hasRoad ) { EdgeVertices e2 = EdgeVertices.TerraceLerp(begin, end, 1); Color w2 = HexMetrics.TerraceLerp(weights1, weights2, 1); float i1 = beginCell.Index; float i2 = endCell.Index; TriangulateEdgeStrip(begin, weights1, i1, e2, w2, i2, hasRoad); for (int i = 2; i < HexMetrics.terraceSteps; i++) { EdgeVertices e1 = e2; Color w1 = w2; e2 = EdgeVertices.TerraceLerp(begin, end, i); w2 = HexMetrics.TerraceLerp(weights1, weights2, i); TriangulateEdgeStrip(e1, w1, i1, e2, w2, i2, hasRoad); } TriangulateEdgeStrip(e2, w2, i1, end, weights2, i2, hasRoad); } 

рдЕрдм рд╣рдо рдХреЛрдг рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдпреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╕рд░рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрдиреНрд╣реЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ TriangulateCorner ред

  void TriangulateCorner ( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { тАж else { terrain.AddTriangle(bottom, left, right); Vector3 indices; indices.x = bottomCell.Index; indices.y = leftCell.Index; indices.z = rightCell.Index; terrain.AddTriangleCellData(indices, weights1, weights2, weights3); // terrain.AddTriangleColor(weights1, weights2, weights3); // Vector3 types; // types.x = bottomCell.TerrainTypeIndex; // types.y = leftCell.TerrainTypeIndex; // types.z = rightCell.TerrainTypeIndex; // terrain.AddTriangleTerrainTypes(types); } features.AddWall(bottom, bottomCell, left, leftCell, right, rightCell); } 

TriangulateCornerTerraces рдореЗрдВ рдЖрдЧреЗред

  void TriangulateCornerTerraces ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { Vector3 v3 = HexMetrics.TerraceLerp(begin, left, 1); Vector3 v4 = HexMetrics.TerraceLerp(begin, right, 1); Color w3 = HexMetrics.TerraceLerp(weights1, weights2, 1); Color w4 = HexMetrics.TerraceLerp(weights1, weights3, 1); Vector3 indices; indices.x = beginCell.Index; indices.y = leftCell.Index; indices.z = rightCell.Index; terrain.AddTriangle(begin, v3, v4); terrain.AddTriangleCellData(indices, weights1, w3, w4); // terrain.AddTriangleColor(weights1, w3, w4); // terrain.AddTriangleTerrainTypes(indices); for (int i = 2; i < HexMetrics.terraceSteps; i++) { Vector3 v1 = v3; Vector3 v2 = v4; Color w1 = w3; Color w2 = w4; v3 = HexMetrics.TerraceLerp(begin, left, i); v4 = HexMetrics.TerraceLerp(begin, right, i); w3 = HexMetrics.TerraceLerp(weights1, weights2, i); w4 = HexMetrics.TerraceLerp(weights1, weights3, i); terrain.AddQuad(v1, v2, v3, v4); terrain.AddQuadCellData(indices, w1, w2, w3, w4); // terrain.AddQuadColor(w1, w2, w3, w4); // terrain.AddQuadTerrainTypes(indices); } terrain.AddQuad(v3, v4, left, right); terrain.AddQuadCellData(indices, w3, w4, weights2, weights3); // terrain.AddQuadColor(w3, w4, weights2, weights3); // terrain.AddQuadTerrainTypes(indices); } 

рдлрд┐рд░ TriangulateCornerTerracesCliff ред

  void TriangulateCornerTerracesCliff ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { float b = 1f / (rightCell.Elevation - beginCell.Elevation); if (b < 0) { b = -b; } Vector3 boundary = Vector3.Lerp( HexMetrics.Perturb(begin), HexMetrics.Perturb(right), b ); Color boundaryWeights = Color.Lerp(weights1, weights3, b); Vector3 indices; indices.x = beginCell.Index; indices.y = leftCell.Index; indices.z = rightCell.Index; TriangulateBoundaryTriangle( begin, weights1, left, weights2, boundary, boundaryWeights, indices ); if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope) { TriangulateBoundaryTriangle( left, weights2, right, weights3, boundary, boundaryWeights, indices ); } else { terrain.AddTriangleUnperturbed( HexMetrics.Perturb(left), HexMetrics.Perturb(right), boundary ); terrain.AddTriangleCellData( indices, weights2, weights3, boundaryWeights ); // terrain.AddTriangleColor(weights2, weights3, boundaryColor); // terrain.AddTriangleTerrainTypes(indices); } } 

рдФрд░ TriangulateCornerCliffTerraces рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧред

  void TriangulateCornerCliffTerraces ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { float b = 1f / (leftCell.Elevation - beginCell.Elevation); if (b < 0) { b = -b; } Vector3 boundary = Vector3.Lerp( HexMetrics.Perturb(begin), HexMetrics.Perturb(left), b ); Color boundaryWeights = Color.Lerp(weights1, weights2, b); Vector3 indices; indices.x = beginCell.Index; indices.y = leftCell.Index; indices.z = rightCell.Index; TriangulateBoundaryTriangle( right, weights3, begin, weights1, boundary, boundaryWeights, indices ); if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope) { TriangulateBoundaryTriangle( left, weights2, right, weights3, boundary, boundaryWeights, indices ); } else { terrain.AddTriangleUnperturbed( HexMetrics.Perturb(left), HexMetrics.Perturb(right), boundary ); terrain.AddTriangleCellData( indices, weights2, weights3, boundaryWeights ); // terrain.AddTriangleColor(weights2, weights3, boundaryWeights); // terrain.AddTriangleTerrainTypes(indices); } } 

рдкрд┐рдЫрд▓реЗ рджреЛ рддрд░реАрдХреЗ TriangulateBoundaryTriangle рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

  void TriangulateBoundaryTriangle ( Vector3 begin, Color beginWeights, Vector3 left, Color leftWeights, Vector3 boundary, Color boundaryWeights, Vector3 indices ) { Vector3 v2 = HexMetrics.Perturb(HexMetrics.TerraceLerp(begin, left, 1)); Color w2 = HexMetrics.TerraceLerp(beginWeights, leftWeights, 1); terrain.AddTriangleUnperturbed(HexMetrics.Perturb(begin), v2, boundary); terrain.AddTriangleCellData(indices, beginWeights, w2, boundaryWeights); // terrain.AddTriangleColor(beginColor, c2, boundaryColor); // terrain.AddTriangleTerrainTypes(types); for (int i = 2; i < HexMetrics.terraceSteps; i++) { Vector3 v1 = v2; Color w1 = w2; v2 = HexMetrics.Perturb(HexMetrics.TerraceLerp(begin, left, i)); w2 = HexMetrics.TerraceLerp(beginWeights, leftWeights, i); terrain.AddTriangleUnperturbed(v1, v2, boundary); terrain.AddTriangleCellData(indices, w1, w2, boundaryWeights); // terrain.AddTriangleColor(c1, c2, boundaryColor); // terrain.AddTriangleTerrainTypes(types); } terrain.AddTriangleUnperturbed(v2, HexMetrics.Perturb(left), boundary); terrain.AddTriangleCellData(indices, w2, leftWeights, boundaryWeights); // terrain.AddTriangleColor(c2, leftColor, boundaryColor); // terrain.AddTriangleTerrainTypes(types); } 

рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ рдЬрд┐рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ TriangulateWithRiver ред

  void TriangulateWithRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж terrain.AddTriangle(centerL, m.v1, m.v2); terrain.AddQuad(centerL, center, m.v2, m.v3); terrain.AddQuad(center, centerR, m.v3, m.v4); terrain.AddTriangle(centerR, m.v4, m.v5); Vector3 indices; indices.x = indices.y = indices.z = cell.Index; terrain.AddTriangleCellData(indices, weights1); terrain.AddQuadCellData(indices, weights1); terrain.AddQuadCellData(indices, weights1); terrain.AddTriangleCellData(indices, weights1); // terrain.AddTriangleColor(weights1); // terrain.AddQuadColor(weights1); // terrain.AddQuadColor(weights1); // terrain.AddTriangleColor(weights1); // Vector3 types; // types.x = types.y = types.z = cell.TerrainTypeIndex; // terrain.AddTriangleTerrainTypes(types); // terrain.AddQuadTerrainTypes(types); // terrain.AddQuadTerrainTypes(types); // terrain.AddTriangleTerrainTypes(types); тАж } 

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░реАрдлрд╝реИрдм рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд░рд╛рд╣рдд рдХреЗ рдмрд╛рд▓ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


рд░рд╛рд╣рдд рд╕реЗрд▓ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

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


рд╕реЗрд▓ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдКрдВрдЪрд╛рдИ рдмрдирд╛рд╡рдЯ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдирд╛ред

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

рд╕реЗрд▓ рдбреЗрдЯрд╛ рдХреЛ shader рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ


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

рд╕реЗрд▓ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ Shader.SetGlobalTexture рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдпрд╣ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ _HexCDData рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗред

  public void Initialize (int x, int z) { тАж else { cellTexture = new Texture2D( x, z, TextureFormat.RGBA32, false, true ); cellTexture.filterMode = FilterMode.Point; cellTexture.wrapMode = TextureWrapMode.Clamp; Shader.SetGlobalTexture("_HexCellData", cellTexture); } тАж } 

рд╢реЗрдбрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпреВрдирд┐рдЯреА рдЯреЗрдХреНрд╕рдЪрд░ рдЖрдХрд╛рд░ рдХреЛ рдмрдирд╛рд╡рдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╡рд╛рддреА рд╣реИ редName_TexelSize рд╡реЗрд░рд┐рдПрдмрд▓ред рдпрд╣ рдПрдХ рдЪрд╛рд░-рдШрдЯрдХ рд╕рджрд┐рд╢ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд╛рди рд╣реИрдВ рдЬреЛ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рднреАред рд▓реЗрдХрд┐рди рд╡реИрд╢реНрд╡рд┐рдХ рдмрдирд╛рд╡рдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдпрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ Shader.SetGlobalVector рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рдХрд░реЗрдВрдЧреЗред

  else { cellTexture = new Texture2D( x, z, TextureFormat.RGBA32, false, true ); cellTexture.filterMode = FilterMode.Point; cellTexture.wrapMode = TextureWrapMode.Clamp; Shader.SetGlobalTexture("_HexCellData", cellTexture); } Shader.SetGlobalVector( "_HexCellData_TexelSize", new Vector4(1f / x, 1f / z, x, z) ); 

Shader Data Access


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

 sampler2D _HexCellData; float4 _HexCellData_TexelSize; float4 GetCellData (appdata_full v) { } 


рдирдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╕реЗрд▓ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ v.texcoord2 рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ v.texcoord2 , рдЬреИрд╕рд╛ рдХрд┐ рдЗрд▓рд╛рдХрд╝реЗ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рдерд╛ред рдкрд╣рд▓реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - v.texcoord2.x ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдмрдирд╛рд╡рдЯ рдХреЗ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЗрд╕реЗ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

рдпреВ рд╕рдордиреНрд╡рдп рдмрдирд╛рдиреЗ рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рдмрдирд╛рд╡рдЯ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рд╕реЗрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ _HexCellData_TexelSize.x рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 float4 GetCellData (appdata_full v) { float2 uv; uv.x = v.texcoord2.x * _HexCellData_TexelSize.x; } 

рдкрд░рд┐рдгрд╛рдо ZU рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ Z рдкрдВрдХреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ рдФрд░ U, U рд╕реЗрд▓ рдХрд╛ рд╕рдордиреНрд╡рдп рд╣реИред рд╣рдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдиреАрдЪреЗ рд▓рд╛рдХрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдпреВ рд╕рдордиреНрд╡рдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдШрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред

 float4 GetCellData (appdata_full v) { float2 uv; uv.x = v.texcoord2.x * _HexCellData_TexelSize.x; float row = floor(uv.x); uv.x -= row; } 

V рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдмрдирд╛рд╡рдЯ рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗ рд░реЗрдЦрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

 float4 GetCellData (appdata_full v) { float2 uv; uv.x = v.texcoord2.x * _HexCellData_TexelSize.x; float row = floor(uv.x); uv.x -= row; uv.y = row * _HexCellData_TexelSize.y; } 

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

 float4 GetCellData (appdata_full v) { float2 uv; uv.x = (v.texcoord2.x + 0.5) * _HexCellData_TexelSize.x; float row = floor(uv.x); uv.x -= row; uv.y = (row + 0.5) * _HexCellData_TexelSize.y; } 

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

 float4 GetCellData (appdata_full v, int index) { float2 uv; uv.x = (v.texcoord2[index] + 0.5) * _HexCellData_TexelSize.x; float row = floor(uv.x); uv.x -= row; uv.y = (row + 0.5) * _HexCellData_TexelSize.y; } 

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВ, рддреЛ рд╣рдо рдирдореВрдирд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ _HexCellDataред рдЪреВрдБрдХрд┐ рд╣рдо рд╡рд░реНрдЯреЗрдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рд▓реЗ рд░рд╣реЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рд╢реЗрдк рдХреЛ рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ tex2DlodрдЬрд┐рд╕рдореЗрдВ рдЪрд╛рд░ рдмрдирд╛рд╡рдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЪреВрдВрдХрд┐ рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдПрдордЖрдИрдкреА-рдмрдирд╛рд╡рдЯ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╢реВрдиреНрдп рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

 float4 GetCellData (appdata_full v, int index) { float2 uv; uv.x = (v.texcoord2[index] + 0.5) * _HexCellData_TexelSize.x; float row = floor(uv.x); uv.x -= row; uv.y = (row + 0.5) * _HexCellData_TexelSize.y; float4 data = tex2Dlod(_HexCellData, float4(uv, 0, 0)); } 

рдЪреМрдереЗ рдбреЗрдЯрд╛ рдШрдЯрдХ рдореЗрдВ рдПрдХ рдКрдВрдЪрд╛рдИ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╕реАрдзреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, GPU рдиреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ 0-2 рдХреА рд╕реАрдорд╛ рдореЗрдВ рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдорд╛рди рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд╕рд╣реА рдорд╛рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ 255 рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  float4 data = tex2Dlod(_HexCellData, float4(uv, 0, 0)); data.w *= 255; return data; 

рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╢рд╛рдорд┐рд▓ HexCellData рд╢реЗрдбрд░ рдореЗрдВ рднреВ-рднрд╛рдЧ ред рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ shader рдХреЛ Material / Terrain рдореЗрдВ рд░рдЦрд╛ рд╣реИ , рдореБрдЭреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ../HexCellData.cginc ред

  #include "../HexCellData.cginc" UNITY_DECLARE_TEX2DARRAY(_MainTex); 

рд╢реАрд░реНрд╖ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ, рд╣рдо рд╢реАрд░реНрд╖ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕рднреА рддреАрди рд╕реЗрд▓ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ data.terrainрдЙрдирдХреЗ рдЙрдиреНрдирдпрди рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ ред

  void vert (inout appdata_full v, out Input data) { UNITY_INITIALIZE_OUTPUT(Input, data); // data.terrain = v.texcoord2.xyz; float4 cell0 = GetCellData(v, 0); float4 cell1 = GetCellData(v, 1); float4 cell2 = GetCellData(v, 2); data.terrain.x = cell0.w; data.terrain.y = cell1.w; data.terrain.z = cell2.w; } 

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

unitypackage

рджреГрд╢реНрдпрддрд╛


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

рд╢реЗрдбрд░


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

  struct Input { float4 color : COLOR; float3 worldPos; float3 terrain; float3 visibility; }; 

рджреГрд╢реНрдпрддрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдкрд╣рд▓реЗ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

  void vert (inout appdata_full v, out Input data) { UNITY_INITIALIZE_OUTPUT(Input, data); float4 cell0 = GetCellData(v, 0); float4 cell1 = GetCellData(v, 1); float4 cell2 = GetCellData(v, 2); data.terrain.x = cell0.w; data.terrain.y = cell1.w; data.terrain.z = cell2.w; data.visibility.x = cell0.x; data.visibility.y = cell1.x; data.visibility.z = cell2.x; } 

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

  float4 GetTerrainColor (Input IN, int index) { float3 uvw = float3(IN.worldPos.xz * 0.02, IN.terrain[index]); float4 c = UNITY_SAMPLE_TEX2DARRAY(_MainTex, uvw); return c * (IN.color[index] * IN.visibility[index]); } 


рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдХрд╛рд▓реА рд╣реЛ рдЧрдИрдВред

рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХреЛ рдЬреЛрдбрд╝ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ?
, . . . , . , .

рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЕрдВрдзреЗрд░рд╛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрджреГрд╢реНрдп рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рд▓рдЪрд▓ рд╣реИред рддрд╛рдХрд┐ рд╣рдо рдЕрднреА рднреА рд░рд╛рд╣рдд рджреЗрдЦ рд╕рдХреЗрдВ, рд╣рдореЗрдВ рдЫрд┐рдкреА рд╣реБрдИ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдХреЗрддрдХ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП 0-1 рд╕реЗ 1 - 1 рддрдХ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрд░рд┐рдпрд╛ lerpрдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдВрдд рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

  void vert (inout appdata_full v, out Input data) { тАж data.visibility.x = cell0.x; data.visibility.y = cell1.x; data.visibility.z = cell2.x; data.visibility = lerp(0.25, 1, data.visibility); } 


рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдХреЛрд╢рд┐рдХрд╛рдПрдБред

рд╕реЗрд▓ рджреГрд╢реНрдпрддрд╛ рдЯреНрд░реИрдХрд┐рдВрдЧ


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

  public bool IsVisible { get { return visibility > 0; } } тАж int visibility; тАж public void IncreaseVisibility () { visibility += 1; } public void DecreaseVisibility () { visibility -= 1; } 

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕ HexCellShaderDataрд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ RefreshVisibility, рдЬреЛ RefreshTerrainрджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рдХрд░рддреА рд╣реИред рдбреЗрдЯрд╛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдШрдЯрдХ рдЖрд░ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рд╣реЗрдЬреЗрдВред рдЪреВрдБрдХрд┐ рд╣рдо рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ 0-1 рдорд╛рдиреЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдо рджреГрд╢реНрдпрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (byte)255ред

  public void RefreshVisibility (HexCell cell) { cellTextureData[cell.Index].r = cell.IsVisible ? (byte)255 : (byte)0; enabled = true; } 

рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдмрдврд╝рддреЗ рдФрд░ рдШрдЯрддреЗ рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╣реЗрдВрдЧреЗ, 0 рдФрд░ 1 рдХреЗ рдмреАрдЪ рдХреЗ рдорд╛рди рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдПред

  public void IncreaseVisibility () { visibility += 1; if (visibility == 1) { ShaderData.RefreshVisibility(this); } } public void DecreaseVisibility () { visibility -= 1; if (visibility == 0) { ShaderData.RefreshVisibility(this); } } 

рд╕реНрдХреНрд╡рд╛рдб рджреГрд╢реНрдпрддрд╛ рдмрдирд╛рдирд╛


рдЖрдЗрдП рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрдХрд╛рдЗрдпрд╛рдБ рдЙрд╕ рдХрдХреНрд╖ рдХреЛ рджреЗрдЦ рд╕рдХреЗрдВ, рдЬрд┐рд╕ рдкрд░ рдЙрдирдХрд╛ рдХрдмреНрдЬрд╛ рд╣реИред рдпрд╣ IncreaseVisibilityрдХрд╛рд░реНрдп рдХреЗ рджреМрд░рд╛рди рдпреВрдирд┐рдЯ рдХреЗ рдирдП рд╕реНрдерд╛рди рдкрд░ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ HexUnit.Locationред рд╣рдо рдкреБрд░рд╛рдиреЗ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рднреА рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ) DecreaseVisibilityред

  public HexCell Location { get { return location; } set { if (location) { location.DecreaseVisibility(); location.Unit = null; } location = value; value.Unit = this; value.IncreaseVisibility(); transform.localPosition = value.Position; } } 


рдЗрдХрд╛рдЗрдпрд╛рдБ рджреЗрдЦ рд╕рдХрддреА рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд╣рд╛рдБ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ рд╣рдордиреЗ рджреГрд╢реНрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛! рдЬрдм рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрдХрд╛рдЗрдпрд╛рдВ рдЕрдкрдиреЗ рд╕реЗрд▓ рдХреЛ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рддреА рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдирдХреЗ рд╕реНрдерд╛рди рдХреЛ рдЙрдирдХреЗ рдирдП рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рдЯреЗрд▓реАрдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдирдХреНрд╢реЗ рд╕реЗ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп рдЙрдирдХрд╛ рджрд╛рдпрд░рд╛ рд╕рдХреНрд░рд┐рдп рд░рд╣рддрд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп рдЙрдирдХреЗ рд╕реНрдерд╛рди рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрдВрдЧреЗред

  public void Die () { if (location) { location.DecreaseVisibility(); } location.Unit = null; Destroy(gameObject); } 

рджреГрд╢реНрдпрддрд╛ рд╕реАрдорд╛


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

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

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

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

  List<HexCell> GetVisibleCells (HexCell fromCell, int range) { List<HexCell> visibleCells = ListPool<HexCell>.Get(); searchFrontierPhase += 2; if (searchFrontier == null) { searchFrontier = new HexCellPriorityQueue(); } else { searchFrontier.Clear(); } fromCell.SearchPhase = searchFrontierPhase; fromCell.Distance = 0; searchFrontier.Enqueue(fromCell); while (searchFrontier.Count > 0) { HexCell current = searchFrontier.Dequeue(); current.SearchPhase += 1; visibleCells.Add(current); // if (current == toCell) { // return true; // } // int currentTurn = (current.Distance - 1) / speed; for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = current.GetNeighbor(d); if ( neighbor == null || neighbor.SearchPhase > searchFrontierPhase ) { continue; } // тАж // int moveCost; // тАж int distance = current.Distance + 1; if (distance > range) { continue; } // int turn = (distance - 1) / speed; // if (turn > currentTurn) { // distance = turn * speed + moveCost; // } if (neighbor.SearchPhase < searchFrontierPhase) { neighbor.SearchPhase = searchFrontierPhase; neighbor.Distance = distance; // neighbor.PathFrom = current; neighbor.SearchHeuristic = 0; searchFrontier.Enqueue(neighbor); } else if (distance < neighbor.Distance) { int oldPriority = neighbor.SearchPriority; neighbor.Distance = distance; // neighbor.PathFrom = current; searchFrontier.Change(neighbor, oldPriority); } } } return visibleCells; } 

рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣рдо рдПрдХ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
, , .

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ HexGridрддрд░реАрдХреЗ IncreaseVisibilityрдФрд░ рдЬреЛрдбрд╝реЗрдВ DecreaseVisibilityред рд╡реЗ рд╕реЗрд▓ рдФрд░ рд░реЗрдВрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рджреГрд╢реНрдпрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ / рдХрдореА рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рдХреЛ рдЙрд╕рдХреЗ рдкреВрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

  public void IncreaseVisibility (HexCell fromCell, int range) { List<HexCell> cells = GetVisibleCells(fromCell, range); for (int i = 0; i < cells.Count; i++) { cells[i].IncreaseVisibility(); } ListPool<HexCell>.Add(cells); } public void DecreaseVisibility (HexCell fromCell, int range) { List<HexCell> cells = GetVisibleCells(fromCell, range); for (int i = 0; i < cells.Count; i++) { cells[i].DecreaseVisibility(); } ListPool<HexCell>.Add(cells); } 

рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ HexUnitрдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд┐рдб рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ Gridред

  public HexGrid Grid { get; set; } 

рдЬрдм рдЖрдк рдЧреНрд░рд┐рдб рдореЗрдВ рдПрдХ рд╕реНрдХреНрд╡рд╛рдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧреНрд░рд┐рдб рдЕрд╕рд╛рдЗрди рдХрд░реЗрдЧрд╛ HexGrid.AddUnitред

  public void AddUnit (HexUnit unit, HexCell location, float orientation) { units.Add(unit); unit.Grid = this; unit.transform.SetParent(transform, false); unit.Location = location; unit.Orientation = orientation; } 

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

  const int visionRange = 3; тАж public HexCell Location { get { return location; } set { if (location) { // location.DecreaseVisibility(); Grid.DecreaseVisibility(location, visionRange); location.Unit = null; } location = value; value.Unit = this; // value.IncreaseVisibility(); Grid.IncreaseVisibility(value, visionRange); transform.localPosition = value.Position; } } тАж public void Die () { if (location) { // location.DecreaseVisibility(); Grid.DecreaseVisibility(location, visionRange); } location.Unit = null; Destroy(gameObject); } 


рджреГрд╢реНрдпрддрд╛ рд░реЗрдВрдЬ рд╡рд╛рд▓реА рдЗрдХрд╛рдЗрдпрд╛рдБ рдЬреЛ рдУрд╡рд░рд▓реИрдк рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдЪрд▓рддреЗ рд╕рдордп рджреГрд╢реНрдпрддрд╛


рдлрд┐рд▓рд╣рд╛рд▓, рдЪрд╛рд▓ рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рдж рджрд╕реНрддреЗ рдХреА рджреГрд╢реНрдпрддрд╛ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рддреБрд░рдВрдд рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдкрд░ рдЯреЗрд▓реАрдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЗрдХрд╛рдИ рдФрд░ рдЙрд╕рдХреА рджреГрд╢реНрдпрддрд╛ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рдПрдХ рд╕рд╛рде рдЪрд▓реЗ рддреЛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдХрджрдо рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдм рд╕рдВрдкрддреНрддрд┐ LocationрдЧ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ HexUnit.Travelред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо locationрд╕рдВрдкрддреНрддрд┐ рдХреЛрдб рд╕реЗ рдмрдЪрддреЗ рд╣реБрдП рд╕реАрдзреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рд╕реНрдерд╛рди рдХреЛ рд╕рд╛рдлрд╝ рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдПрдХ рдирдП рд╕реНрдерд╛рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред рджреГрд╢реНрдпрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧреАред

  public void Travel (List<HexCell> path) { // Location = path[path.Count - 1]; location.Unit = null; location = path[path.Count - 1]; location.Unit = this; pathToTravel = path; StopAllCoroutines(); StartCoroutine(TravelPath()); } 

рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рдЕрдВрджрд░, TravelPathрд╣рдо рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдкрд╣рд▓реА рд╕реЗрд▓ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрдВрдЧреЗ LookAtред рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдирдП рд╕реЗрд▓ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рд╕реЗрд▓ рд╕реЗ рджреГрд╢реНрдпрддрд╛ рдмрдврд╝рд╛рдПрдВрдЧреЗред рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдлрд┐рд░ рд╕реЗ рджреГрд╢реНрдпрддрд╛ рдХрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рд╕реЗрд▓ рд╕реЗ рджреГрд╢реНрдпрддрд╛ рдмрдврд╝рд╛рдПрдВред

  IEnumerator TravelPath () { Vector3 a, b, c = pathToTravel[0].Position; // transform.localPosition = c; yield return LookAt(pathToTravel[1].Position); Grid.DecreaseVisibility(pathToTravel[0], visionRange); float t = Time.deltaTime * travelSpeed; for (int i = 1; i < pathToTravel.Count; i++) { a = c; b = pathToTravel[i - 1].Position; c = (b + pathToTravel[i].Position) * 0.5f; Grid.IncreaseVisibility(pathToTravel[i], visionRange); for (; t < 1f; t += Time.deltaTime * travelSpeed) { тАж } Grid.DecreaseVisibility(pathToTravel[i], visionRange); t -= 1f; } a = c; b = location.Position; // We can simply use the destination here. c = b; Grid.IncreaseVisibility(location, visionRange); for (; t < 1f; t += Time.deltaTime * travelSpeed) { тАж } тАж } 


рдЗрд╕ рдХрджрдо рдкрд░ рджреГрд╢реНрдпрддрд╛ред

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

  HexCell location, currentTravelLocation; 

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

  IEnumerator TravelPath () { тАж for (int i = 1; i < pathToTravel.Count; i++) { currentTravelLocation = pathToTravel[i]; a = c; b = pathToTravel[i - 1].Position; c = (b + currentTravelLocation.Position) * 0.5f; Grid.IncreaseVisibility(pathToTravel[i], visionRange); for (; t < 1f; t += Time.deltaTime * travelSpeed) { transform.localPosition = Bezier.GetPoint(a, b, c, t); Vector3 d = Bezier.GetDerivative(a, b, c, t); dy = 0f; transform.localRotation = Quaternion.LookRotation(d); yield return null; } Grid.DecreaseVisibility(pathToTravel[i], visionRange); t -= 1f; } currentTravelLocation = null; тАж } 

рдЕрдм рдмрд╛рд░реА рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, TravelPathрд╣рдо рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрде рдХрд╛ рдкреБрд░рд╛рдирд╛ рдордзреНрдпрд╡рд░реНрддреА рд╕реНрдерд╛рди рдЬреНрдЮрд╛рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рд╕реЗрд▓ рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдкрде рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВред

  IEnumerator TravelPath () { Vector3 a, b, c = pathToTravel[0].Position; yield return LookAt(pathToTravel[1].Position); Grid.DecreaseVisibility( currentTravelLocation ? currentTravelLocation : pathToTravel[0], visionRange ); тАж } 

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

  void OnEnable () { if (location) { transform.localPosition = location.Position; if (currentTravelLocation) { Grid.IncreaseVisibility(location, visionRange); Grid.DecreaseVisibility(currentTravelLocation, visionRange); currentTravelLocation = null; } } } 

unitypackage

рд╕рдбрд╝рдХреЛрдВ рдФрд░ рдкрд╛рдиреА рдХреА рджреГрд╢реНрдпрддрд╛


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

рд╕рдбрд╝рдХреЛрдВ


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

  void TriangulateRoadEdge ( Vector3 center, Vector3 mL, Vector3 mR, float index ) { roads.AddTriangle(center, mL, mR); roads.AddTriangleUV( new Vector2(1f, 0f), new Vector2(0f, 0f), new Vector2(0f, 0f) ); Vector3 indices; indices.x = indices.y = indices.z = index; roads.AddTriangleCellData(indices, weights1); } 

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

  void TriangulateRoadSegment ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, Vector3 v5, Vector3 v6, Color w1, Color w2, Vector3 indices ) { roads.AddQuad(v1, v2, v4, v5); roads.AddQuad(v2, v3, v5, v6); roads.AddQuadUV(0f, 1f, 0f, 0f); roads.AddQuadUV(1f, 0f, 0f, 0f); roads.AddQuadCellData(indices, w1, w2); roads.AddQuadCellData(indices, w1, w2); } 

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

  void TriangulateRoad ( Vector3 center, Vector3 mL, Vector3 mR, EdgeVertices e, bool hasRoadThroughCellEdge, float index ) { if (hasRoadThroughCellEdge) { Vector3 indices; indices.x = indices.y = indices.z = index; Vector3 mC = Vector3.Lerp(mL, mR, 0.5f); TriangulateRoadSegment( mL, mC, mR, e.v2, e.v3, e.v4, weights1, weights1, indices ); roads.AddTriangle(center, mL, mC); roads.AddTriangle(center, mC, mR); roads.AddTriangleUV( new Vector2(1f, 0f), new Vector2(0f, 0f), new Vector2(1f, 0f) ); roads.AddTriangleUV( new Vector2(1f, 0f), new Vector2(1f, 0f), new Vector2(0f, 0f) ); roads.AddTriangleCellData(indices, weights1); roads.AddTriangleCellData(indices, weights1); } else { TriangulateRoadEdge(center, mL, mR, index); } } 

рдпрд╣ рд╕рднреА рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TriangulateRoad, TriangulateRoadEdgeрдФрд░ TriangulateRoadSegment, рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ ред

  void TriangulateWithoutRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { TriangulateEdgeFan(center, e, cell.Index); if (cell.HasRoads) { Vector2 interpolators = GetRoadInterpolators(direction, cell); TriangulateRoad( center, Vector3.Lerp(center, e.v1, interpolators.x), Vector3.Lerp(center, e.v5, interpolators.y), e, cell.HasRoadThroughEdge(direction), cell.Index ); } } тАж void TriangulateRoadAdjacentToRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж TriangulateRoad(roadCenter, mL, mR, e, hasRoadThroughEdge, cell.Index); if (previousHasRiver) { TriangulateRoadEdge(roadCenter, center, mL, cell.Index); } if (nextHasRiver) { TriangulateRoadEdge(roadCenter, mR, center, cell.Index); } } тАж void TriangulateEdgeStrip ( тАж ) { тАж if (hasRoad) { TriangulateRoadSegment( e1.v2, e1.v3, e1.v4, e2.v2, e2.v3, e2.v4, w1, w2, indices ); } } 

рдЕрдм рдореЗрд╖ рдбреЗрдЯрд╛ рд╕рд╣реА рд╣реИ, рдФрд░ рд╣рдо рд░реЛрдб рд╢реЗрдбрд░ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ ред рдпрд╣ рдПрдХ рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ HexCellData рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред

  #pragma surface surf Standard fullforwardshadows decal:blend vertex:vert #pragma target 3.0 #include "HexCellData.cginc" 

рдЪреВрдВрдХрд┐ рд╣рдо рдХрдИ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЯреБрдХрдбрд╝рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХреЗ рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

  struct Input { float2 uv_MainTex; float3 worldPos; float visibility; }; 

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

  void vert (inout appdata_full v, out Input data) { UNITY_INITIALIZE_OUTPUT(Input, data); float4 cell0 = GetCellData(v, 0); float4 cell1 = GetCellData(v, 1); data.visibility = cell0.x * v.color.x + cell1.x * v.color.y; data.visibility = lerp(0.25, 1, data.visibility); } 

рдЯреБрдХрдбрд╝реЗ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд░рдВрдЧ рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  void surf (Input IN, inout SurfaceOutputStandard o) { float4 noise = tex2D(_MainTex, IN.worldPos.xz * 0.025); fixed4 c = _Color * ((noise.y * 0.75 + 0.25) * IN.visibility); тАж } 


рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдбрд╝рдХреЗрдВред

рдЦреБрд▓рд╛ рдкрд╛рдиреА


рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рджреГрд╢реНрдпрддрд╛ рдкрд╣рд▓реЗ рд╣реА рдкрд╛рдиреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рдЪреБрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдкрд╛рдиреА рдореЗрдВ рдбреВрдмреЗ рдЗрд▓рд╛рдХреЗ рдХреА рд╕рддрд╣ рд╣реИред рдЖрдЗрдП, рджреГрд╢реНрдпрддрд╛ рдХреЛ рдЦреБрд▓реЗ рдкрд╛рдиреА рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ HexGridChunk.TriangulateOpenWaterред

  void TriangulateOpenWater ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { тАж water.AddTriangle(center, c1, c2); Vector3 indices; indices.x = indices.y = indices.z = cell.Index; water.AddTriangleCellData(indices, weights1); if (direction <= HexDirection.SE && neighbor != null) { тАж water.AddQuad(c1, c2, e1, e2); indices.y = neighbor.Index; water.AddQuadCellData(indices, weights1, weights2); if (direction <= HexDirection.E) { тАж water.AddTriangle( c2, e2, c2 + HexMetrics.GetWaterBridge(direction.Next()) ); indices.z = nextNeighbor.Index; water.AddTriangleCellData( indices, weights1, weights2, weights3 ); } } } 

рд╣рдореЗрдВ рддрдЯреЛрдВ рдХреЗ рдкрд╛рд╕ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  void TriangulateWaterShore ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { тАж water.AddTriangle(center, e1.v1, e1.v2); water.AddTriangle(center, e1.v2, e1.v3); water.AddTriangle(center, e1.v3, e1.v4); water.AddTriangle(center, e1.v4, e1.v5); Vector3 indices; indices.x = indices.y = indices.z = cell.Index; water.AddTriangleCellData(indices, weights1); water.AddTriangleCellData(indices, weights1); water.AddTriangleCellData(indices, weights1); water.AddTriangleCellData(indices, weights1); тАж } 

рд╡рд╛рдЯрд░ рд╢реЗрдб рдХреЛ рд░реЛрдб рд╢реЗрдбрд░ рдХреЗ рд╕рдорд╛рди рд╣реА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдЗрд╕реЗ рджреЛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рддреАрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

  #pragma surface surf Standard alpha vertex:vert #pragma target 3.0 #include "Water.cginc" #include "HexCellData.cginc" sampler2D _MainTex; struct Input { float2 uv_MainTex; float3 worldPos; float visibility; }; тАж void vert (inout appdata_full v, out Input data) { UNITY_INITIALIZE_OUTPUT(Input, data); float4 cell0 = GetCellData(v, 0); float4 cell1 = GetCellData(v, 1); float4 cell2 = GetCellData(v, 2); data.visibility = cell0.x * v.color.x + cell1.x * v.color.y + cell2.x * v.color.z; data.visibility = lerp(0.25, 1, data.visibility); } void surf (Input IN, inout SurfaceOutputStandard o) { float waves = Waves(IN.worldPos.xz, _MainTex); fixed4 c = saturate(_Color + waves); o.Albedo = c.rgb * IN.visibility; тАж } 


рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдЦреБрд▓рд╛ рдкрд╛рдиреАред

рддрдЯ рдФрд░ рдореБрд╣рд╛рдирд╛


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

  Vector3 indices; // indices.x = indices.y = indices.z = cell.Index; indices.x = indices.z = cell.Index; indices.y = neighbor.Index; 

рд╕реЗрд▓ рдбреЗрдЯрд╛ рдХреЛ рдХреНрд╡рд╛рдбреНрд╕ рдФрд░ рддрдЯ рдХреЗ рддреНрд░рд┐рдХреЛрдг рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рд╣рдо рдХреЙрд▓ рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рднреА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ TriangulateEstuaryред

  if (cell.HasRiverThroughEdge(direction)) { TriangulateEstuary( e1, e2, cell.IncomingRiver == direction, indices ); } else { тАж waterShore.AddQuadUV(0f, 0f, 0f, 1f); waterShore.AddQuadCellData(indices, weights1, weights2); waterShore.AddQuadCellData(indices, weights1, weights2); waterShore.AddQuadCellData(indices, weights1, weights2); waterShore.AddQuadCellData(indices, weights1, weights2); } HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (nextNeighbor != null) { тАж waterShore.AddTriangleUV( тАж ); indices.z = nextNeighbor.Index; waterShore.AddTriangleCellData( indices, weights1, weights2, weights3 ); } 

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

  void TriangulateEstuary ( EdgeVertices e1, EdgeVertices e2, bool incomingRiver, Vector3 indices ) { waterShore.AddTriangle(e2.v1, e1.v2, e1.v1); waterShore.AddTriangle(e2.v5, e1.v5, e1.v4); waterShore.AddTriangleUV( new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 0f) ); waterShore.AddTriangleUV( new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 0f) ); waterShore.AddTriangleCellData(indices, weights2, weights1, weights1); waterShore.AddTriangleCellData(indices, weights2, weights1, weights1); estuaries.AddQuad(e2.v1, e1.v2, e2.v2, e1.v3); estuaries.AddTriangle(e1.v3, e2.v2, e2.v4); estuaries.AddQuad(e1.v3, e1.v4, e2.v4, e2.v5); estuaries.AddQuadUV( new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(0f, 0f) ); estuaries.AddTriangleUV( new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(1f, 1f) ); estuaries.AddQuadUV( new Vector2(0f, 0f), new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(0f, 1f) ); estuaries.AddQuadCellData( indices, weights2, weights1, weights2, weights1 ); estuaries.AddTriangleCellData(indices, weights1, weights2, weights2); estuaries.AddQuadCellData(indices, weights1, weights2); тАж } 

рд╡рд╛рдЯрд░рд╢реЛрд░ рд╢реЗрдбрд░ рдореЗрдВ, рдЖрдкрдХреЛ рддреАрди рд╢реЗрдбреНрд╕ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рд╡рд╛рдЯрд░ рд╢реЗрдбрд░ рдореЗрдВ рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

  #pragma surface surf Standard alpha vertex:vert #pragma target 3.0 #include "Water.cginc" #include "HexCellData.cginc" sampler2D _MainTex; struct Input { float2 uv_MainTex; float3 worldPos; float visibility; }; тАж void vert (inout appdata_full v, out Input data) { UNITY_INITIALIZE_OUTPUT(Input, data); float4 cell0 = GetCellData(v, 0); float4 cell1 = GetCellData(v, 1); float4 cell2 = GetCellData(v, 2); data.visibility = cell0.x * v.color.x + cell1.x * v.color.y + cell2.x * v.color.z; data.visibility = lerp(0.25, 1, data.visibility); } void surf (Input IN, inout SurfaceOutputStandard o) { тАж fixed4 c = saturate(_Color + max(foam, waves)); o.Albedo = c.rgb * IN.visibility; тАж } 

Scheider рдирджреА рдХреЗ рдореБрд╣рд╛рдиреЗ рджреЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдШреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рджреГрд╢реНрдпрддрд╛, рд╕рд╛рде рд╣реА рд╢реЗрдбрд░ рд░реЛрдб рдЬрдирд░рд▓ рд╡рд┐рд╡рд░рдг ред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдирджрд┐рдпреЛрдВ рдХреЗ рдпреВрд╡реА-рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  #include "Water.cginc" #include "HexCellData.cginc" sampler2D _MainTex; struct Input { float2 uv_MainTex; float2 riverUV; float3 worldPos; float visibility; }; half _Glossiness; half _Metallic; fixed4 _Color; void vert (inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); o.riverUV = v.texcoord1.xy; float4 cell0 = GetCellData(v, 0); float4 cell1 = GetCellData(v, 1); o.visibility = cell0.x * v.color.x + cell1.x * v.color.y; o.visibility = lerp(0.25, 1, o.visibility); } void surf (Input IN, inout SurfaceOutputStandard o) { тАж fixed4 c = saturate(_Color + water); o.Albedo = c.rgb * IN.visibility; тАж } 


рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рддрдЯ рдФрд░ рдореБрд╣рд╛рдирд╛ред

рдирджреА


рдирджрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдВрддрд┐рдо рдЬрд▓ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред HexGridChunk.TriangulateRiverQuadрдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рд╡реЗрдХреНрдЯрд░ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдореЗрд╖ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рджреЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦ рд╕рдХреЗред

  void TriangulateRiverQuad ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y, float v, bool reversed, Vector3 indices ) { TriangulateRiverQuad(v1, v2, v3, v4, y, y, v, reversed, indices); } void TriangulateRiverQuad ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y1, float y2, float v, bool reversed, Vector3 indices ) { тАж rivers.AddQuadCellData(indices, weights1, weights2); } 

TriangulateWithRiverBeginOrEndрд╕реЗрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдПрдХ рдХреНрд╡рд╛рдб рдФрд░ рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдирджреА рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реЗрд▓ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗрдВред

  void TriangulateWithRiverBeginOrEnd ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж if (!cell.IsUnderwater) { bool reversed = cell.HasIncomingRiver; Vector3 indices; indices.x = indices.y = indices.z = cell.Index; TriangulateRiverQuad( m.v2, m.v4, e.v2, e.v4, cell.RiverSurfaceY, 0.6f, reversed, indices ); center.y = m.v2.y = m.v4.y = cell.RiverSurfaceY; rivers.AddTriangle(center, m.v2, m.v4); тАж rivers.AddTriangleCellData(indices, weights1); } } 

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрди рд╕реЗрд▓ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдореЗрдВ рд╣реИрдВ TriangulateWithRiver, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдкрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ TriangulateRiverQuadред

  void TriangulateWithRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж if (!cell.IsUnderwater) { bool reversed = cell.IncomingRiver == direction; TriangulateRiverQuad( centerL, centerR, m.v2, m.v4, cell.RiverSurfaceY, 0.4f, reversed, indices ); TriangulateRiverQuad( m.v2, m.v4, e.v2, e.v4, cell.RiverSurfaceY, 0.6f, reversed, indices ); } } 

рд╣рдо рдЙрди рдЭрд░рдиреЛрдВ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдорд░реНрдерди рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдЧрд╣рд░реЗ рдкрд╛рдиреА рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред

  void TriangulateWaterfallInWater ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y1, float y2, float waterY, Vector3 indices ) { тАж rivers.AddQuadCellData(indices, weights1, weights2); } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ TriangulateConnectionрддрд╛рдХрд┐ рдпрд╣ рдирджрд┐рдпреЛрдВ рдФрд░ рдЭрд░рдиреЛрдВ рдХреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рдПред

  void TriangulateConnection ( HexDirection direction, HexCell cell, EdgeVertices e1 ) { тАж if (hasRiver) { e2.v3.y = neighbor.StreamBedY; Vector3 indices; indices.x = indices.z = cell.Index; indices.y = neighbor.Index; if (!cell.IsUnderwater) { if (!neighbor.IsUnderwater) { TriangulateRiverQuad( e1.v2, e1.v4, e2.v2, e2.v4, cell.RiverSurfaceY, neighbor.RiverSurfaceY, 0.8f, cell.HasIncomingRiver && cell.IncomingRiver == direction, indices ); } else if (cell.Elevation > neighbor.WaterLevel) { TriangulateWaterfallInWater( e1.v2, e1.v4, e2.v2, e2.v4, cell.RiverSurfaceY, neighbor.RiverSurfaceY, neighbor.WaterSurfaceY, indices ); } } else if ( !neighbor.IsUnderwater && neighbor.Elevation > cell.WaterLevel ) { TriangulateWaterfallInWater( e2.v4, e2.v2, e1.v4, e1.v2, neighbor.RiverSurfaceY, cell.RiverSurfaceY, cell.WaterSurfaceY, indices ); } } тАж } 

рд░рд┐рд╡рд░ рд╢реИрдбрд░ рдХреЛ рд░реЛрдб рд╢реИрдбрд░ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

  #pragma surface surf Standard alpha vertex:vert #pragma target 3.0 #include "Water.cginc" #include "HexCellData.cginc" sampler2D _MainTex; struct Input { float2 uv_MainTex; float visibility; }; тАж void vert (inout appdata_full v, out Input data) { UNITY_INITIALIZE_OUTPUT(Input, data); float4 cell0 = GetCellData(v, 0); float4 cell1 = GetCellData(v, 1); data.visibility = cell0.x * v.color.x + cell1.x * v.color.y; data.visibility = lerp(0.25, 1, data.visibility); } void surf (Input IN, inout SurfaceOutputStandard o) { float river = River(IN.uv_MainTex, _MainTex); fixed4 c = saturate(_Color + river); o.Albedo = c.rgb * IN.visibility; тАж } 


рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдирджрд┐рдпрд╛рдБред

unitypackage

рд╡рд╕реНрддреБрдУрдВ рдФрд░ рджреГрд╢реНрдпрддрд╛


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

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

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд▓рд╛рдХреГрддрд┐ рдкрд░ рдЧреНрд░рд┐рдб рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдирд▓ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдПрдХ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдмрдирд╛рд╡рдЯ 2 ├Ч 2 рдХреЗ рд╕реЗрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП X рдФрд░ Z рдСрдлрд╕реЗрдЯ рдпреБрдХреНрдд рдмрдирд╛рд╡рдЯ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рд╕реЗрд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕реНрдерд┐рдд рд╣реИрдВред

рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рди рдмрдирд╛рд╡рдЯ рд╣реИред X рдСрдлрд╕реЗрдЯ рдХреЛ рдЙрд╕рдХреЗ рд▓рд╛рд▓ рдЪреИрдирд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ Z рдСрдлрд╕реЗрдЯ рдХреЛ рдЧреНрд░реАрди рдЪреИрдирд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ 2 ├Ч 2 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ 0 рдФрд░ 2 рд╕реЗ рдСрдлрд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд░рдВрдЧреАрди рдЪреИрдирд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдСрдлрд╕реЗрдЯ рдЖрдзреЗ рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдирд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрдирд╛рд╡рдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


рдЧреНрд░рд┐рдб рдХреА рдмрдирд╛рд╡рдЯ рд╕рдордиреНрд╡рдп рдХрд░рддреА рд╣реИред

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


рдмрдирд╛рд╡рдЯ рдЖрдпрд╛рдд рд╡рд┐рдХрд▓реНрдкред

рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рд╢реИрдбрд░


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

 Shader "Custom/Feature" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 [NoTilingOffset] _GridCoordinates ("Grid Coordinates", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Standard fullforwardshadows vertex:vert #pragma target 3.0 #include "../HexCellData.cginc" sampler2D _MainTex, _GridCoordinates; half _Glossiness; half _Metallic; fixed4 _Color; struct Input { float2 uv_MainTex; float visibility; }; void vert (inout appdata_full v, out Input data) { UNITY_INITIALIZE_OUTPUT(Input, data); float3 pos = mul(unity_ObjectToWorld, v.vertex); data.visibility = 1; } void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb * IN.visibility; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } ENDCG } FallBack "Diffuse" } 

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


рдореЗрд╖ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рд╢рд╣рд░реАред

рд╕реЗрд▓ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪреЗрдВ


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

  void vert (inout appdata_full v, out Input data) { UNITY_INITIALIZE_OUTPUT(Input, data); float3 pos = mul(unity_ObjectToWorld, v.vertex); float4 gridUV = float4(pos.xz, 0, 0); data.visibility = 1; } 

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

  float4 gridUV = float4(pos.xz, 0, 0); gridUV.x *= 1 / (4 * 8.66025404); gridUV.y *= 1 / (2 * 15.0); 

рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 2 ├Ч 2 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдХрд┐рд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдорд╛рди рдХреЛ рдиреАрдЪреЗ рд▓реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИред

  float4 gridUV = float4(pos.xz, 0, 0); gridUV.x *= 1 / (4 * 8.66025404); gridUV.y *= 1 / (2 * 15.0); float2 cellDataCoordinates = floor(gridUV.xy); 

рдЙрд╕ рдХрдХреНрд╖ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╣реИрдВ, рд╣рдо рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

  float2 cellDataCoordinates = floor(gridUV.xy) + tex2Dlod(_GridCoordinates, gridUV).rg; 

рдЪреВрдВрдХрд┐ рдЧреНрд░рд┐рдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЖрдХрд╛рд░ рдореЗрдВ 2 ├Ч 2 рд╣реИ, рдФрд░ рдСрдлрд╕реЗрдЯ рдХреЛ рдЖрдзрд╛ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  float2 cellDataCoordinates = floor(gridUV.xy) + tex2Dlod(_GridCoordinates, gridUV).rg; cellDataCoordinates *= 2; 

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

 float4 GetCellData (float2 cellDataCoordinates) { float2 uv = cellDataCoordinates + 0.5; uv.x *= _HexCellData_TexelSize.x; uv.y *= _HexCellData_TexelSize.y; return tex2Dlod(_HexCellData, float4(uv, 0, 0)); } 

рдЕрдм рд╣рдо рд╢реАрд░реНрд╖ рд╢реЗрдбрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рдлрд╝реАрдЪрд░ ред

  cellDataCoordinates *= 2; data.visibility = GetCellData(cellDataCoordinates).x; data.visibility = lerp(0.25, 1, data.visibility); 


рджреГрд╢реНрдпрддрд╛ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдПрдВред

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


рджреГрд╢реНрдпрддрд╛ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реА рджреАрд╡рд╛рд░реЗрдВред

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

unitypackage

рднрд╛рдЧ 21: рдорд╛рдирдЪрд┐рддреНрд░ рдЕрдиреБрд╕рдВрдзрд╛рди


  • рд╣рдо рд╕рдВрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╕рдм рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  • рд╣рдо рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВред
  • рд╣рдо рд╡рд╣реА рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рднреА рдЕрдЬреНрдЮрд╛рдд рд╣реИред
  • рд╣рдо рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рдмреЗрд░реЛрдЬрд╝рдЧрд╛рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВред

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


рд╣рдо рджреБрдирд┐рдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред

рд╕рдореНрдкреВрд░реНрдг рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╕рдВрдкрд╛рджрди рдореЛрдб рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ


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

рджреГрд╢реНрдпрддрд╛ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ


рд╣рдо рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╢реЗрдбрд░реНрд╕ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреГрд╢реНрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЧреНрд░рд┐рдб рдкрд░ рдУрд╡рд░рд▓реЗ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдВрдкрд╛рджрди рдореЛрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП HEX_MAP_EDIT_MODE рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЪреВрдБрдХрд┐ рдХрдИ shaders рдХреЛ рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЛрдВ Shader.EnableKeyWordрдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ Shader.DisableKeywordред рд╣рдо HexGameUI.SetEditModeрд╕рдВрдкрд╛рджрди рдореЛрдб рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рдЙрдЪрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ ред

  public void SetEditMode (bool toggle) { enabled = !toggle; grid.ShowUI(!toggle); grid.ClearPath(); if (toggle) { Shader.EnableKeyword("HEX_MAP_EDIT_MODE"); } else { Shader.DisableKeyword("HEX_MAP_EDIT_MODE"); } } 

рдореЛрдб рд╢реЗрдб рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ


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

 sampler2D _HexCellData; float4 _HexCellData_TexelSize; float4 FilterCellData (float4 data) { #if defined(HEX_MAP_EDIT_MODE) data.x = 1; #endif return data; } 

рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, GetCellDataрдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛрдиреЛрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо ред

 float4 GetCellData (appdata_full v, int index) { тАж return FilterCellData(data); } float4 GetCellData (float2 cellDataCoordinates) { тАж return FilterCellData(tex2Dlod(_HexCellData, float4(uv, 0, 0))); } 

рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП, HEX_MAP_EDIT_MODE рдХреАрд╡рд░реНрдб рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╢реЗрдбреНрд╕ рдХреЛ рдмрд╣реБ_ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред рдЯрд╛рд░рдЧреЗрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд┐рд╡ рдФрд░ рдкрд╣рд▓реЗ рд╢рд╛рдорд┐рд▓ рдбрд╛рдпрд░реЗрдХреНрд╢рди рдХреЗ рдмреАрдЪ , рд╢реЗрдбреНрд╕ рдПрд╕реНрддреЗрд░ , рдлрд╝реАрдЪрд░ , рд░рд┐рд╡рд░ , рд░реЛрдб , рдЯреЗрд░реЗрди , рд╡рд╛рдЯрд░ рдФрд░ рд╡реЙрдЯрд░ рд╢реЛрд░ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ ред

  #pragma multi_compile _ HEX_MAP_EDIT_MODE 

рдЕрдм, рдЬрдм рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрди рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдпреБрджреНрдз рдХрд╛ рдХреЛрд╣рд░рд╛ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

unitypackage

рдХреЛрд╢рд┐рдХрд╛ рдЕрдиреБрд╕рдВрдзрд╛рди


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

рдЯреНрд░реИрдХрд┐рдВрдЧ рдЕрдзреНрдпрдпрди рдХреА рд╕реНрдерд┐рддрд┐


рдкрдврд╝рд╛рдИ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо HexCellрд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ IsExploredред

  public bool IsExplored { get; set; } 

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

  public bool IsExplored { get; private set; } 

рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рд╕реЗрд▓ рдХреА рджреГрд╢реНрдпрддрд╛ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕реЗрд▓ рдХреЛ рдЬрд╛рдВрдЪ рдорд╛рдирд╛ рдЬрд╛рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП IsExploredрдПрдХ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП trueред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рд╕реЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдЬрдм рджреГрд╢реНрдпрддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред 1. рдпрд╣ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП RefreshVisibilityред

  public void IncreaseVisibility () { visibility += 1; if (visibility == 1) { IsExplored = true; ShaderData.RefreshVisibility(this); } } 

рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╕рдВрдзрд╛рди рдХреА рд╕реНрдерд┐рддрд┐


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

  public void RefreshVisibility (HexCell cell) { int index = cell.Index; cellTextureData[index].r = cell.IsVisible ? (byte)255 : (byte)0; cellTextureData[index].g = cell.IsExplored ? (byte)255 : (byte)0; enabled = true; } 

рдХрд╛рд▓реА рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рд░рд╛рд╣рдд


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

 float4 FilterCellData (float4 data) { #if defined(HEX_MAP_EDIT_MODE) data.xy = 1; #endif return data; } 

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

  struct Input { float4 color : COLOR; float3 worldPos; float3 terrain; float4 visibility; }; 

рдЕрдм, рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдЬрдм рд╣рдо рджреГрд╢реНрдпрддрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП data.visibility.xyzред

  void vert (inout appdata_full v, out Input data) { тАж data.visibility.xyz = lerp(0.25, 1, data.visibility.xyz); } 

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдзреНрдпрдпрди рдХреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ data.visibility.wред рдпрд╣ рдЕрдиреНрдп рд╢реЗрдбреНрд╕ рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдШрдЯрдХ Y рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

  data.visibility.xyz = lerp(0.25, 1, data.visibility.xyz); data.visibility.w = cell0.y * v.color.x + cell1.y * v.color.y + cell2.y * v.color.z; 

рд╢реЛрдз рдХреА рд╕реНрдерд┐рддрд┐ рдЕрдм рдЦрдВрдб рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ IN.visibility.wред рдЕрд▓реНрдмреЗрдбреЛ рдХреА рдЧрдгрдирд╛ рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

  void surf (Input IN, inout SurfaceOutputStandard o) { тАж float explored = IN.visibility.w; o.Albedo = c.rgb * grid * _Color * explored; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } 


рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рд╕реНрдерд▓рд╛рдХреГрддрд┐ рдЕрдм рдХрд╛рд▓реА рд╣реИред

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

рдмрдЪрдд рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рдЕрдиреБрд╕рдВрдзрд╛рди рдХреА рд╕реНрдерд┐рддрд┐


рдЕрдм рдЬрдм рд╣рдордиреЗ рдЕрдиреБрд╕рдВрдзрд╛рди рд╕рд╣рд╛рдпрддрд╛ рдЬреЛрдбрд╝ рджреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдирдХреНрд╢реЗ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рдФрд░ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдЕрдиреБрд╕рдВрдзрд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдореИрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 3 рддрдХ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ SaveLoadMenuрдирд┐рд░рдВрддрд░ рдЬреЛрдбрд╝реЗрдВ ред

  const int mapFileVersion = 3; 

рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд┐рдЦрддреЗ Saveрд╕рдордп рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╕рдорд░реНрдерди рдХреЛ рдЪреЗрдХ рдХрд░рддреЗ рд╕рдордп рд╣рдо рдЗрд╕ рдирд┐рд░рдВрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ Loadред

  void Save (string path) { using ( BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create)) ) { writer.Write(mapFileVersion); hexGrid.Save(writer); } } void Load (string path) { if (!File.Exists(path)) { Debug.LogError("File does not exist " + path); return; } using (BinaryReader reader = new BinaryReader(File.OpenRead(path))) { int header = reader.ReadInt32(); if (header <= mapFileVersion) { hexGrid.Load(reader, header); HexMapCamera.ValidatePosition(); } else { Debug.LogWarning("Unknown map format " + header); } } } 

рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, HexCell.Saveрд╣рдо рдЕрдзреНрдпрдпрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВред

  public void Save (BinaryWriter writer) { тАж writer.Write(IsExplored); } 

рдФрд░ рд╣рдо рдЗрд╕реЗ рдЕрдВрдд рдореЗрдВ рдкрдврд╝реЗрдВрдЧреЗ Loadред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо RefreshVisibilityрдЕрдзреНрдпрдпрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВред

  public void Load (BinaryReader reader) { тАж IsExplored = reader.ReadBoolean(); ShaderData.RefreshVisibility(this); } 

рдкреБрд░рд╛рдиреА рд╕реЗрд╡ рдлрд╛рдЗрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдмреИрдХрд╡рд░реНрдб рдХрдореНрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реЗрд╡ рд╕реНрдЯреЗрдЯ рдХреЛ рдкрдврд╝рдирд╛ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдлрд╛рдЗрд▓ рд╡рд░реНрдЬрди 3 рд╕реЗ рдХрдо рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕реЗрд▓ рдореЗрдВ рд╕реНрдЯреЗрдЯ "рдЕрдирдПрдХреНрд╕рдкреНрд▓реЗрдпрд░реНрдб" рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ Loadрд╣реЗрдбрд░ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ ред

  public void Load (BinaryReader reader, int header) { тАж IsExplored = header >= 3 ? reader.ReadBoolean() : false; ShaderData.RefreshVisibility(this); } 

рдЕрдм HexGrid.LoadрдЗрд╕реЗ HexCell.Loadрд╣реЗрдбрд░ рдбреЗрдЯрд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред

  public void Load (BinaryReader reader, int header) { тАж for (int i = 0; i < cells.Length; i++) { cells[i].Load(reader, header); } тАж } 

рдЕрдм, рдирдХреНрд╢реЗ рд╕рд╣реЗрдЬрддреЗ рдФрд░ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

unitypackage

рдЕрдЬреНрдЮрд╛рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЫрд┐рдкрд╛рдПрдВ


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

рдЬрд┐рд╕рд╕реЗ рд░рд╛рд╣рдд рд╡рд╛рдХрдИ рдореЗрдВ рдХрд╛рд▓реА рд╣реЛ рдЬрд╛рдП


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

рд░рдВрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреА рдЬрдЧрд╣ _Metallic рд╕рдВрдкрддреНрддрд┐ рдкрд░ _Specular ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЗрд╕рдХрд╛ рд░рдВрдЧ рдорд╛рди (0.2, 0.2, 0.2) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП рд╣рдо рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдзрд╛рддреБрдИ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛ред

  Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Terrain Texture Array", 2DArray) = "white" {} _GridTex ("Grid Texture", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 // _Metallic ("Metallic", Range(0,1)) = 0.0 _Specular ("Specular", Color) = (0.2, 0.2, 0.2) } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдВрдмрдВрдзрд┐рдд shader рдЪрд░ рдмрджрд▓реЗрдВред рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рд╕рд░рдлреЗрд╕ рд╢реЗрдбреНрд╕ рдХреЗ рд░рдВрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ fixed3, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

  half _Glossiness; // half _Metallic; fixed3 _Specular; fixed4 _Color; 

рд╕рд╛рде pragma рд╕рддрд╣ рд╕рд░реНрдл рдмрджрд▓реЗрдВ рд╕реНрдЯреИрдВрдбрд░реНрдб рдкрд░ StandardSpecular ред рдпрд╣ рдпреВрдирд┐рдЯреА рдХреЛ рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реЗрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ред

  #pragma surface surf StandardSpecular fullforwardshadows vertex:vert 

рдЕрдм рдлрд╝рдВрдХреНрд╢рди surfрдХреЛ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ SurfaceOutputStandardSpecularред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм рдЖрдкрдХреЛ рдореВрд▓реНрдп рдирд╣реАрдВ o.Metallic, рдмрд▓реНрдХрд┐ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ o.Specularред

  void surf (Input IN, inout SurfaceOutputStandardSpecular o) { тАж float explored = IN.visibility.w; o.Albedo = c.rgb * grid * _Color * explored; // o.Metallic = _Metallic; o.Specular = _Specular; o.Smoothness = _Glossiness; o.Alpha = ca; } 

рдЕрдм рд╣рдо exploredрд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рд░рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдХреЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯреНрд╕ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

  o.Specular = _Specular * explored; 


рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреЗ рдмрд┐рдирд╛ рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдЗрд▓рд╛рдХрд╛ред

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

рд╕рддрд╣реЗрдВ рджрд░реНрдкрдг рдХреНрдпреЛрдВ рдмрди рдЬрд╛рддреА рд╣реИрдВ?
. . Rendering .


рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдХреНрд╖реЗрддреНрд░ рдЕрднреА рднреА рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред

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

  float explored = IN.visibility.w; o.Albedo = c.rgb * grid * _Color * explored; o.Specular = _Specular * explored; o.Smoothness = _Glossiness; o.Occlusion = explored; o.Alpha = ca; 


рдмрд┐рдирд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрддред

рдореИрдЪрд┐рдВрдЧ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб


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

  Properties { тАж _BackgroundColor ("Background Color", Color) = (0,0,0) } тАж half _Glossiness; fixed3 _Specular; fixed4 _Color; half3 _BackgroundColor; 

рдЗрд╕ рд░рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдпрд╣ o.EmissionрдПрдХ рдорд╛рдЗрдирд╕ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреЗ рдЧрдП рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХрд▓рд░ рд╡реИрд▓реНрдпреВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  o.Occlusion = explored; o.Emission = _BackgroundColor * (1 - explored); 

рдЪреВрдВрдХрд┐ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдХрд╛рдИрдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рджреГрд╢реНрдп рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдереЛрдбрд╝рд╛ рд▓рд╛рд▓ рд░рдВрдЧ рдХрд╛ рдЧреНрд░реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд░рдВрдЧ рд╣реЛрдЧрд╛ред рд░рд╛рд╣рдд рд╕рд╛рдордЧреНрд░реА рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рд╣реЗрдХреНрд╕ рдХрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб 68615BFF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред


рдЧреНрд░реЗ рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рд░рд╛рд╣рдд рд╕рд╛рдордЧреНрд░реАред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╣реБрдд рдХрдордЬреЛрд░ рд╕рд┐рд▓реНрд╣реВрдЯ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред рддрд╛рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдЙрдиреНрд╣реЗрдВ рджреЗрдЦ рди рд╕рдХреЗ, рдЖрдк рдЖрдХрд╛рд╢ рдХреЗ рдмрдЬрд╛рдП рдХреИрдорд░реЗ рдХреЛ 68615BFF рдХреА рдПрдХ рд╕рдорд╛рди рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдПрдХ рд╕рдорд╛рди рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдХреИрдорд░рд╛ред

рд╕реНрдХрд╛рдИрдмреЙрдХреНрд╕ рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛?
, , environmental lighting . , .

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


рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдЕрдм рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдПрдХ рд╕рдорд╛рди рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
, , . . , . , , , UV- .

рд░рд╛рд╣рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫрд┐рдкрд╛рдПрдВ


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рд░рд╛рд╣рдд рдХреА рдЬрд╛рд▓реА рд╣реИред рдЕрдзреНрдпрдпрди рдХреА рдмрд╛рдХреА рд╕реНрдерд┐рддрд┐ рдЕрднреА рддрдХ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реБрдИ рд╣реИред


рдЕрднреА рддрдХ рдХреЗрд╡рд▓ рд░рд╛рд╣рдд рдЫрд┐рдкреА рд╣реИред

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

  Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 // _Metallic ("Metallic", Range(0,1)) = 0.0 _Specular ("Specular", Color) = (0.2, 0.2, 0.2) _BackgroundColor ("Background Color", Color) = (0,0,0) [NoScaleOffset] _GridCoordinates ("Grid Coordinates", 2D) = "white" {} } 

рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдЖрдЧреЗ рдХреА рд╕рддрд╣ рдФрд░ рдЪрд░ред

  #pragma surface surf StandardSpecular fullforwardshadows vertex:vert тАж half _Glossiness; // half _Metallic; fixed3 _Specular; fixed4 _Color; half3 _BackgroundColor; 

visibilityрдПрдХ рдФрд░ рдШрдЯрдХ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдлрд╝реАрдЪрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдлреНрд▓реЛрдЯ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЕрдм рд╣рдореЗрдВ рджреЛ рдЪрд╛рд╣рд┐рдПред

  struct Input { float2 uv_MainTex; float2 visibility; }; 

рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ vertрддрд╛рдХрд┐ рдпрд╣ рджреГрд╢реНрдпрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рд╣реЛ data.visibility.x, рдФрд░ рдлрд┐рд░ data.visibility.yрдЕрдзреНрдпрдпрди рдбреЗрдЯрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ ред

  void vert (inout appdata_full v, out Input data) { тАж float4 cellData = GetCellData(cellDataCoordinates); data.visibility.x = cellData.x; data.visibility.x = lerp(0.25, 1, data.visibility.x); data.visibility.y = cellData.y; } 

рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ surfрддрд╛рдХрд┐ рдпрд╣ рдЯреЗрд░реЗрди рдХреА рддрд░рд╣ рдирдП рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗ ред

  void surf (Input IN, inout SurfaceOutputStandardSpecular o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; float explored = IN.visibility.y; o.Albedo = c.rgb * (IN.visibility.x * explored); // o.Metallic = _Metallic; o.Specular = _Specular * explored; o.Smoothness = _Glossiness; o.Occlusion = explored; o.Emission = _BackgroundColor * (1 - explored); o.Alpha = ca; } 


рдЫрд┐рдкреА рд╣реБрдИ рд░рд╛рд╣рдд рдХреА рд╡рд╕реНрддреБред

рдкрд╛рдиреА рдЫрд┐рдкрд╛рдУ


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

рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рдж, visibilityрдПрдХ рдФрд░ рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕реЗ рдмрджрд▓реЗрдВ vertред рджреЛрдиреЛрдВ рд╢реЗрдб рддреАрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВред

  struct Input { тАж float2 visibility; }; тАж void vert (inout appdata_full v, out Input data) { тАж data.visibility.x = cell0.x * v.color.x + cell1.x * v.color.y + cell2.x * v.color.z; data.visibility.x = lerp(0.25, 1, data.visibility.x); data.visibility.y = cell0.y * v.color.x + cell1.y * v.color.y + cell2.y * v.color.z; } 

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

  void surf (Input IN, inout SurfaceOutputStandardSpecular o) { тАж float explored = IN.visibility.y; o.Albedo = c.rgb * IN.visibility.x; o.Specular = _Specular * explored; o.Smoothness = _Glossiness; o.Occlusion = explored; o.Alpha = ca * explored; } 


рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рдиреАред

рд╣рдо рдирджрд┐рдпреЛрдВ, рдирджрд┐рдпреЛрдВ рдФрд░ рд╕рдбрд╝рдХреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ


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

  struct Input { тАж float2 visibility; }; тАж void vert (inout appdata_full v, out Input data) { тАж data.visibility.x = cell0.x * v.color.x + cell1.x * v.color.y; data.visibility.x = lerp(0.25, 1, data.visibility.x); data.visibility.y = cell0.y * v.color.x + cell1.y * v.color.y; } 

рдЗрд╕реНрдЯреНрдпреВрд░реА рдФрд░ рд░рд┐рд╡рд░surf рд╢реЗрдбреНрд╕ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдирдП рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред рджреЛрдиреЛрдВ рдХреЛ рд╕рдорд╛рди рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

  void surf (Input IN, inout SurfaceOutputStandardSpecular o) { тАж float explored = IN.visibility.y; fixed4 c = saturate(_Color + water); o.Albedo = c.rgb * IN.visibility.x; o.Specular = _Specular * explored; o.Smoothness = _Glossiness; o.Occlusion = explored; o.Alpha = ca * explored; } 

Shader рд░реЛрдб рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдореНрдорд┐рд╢реНрд░рдг рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  void surf (Input IN, inout SurfaceOutputStandardSpecular o) { float4 noise = tex2D(_MainTex, IN.worldPos.xz * 0.025); fixed4 c = _Color * ((noise.y * 0.75 + 0.25) * IN.visibility.x); float blend = IN.uv_MainTex.x; blend *= noise.x + 0.5; blend = smoothstep(0.4, 0.7, blend); float explored = IN.visibility.y; o.Albedo = c.rgb; o.Specular = _Specular * explored; o.Smoothness = _Glossiness; o.Occlusion = explored; o.Alpha = blend * explored; } 


рд╕рдм рдЫрд┐рдкрд╛ рд╣реИред

unitypackage

рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдмрдЪрдирд╛


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


рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВред

рд╕реНрдХреНрд╡рд╛рдб рдЪрд▓рддреА рдХреА рд▓рд╛рдЧрдд рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЪрд▓реЛ рд╕реЗ рдЬрд╛рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ HexGridрдХрд░реЗрдВ HexUnitред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдЖрдВрджреЛрд▓рди рдирд┐рдпрдореЛрдВ рд╡рд╛рд▓реА рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред рдЪрд▓рддреА рдХреА рд▓рд╛рдЧрдд рдирд┐рд░реНрдзрд╛рд░рд┐рдд

рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HexUnitрд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ GetMoveCostред рдЙрд╕реЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдЙрдирдХреЗ рдмреАрдЪ рдЪрд▓рддреА рд╣реИрдВ, рд╕рд╛рде рд╣реА рджрд┐рд╢рд╛ рднреАред рд╣рдо HexGrid.SearchрдЗрд╕ рдкрджреНрдзрддрд┐ рд╕реЗ рдЬрд╛рдиреЗ рдХреА рд▓рд╛рдЧрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдирд╛рдореЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред

  public int GetMoveCost ( HexCell fromCell, HexCell toCell, HexDirection direction) { HexEdgeType edgeType = fromCell.GetEdgeType(toCell); if (edgeType == HexEdgeType.Cliff) { continue; } int moveCost; if (fromCell.HasRoadThroughEdge(direction)) { moveCost = 1; } else if (fromCell.Walled != toCell.Walled) { continue; } else { moveCost = edgeType == HexEdgeType.Flat ? 5 : 10; moveCost += toCell.UrbanLevel + toCell.FarmLevel + toCell.PlantLevel; } } 

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

  public int GetMoveCost ( HexCell fromCell, HexCell toCell, HexDirection direction) { HexEdgeType edgeType = fromCell.GetEdgeType(toCell); if (edgeType == HexEdgeType.Cliff) { return -1; } int moveCost; if (fromCell.HasRoadThroughEdge(direction)) { moveCost = 1; } else if (fromCell.Walled != toCell.Walled) { return -1; } else { moveCost = edgeType == HexEdgeType.Flat ? 5 : 10; moveCost += toCell.UrbanLevel + toCell.FarmLevel + toCell.PlantLevel; } return moveCost; } 

рдЕрдм рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд░рд╛рд╕реНрддрд╛ рдвреВрдВрдврддреЗ рд╕рдордп, рди рдХреЗрд╡рд▓ рдЧрддрд┐, рдмрд▓реНрдХрд┐ рдЪрдпрдирд┐рдд рдЗрдХрд╛рдИ рднреАред рдЙрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓рд┐рдП HexGameUI.DoPathFindingред

  void DoPathfinding () { if (UpdateCurrentCell()) { if (currentCell && selectedUnit.IsValidDestination(currentCell)) { grid.FindPath(selectedUnit.Location, currentCell, selectedUnit); } else { grid.ClearPath(); } } } 

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

  public int Speed { get { return 24; } } 

HexGridрдкрд░рд┐рд╡рд░реНрддрди FindPath, рдФрд░ SearchрдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╣рдорд╛рд░реЗ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  public void FindPath (HexCell fromCell, HexCell toCell, HexUnit unit) { ClearPath(); currentPathFrom = fromCell; currentPathTo = toCell; currentPathExists = Search(fromCell, toCell, unit); ShowPath(unit.Speed); } bool Search (HexCell fromCell, HexCell toCell, HexUnit unit) { int speed = unit.Speed; тАж } 

рдЕрдм рд╣рдо SearchрдкреБрд░рд╛рдиреЗ рдХреЛрдб рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдЧрд▓реЗ рд╕реЗрд▓ рдореЗрдВ рдЬрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреНрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдлреЛрди рдХрд░реЗрдВрдЧреЗ HexUnit.IsValidDestinationрдФрд░ HexUnit.GetMoveCostред рдЕрдЧрд░ рд╕реЗрд▓рд┐рдВрдЧ рдХреА рд▓рд╛рдЧрдд рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рд╣рдо рд╕реЗрд▓ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред

  for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = current.GetNeighbor(d); if ( neighbor == null || neighbor.SearchPhase > searchFrontierPhase ) { continue; } // if (neighbor.IsUnderwater || neighbor.Unit) { // continue; // } // HexEdgeType edgeType = current.GetEdgeType(neighbor); // if (edgeType == HexEdgeType.Cliff) { // continue; // } // int moveCost; // if (current.HasRoadThroughEdge(d)) { // moveCost = 1; // } // else if (current.Walled != neighbor.Walled) { // continue; // } // else { // moveCost = edgeType == HexEdgeType.Flat ? 5 : 10; // moveCost += neighbor.UrbanLevel + neighbor.FarmLevel + // neighbor.PlantLevel; // } if (!unit.IsValidDestination(neighbor)) { continue; } int moveCost = unit.GetMoveCost(current, neighbor, d); if (moveCost < 0) { continue; } int distance = current.Distance + moveCost; int turn = (distance - 1) / speed; if (turn > currentTurn) { distance = turn * speed + moveCost; } тАж } 

рдЧреИрд░-рдЕрдзрд┐рдХреГрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░реЗрдВ


рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рд╣рдо HexUnit.IsValidDestinationрдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рд╣реИред

  public bool IsValidDestination (HexCell cell) { return cell.IsExplored && !cell.IsUnderwater && !cell.Unit; } 


рдЕрдзрд┐рдХ рдЗрдХрд╛рдЗрдпрд╛рдВ рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреАред

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

рдпрджрд┐ рдЪрд╛рд▓ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдЫреЛрдЯрд╛ рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
. , . .

, , . , .

unitypackage

рднрд╛рдЧ 22: рдмрдврд╝реА рд╣реБрдИ рджреГрд╢реНрдпрддрд╛


  • рджреГрд╢реНрдпрддрд╛ рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрджрд▓реЗрдВред
  • рдЧреБрдВрдЬрд╛рдЗрд╢ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдХреА рдКрдВрдЪрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • рдирдХреНрд╢реЗ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдЫрд┐рдкрд╛рдПрдБред

рдорд╛рдирдЪрд┐рддреНрд░ рдЕрдиреНрд╡реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдХрд░, рд╣рдо рд╕рдВрдЧрдгрдирд╛ рдФрд░ рдЧреБрдВрдЬрд╛рдЗрд╢ рдмрджрд▓рд╛рд╡реЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗред


рдЖрдЧреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рдЪрдврд╝реЗрдВред

рджреГрд╢реНрдпрддрд╛ рдкрд░рд┐рд╡рд░реНрддрди


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

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

  public bool ImmediateMode { get; set; } 

рд╕рдВрдХреНрд░рдордг рд╕реЗрд▓ рдЯреНрд░реИрдХрд┐рдВрдЧ


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

 using System.Collections.Generic; using UnityEngine; public class HexCellShaderData : MonoBehaviour { Texture2D cellTexture; Color32[] cellTextureData; List<HexCell> transitioningCells = new List<HexCell>(); public bool ImmediateMode { get; set; } public void Initialize (int x, int z) { тАж transitioningCells.Clear(); enabled = true; } тАж } 

рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо RefreshVisibilityрд╕реАрдзреЗ рд╕реЗрд▓ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рддрддреНрдХрд╛рд▓ рд╕рдВрдХреНрд░рдордг рдореЛрдб рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╕реЗрд▓ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

  public void RefreshVisibility (HexCell cell) { int index = cell.Index; if (ImmediateMode) { cellTextureData[index].r = cell.IsVisible ? (byte)255 : (byte)0; cellTextureData[index].g = cell.IsExplored ? (byte)255 : (byte)0; } else { transitioningCells.Add(cell); } enabled = true; } 

рджреГрд╢реНрдпрддрд╛ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реВрдЪреА рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд▓реВрдк рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк


рдЗрд╕реА рдорд╛рдиреЛрдВ рдХреЛ рддреБрд░рдВрдд 255 рдпрд╛ 0 рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдврд╝рд╛рдПрдВрдЧреЗ / рдШрдЯрд╛рдПрдВрдЧреЗред рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЪрд┐рдХрдирд╛рдИ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рджрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдпрд╣ рдмрд╣реБрдд рддреЗрдЬ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмрд╣реБрдд рдзреАрдорд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реБрдВрджрд░ рдмрджрд▓рд╛рд╡ рдФрд░ рдЦреЗрд▓ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рднреАрддрд░ рдмрджрд▓рдирд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред

  const float transitionSpeed = 255f; 

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреЛрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рд╣реИред

  void LateUpdate () { int delta = (int)(Time.deltaTime * transitionSpeed); cellTexture.SetPixels32(cellTextureData); cellTexture.Apply(); enabled = transitioningCells.Count > 0; } 

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

  int delta = (int)(Time.deltaTime * transitionSpeed); if (delta == 0) { delta = 1; } 

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

  int delta = (int)(Time.deltaTime * transitionSpeed); if (delta == 0) { delta = 1; } for (int i = 0; i < transitioningCells.Count; i++) { UpdateCellData(transitioningCells[i], delta); } 

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

  for (int i = 0; i < transitioningCells.Count; i++) { if (!UpdateCellData(transitioningCells[i], delta)) { transitioningCells.RemoveAt(i--); } } 

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

  if (!UpdateCellData(transitioningCells[i], delta)) { transitioningCells[i--] = transitioningCells[transitioningCells.Count - 1]; transitioningCells.RemoveAt(transitioningCells.Count - 1); } 

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

  bool UpdateCellData (HexCell cell, int delta) { int index = cell.Index; Color32 data = cellTextureData[index]; bool stillUpdating = false; cellTextureData[index] = data; return stillUpdating; } 

рд╕реЗрд▓ рдбреЗрдЯрд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реЗрд▓ рд╣реИ рдЬреЛ рд╕рдВрдХреНрд░рдордг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИ рдпрд╛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкреВрд░рд╛ рдХрд░ рдЪреБрдХрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реЗрд▓ рдЬрд╛рдВрдЪ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдпрджрд┐ рдХреЛрд╢рд┐рдХрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЬреА рдореВрд▓реНрдп 255 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрдХреНрд░рдордг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдкрд░ рдирдЬрд░ рд░рдЦреЗрдВрдЧреЗред

  bool stillUpdating = false; if (cell.IsExplored && data.g < 255) { stillUpdating = true; } cellTextureData[index] = data; 

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

  if (cell.IsExplored && data.g < 255) { stillUpdating = true; int t = data.g + delta; data.g = (byte)t; } 

рд▓реЗрдХрд┐рди рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдорд╛рди 255 рд╕реЗ рдЕрдзрд┐рдХ рди рд╣реЛред

  int t = data.g + delta; data.g = t >= 255 ? (byte)255 : (byte)t; 

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрд░ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

  if (cell.IsExplored && data.g < 255) { тАж } if (cell.IsVisible && data.r < 255) { stillUpdating = true; int t = data.r + delta; data.r = t >= 255 ? (byte)255 : (byte)t; } 

рдЪреВрдВрдХрд┐ рд╕реЗрд▓ рдлрд┐рд░ рд╕реЗ рдЕрджреГрд╢реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХрдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╕реЗрд▓ рдЕрджреГрд╢реНрдп рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд░ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред

  if (cell.IsVisible) { if (data.r < 255) { stillUpdating = true; int t = data.r + delta; data.r = t >= 255 ? (byte)255 : (byte)t; } } else if (data.r > 0) { stillUpdating = true; int t = data.r - delta; data.r = t < 0 ? (byte)0 : (byte)t; } 

рдЕрдм рдпрд╣ UpdateCellDataрддреИрдпрд╛рд░ рдФрд░ рджреГрд╢реНрдпрддрд╛ рд╕рдВрдХреНрд░рдордг рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рджреГрд╢реНрдпрддрд╛ рдкрд░рд┐рд╡рд░реНрддрдиред

рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрдХреНрд░рдордг рддрддреНрд╡реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛


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

рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рддрддреНрд╡реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕реЗрд▓ рд╕рдВрдХреНрд░рдордг рдХреЛ рдкреНрд░рддрд┐ рдлреНрд░реЗрдо рдХрдИ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рддреЗрдЬреА рд╕реЗ рд╕рдВрдХреНрд░рдордг рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рд╣реЛрддрд╛ рд╣реИред рд╣рдо рд╕реЗрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдБрдЪ рдХрд░рдХреЗ рдЗрд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реВрдЪреА рдореЗрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рд░ рдХреЙрд▓ рдкрд░ рдПрдХ рд╕реВрдЪреА рдЦреЛрдЬRefreshVisibilityрдорд╣рдВрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рдХрдИ рд╕реЗрд▓ рд╕рдВрдХреНрд░рдордг рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЪрд▓рд┐рдП рдПрдХ рдФрд░ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реЗрд▓ рд╕рдВрдХреНрд░рдордг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди B. рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╕реЗрд▓ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рд╣рдо рдЗрд╕реЗ рдорд╛рди 255 рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХреЗрд╡рд▓ рдЙрди рд╕реЗрд▓ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдЬрд┐рдирдХрд╛ рдорд╛рди 255 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред

  public void RefreshVisibility (HexCell cell) { int index = cell.Index; if (ImmediateMode) { cellTextureData[index].r = cell.IsVisible ? (byte)255 : (byte)0; cellTextureData[index].g = cell.IsExplored ? (byte)255 : (byte)0; } else if (cellTextureData[index].b != 255) { cellTextureData[index].b = 255; transitioningCells.Add(cell); } enabled = true; } 

рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реЗрд▓ рд╕рдВрдХреНрд░рдордг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж B рдХрд╛ рдорд╛рди рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

  bool UpdateCellData (HexCell cell, int delta) { тАж if (!stillUpdating) { data.b = 0; } cellTextureData[index] = data; return stillUpdating; } 


рдирдХрд▓ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХреНрд░рдордгред

рддреБрд░рдВрдд рджреГрд╢реНрдпрддрд╛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ


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

  public void Load (BinaryReader reader, int header) { тАж cellShaderData.ImmediateMode = true; for (int i = 0; i < cells.Length; i++) { cells[i].Load(reader, header); } тАж } 

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

  public void Load (BinaryReader reader, int header) { тАж bool originalImmediateMode = cellShaderData.ImmediateMode; cellShaderData.ImmediateMode = true; тАж cellShaderData.ImmediateMode = originalImmediateMode; } 

unitypackage

рдКрдВрдЪрд╛рдИ-рдирд┐рд░реНрднрд░ рдЧреБрдВрдЬрд╛рдЗрд╢


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

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


рдХреНрд╖рд┐рддрд┐рдЬ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдКрдВрдЪрд╛рдИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

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

рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдКрдВрдЪрд╛рдИ


рджрд╛рдпрд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдКрдВрдЪрд╛рдИ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдКрдВрдЪрд╛рдИ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЬрдореАрди рдХреА рд╕реЗрд▓ рдпрд╛ рдкрд╛рдиреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╛рдиреА рдХреА рд╕рд╛рдорд╛рдиреНрдп рдКрдВрдЪрд╛рдИ рдпрд╛ рд╕реНрддрд░ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рдЗрд╕реЗ HexCellрд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ ред

  public int ViewElevation { get { return elevation >= waterLevel ? elevation : waterLevel; } } 

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдКрдВрдЪрд╛рдИ рдЧреБрдВрдЬрд╛рдЗрд╢ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ, рддреЛ рд╕реЗрд▓ рдХреА рджреЗрдЦрдиреЗ рдХреА рдКрдВрдЪрд╛рдИ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде, рджреГрд╢реНрдпрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рднреА рдмрджрд▓ рд╕рдХрддреА рд╣реИред рдЪреВрдВрдХрд┐ рд╕реЗрд▓ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдЕрдм рдХрдИ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реЗрд▓ рд╕реНрд╡рдпрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рд╕реВрдЪрдирд╛ рджреЗрдВ HexCellShaderDataред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ HexCellShaderDataрдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХрд╛ рд╣реИ ViewElevationChangedред HexCell.Elevationрдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░ рдХрд╣реЗрдВрдЧреЗ ред

  public int Elevation { get { return elevation; } set { if (elevation == value) { return; } int originalViewElevation = ViewElevation; elevation = value; if (ViewElevation != originalViewElevation) { ShaderData.ViewElevationChanged(); } тАж } } 

рдЙрд╕реА рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ WaterLevelред

  public int WaterLevel { get { return waterLevel; } set { if (waterLevel == value) { return; } int originalViewElevation = ViewElevation; waterLevel = value; if (ViewElevation != originalViewElevation) { ShaderData.ViewElevationChanged(); } ValidateRivers(); Refresh(); } } 

рджреГрд╢реНрдпрддрд╛ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ


рдЕрдм рд╣рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ HexCellShaderData.ViewElevationChangedред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдпрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреИрд╕реЗ рдмрджрд▓рддреА рд╣реИ, рдПрдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдп рд╣реИ, рд╡рд┐рд╢реЗрд╖рдХрд░ рдЬрдм рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрджрд▓рдирд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХрд┐рд╕реА рднреА рдЪрд╛рд▓ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╕ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреВрд▓рд┐рдпрди рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВред рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдЗрд╕реЗ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдШрдЯрдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВрдЧреЗред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛ рдПрдХ рд╕рд╛рде рдмрджрд▓ рдЧрдИ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж рдпрд╣ рдПрдХрд▓ рд░реАрд╕реЗрдЯ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред

  bool needsVisibilityReset; тАж public void ViewElevationChanged () { needsVisibilityReset = true; enabled = true; } 

рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рджреГрд╢реНрдпрдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдирдХреА рдкрд╣реБрдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ HexCellShaderDataрдирд╣реАрдВ рд╣реИред рддреЛ рдЖрдЗрдП рдЗрд╕ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рд╕реМрдВрдкрддреЗ рд╣реИрдВ HexGridред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ HexCellShaderDataрд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ , рдЬреЛ рдЖрдкрдХреЛ рдЧреНрд░рд┐рдб рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо LateUpdateрд░реАрд╕реЗрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

  public HexGrid Grid { get; set; } тАж void LateUpdate () { if (needsVisibilityReset) { needsVisibilityReset = false; Grid.ResetVisibility(); } тАж } 

рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ HexGrid: HexGrid.Awakeрд╢реЗрдбрд░ рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЧреНрд░рд┐рдб рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕реЗрдЯ рдХрд░реЗрдВ ред

  void Awake () { HexMetrics.noiseSource = noiseSource; HexMetrics.InitializeHashGrid(seed); HexUnit.unitPrefab = unitPrefab; cellShaderData = gameObject.AddComponent<HexCellShaderData>(); cellShaderData.Grid = this; CreateMap(cellCountX, cellCountZ); } 

HexGridResetVisibilityрд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рддреНрдпрд╛рдЧрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рднреА рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП ред рдмрд╕ рдЗрд╕реЗ рд▓реВрдк рдХреА рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдиреЗ рджреЗрдВ рдФрд░ рд░реАрд╕реЗрдЯ рдХреЛ рдЦреБрдж рдХреЛ рд╕реМрдВрдк рджреЗрдВред

  public void ResetVisibility () { for (int i = 0; i < cells.Length; i++) { cells[i].ResetVisibility(); } } 

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

  public void ResetVisibility () { if (visibility > 0) { visibility = 0; ShaderData.RefreshVisibility(this); } } 

рд╕рднреА рджреГрд╢реНрдпрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, HexGrid.ResetVisibilityрдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рднреА рд╕реНрдХреНрд╡рд╛рдб рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рд▓рд╛рдЧреВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд╡рд╛рдб рдХрд╛ рджрд╛рдпрд░рд╛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ VisionRangeред

  public void ResetVisibility () { for (int i = 0; i < cells.Length; i++) { cells[i].ResetVisibility(); } for (int i = 0; i < units.Count; i++) { HexUnit unit = units[i]; IncreaseVisibility(unit.Location, unit.VisionRange); } } 

рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд╛рдо рдмрджрд▓рдиреЗ HexUnit.visionRangeрдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ HexUnit.VisionRangeрдФрд░ рдЗрд╕реЗ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ ред рдЬрдмрдХрд┐ рдЗрд╕реЗ 3 рдХрд╛ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред

  public int VisionRange { get { return 3; } } 

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

  void OnEnable () { if (!HexMetrics.noiseSource) { тАж ResetVisibility(); } } 

рдЕрдм рдЖрдк рд╕реНрдХреЛрдк рдХреЛрдб рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд▓реЗ рдореЛрдб рдореЗрдВ рд░рд╣рддреЗ рд╣реБрдП рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрд╖рд┐рддрд┐рдЬ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░


рджрд╛рдпрд░реЗ рдХреА рдЧрдгрдирд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ HexGrid.GetVisibleCellsред рддрд╛рдХрд┐ рдКрдВрдЪрд╛рдИ рдЧреБрдВрдЬрд╛рдЗрд╢ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ, рд╣рдо рдмрд╕ fromCellрдкреНрд░рд╕рд╛рд░рдг рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рджреЗрдЦрдиреЗ рдХреА рдКрдВрдЪрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

  List<HexCell> GetVisibleCells (HexCell fromCell, int range) { тАж range = fromCell.ViewElevation; fromCell.SearchPhase = searchFrontierPhase; fromCell.Distance = 0; searchFrontier.Enqueue(fromCell); тАж } 


рдПрдХ рджрд╛рдпрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдКрдВрдЪрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рджреГрд╢реНрдпрддрд╛ рдореЗрдВ рдмрд╛рдзрд╛рдПрдВ


рджреЗрдЦрдиреЗ рдХреА рдКрдВрдЪрд╛рдИ рдХреЛ рдПрдХ рджрд╛рдпрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХреЗрд╡рд▓ рддрднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЕрдиреНрдп рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╢реВрдиреНрдп рдКрдВрдЪрд╛рдИ рдкрд░ рд╣реЛрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рджреГрд╖реНрдЯрд┐ рдХреЗ рд╕рдорд╛рди рдКрдВрдЪрд╛рдИ рд╣реИ, рддреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдЪреНрдЪ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рд╡рд╛рд▓реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рдкреАрдЫреЗ рдХрдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм рддрдХ, рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рджрд╛рдпрд░рд╛ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

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

  int distance = current.Distance + 1; if (distance + neighbor.ViewElevation > range) { continue; } 


рдЙрдЪреНрдЪ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рджреГрд╢реНрдп рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддреА рд╣реИрдВред

рдХреНрдпрд╛ рд╣рдореЗрдВ рджреВрд░реА рдореЗрдВ рд▓рдореНрдмреА рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдирд╣реАрдВ рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдП?
, , , . , .

рдХреЛрдиреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рди рджреЗрдЦреЗрдВ


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

  HexCoordinates fromCoordinates = fromCell.coordinates; while (searchFrontier.Count > 0) { тАж for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { тАж int distance = current.Distance + 1; if (distance + neighbor.ViewElevation > range || distance > fromCoordinates.DistanceTo(neighbor.coordinates) ) { continue; } тАж } } 


рд╣рдо рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

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

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

  range += fromCell.ViewElevation; 


рдХрдо рдмрд┐рдВрджреБ рдкрд░ рдкреВрд░реНрдг рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВред

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

рд╡рд╕реНрддреБрдУрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
, , . , , . .

unitypackage

рдЬрд┐рди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рд╕рдорд╕реНрдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддреА рд╣реИред рд░рд╛рд╣рдд рдЕрдЪрд╛рдирдХ рдФрд░ рд╕рдВрдХреНрд░рдордг рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдХреЛрдИ рдкрдбрд╝реЛрд╕реА рдирд╣реАрдВ рд╣реИред


рдирдХреНрд╢реЗ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдЪрд┐рд╣реНрдирд┐рддред

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

рд╣рдо рдЬрд╛рдВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рд╕реЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, HexCellрд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ Explorableред

  public bool Explorable { get; set; } 

рдЕрдм рдПрдХ рд╕реЗрд▓ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЬрд╛рдВрдЪ рд╣реИ, рддреЛ IsVisibleрд╣рдо рдЗрд╕реЗ рдЦрд╛рддреЗ рдореЗрдВ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред

  public bool IsVisible { get { return visibility > 0 && Explorable; } } 

рд╡рд╣реА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ IsExploredред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдорд╛рдирдХ рд╕рдВрдкрддреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреАред рд╣рдореЗрдВ рдЗрд╕реЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕рдХреЗ рдЧреЗрдЯрдЯрд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред

  public bool IsExplored { get { return explored && Explorable; } private set { explored = value; } } тАж bool explored; 

рдирдХреНрд╢реЗ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдЫрд┐рдкрд╛рдПрдБ


рдЖрдк рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдЖрдпрддрд╛рдХрд╛рд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреЛ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ HexGrid.CreateCellред рд╕реЗрд▓ рдЬреЛ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдирд╣реАрдВ рд╣реИрдВ, рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдмрд╛рдХреА рд╕рднреА рдмреЗрд░реЛрдЬрд╝рдЧрд╛рд░ рд╣реИрдВред

  void CreateCell (int x, int z, int i) { тАж HexCell cell = cells[i] = Instantiate<HexCell>(cellPrefab); cell.transform.localPosition = position; cell.coordinates = HexCoordinates.FromOffsetCoordinates(x, z); cell.Index = i; cell.ShaderData = cellShaderData; cell.Explorable = x > 0 && z > 0 && x < cellCountX - 1 && z < cellCountZ - 1; тАж } 

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


рдирдХреНрд╢реЗ рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдХрд┐рдирд╛рд░реЗред

рдХреНрдпрд╛ рдЕрдиреБрд╕рдВрдзрд╛рди рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ?
, , . .

рдЕрд╕реНрдкрд╖реНрдЯреАрдХреГрдд рдХреЛрд╢рд┐рдХрд╛рдПрдВ рджреГрд╢реНрдпрддрд╛ рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рддреА рд╣реИрдВ


рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рд╕реЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рджреГрд╢реНрдпрддрд╛ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред HexGrid.GetVisibleCellsрдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдмрджрд▓реЗрдВ ред

  if ( neighbor == null || neighbor.SearchPhase > searchFrontierPhase || !neighbor.Explorable ) { continue; } 

unitypackage

рднрд╛рдЧ реирей: рднреВрдорд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛


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

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдорд╛рдирдЪрд┐рддреНрд░ рдкреАрдврд╝реА рдкрд░ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд╢реБрд░реБрдЖрдд рд╣реЛрдЧреАред

рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХрддрд╛ 2017.1.0 рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдХрдИ рдЙрддреНрдкрдиреНрди рдирдХреНрд╢реЗ рдореЗрдВ рд╕реЗ рдПрдХред

рдХрд╛рд░реНрдб рдкреАрдврд╝реА


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

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

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

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

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

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

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

рд╕рдВрдкрд╛рджрди рдореЛрдб рдореЗрдВ рдЖрд░рдВрдн рдХрд░рдирд╛


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

  void Awake () { terrainMaterial.DisableKeyword("GRID_ON"); Shader.EnableKeyword("HEX_MAP_EDIT_MODE"); SetEditMode(true); } 

рдХрд╛рд░реНрдб рдЬрдирд░реЗрдЯрд░


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

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

 using System.Collections.Generic; using UnityEngine; public class HexMapGenerator : MonoBehaviour { public HexGrid grid; public void GenerateMap (int x, int z) { grid.CreateMap(x, z); } } 

рдПрдХ рдШрдЯрдХ рдХреЛ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗрдВ HexMapGeneratorрдФрд░ рдЗрд╕реЗ рдЧреНрд░рд┐рдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред


рдорд╛рдирдЪрд┐рддреНрд░ рдЬрдирд░реЗрдЯрд░ рд╡рд╕реНрддреБред

рдПрдХ рдирдП рдирдХреНрд╢реЗ рдХрд╛ рдореЗрдиреВ рдмрджрд▓реЗрдВ


рд╣рдо рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВрдЧреЗ NewMapMenuрддрд╛рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреЗ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рд╣реА рдмрдирд╛рдПред рд╣рдо рдмреВрд▓рд┐рдпрди рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ generateMaps, рдЬрд┐рд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдореВрд▓реНрдп рд╣реИ trueред рдЖрдЗрдП рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рд╡рд┐рдХрд▓реНрдк рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ HexMapEditorред рдореЗрдиреВ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдзрд┐ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред

  bool generateMaps = true; public void ToggleMapGeneration (bool toggle) { generateMaps = toggle; } 


рдПрдХ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдб рдХрд╛ рдореЗрдиреВред

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

  public HexMapGenerator mapGenerator; тАж void CreateMap (int x, int z) { if (generateMaps) { mapGenerator.GenerateMap(x, z); } else { hexGrid.CreateMap(x, z); } HexMapCamera.ValidatePosition(); Close(); } 


рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рдиред

рд╕реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ


рдЬрдирд░реЗрдЯрд░ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо HexGridрдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╣реИ GetCellрдХрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░, рдпрд╛ рд╖рдЯреНрднреБрдЬ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред рдЬрдирд░реЗрдЯрд░ рдХреЛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рджреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддреЗ HexGrid.GetCellрд╣реИрдВ рдЬреЛ рд╕реЗрд▓ рдХреЗ рдСрдлрд╕реЗрдЯ рдпрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

  public HexCell GetCell (int xOffset, int zOffset) { return cells[xOffset + zOffset * cellCountX]; } public HexCell GetCell (int cellIndex) { return cells[cellIndex]; } 

рдЕрдм рдпрд╣ HexMapGeneratorрдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реАрдзреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╣ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдордзреНрдп рд╕реНрддрдВрдн рдХреА рд░рд╛рд╣рдд рдХреЗ рд░реВрдк рдореЗрдВ рдШрд╛рд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрд╛рд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

  public void GenerateMap (int x, int z) { grid.CreateMap(x, z); for (int i = 0; i < z; i++) { grid.GetCell(x / 2, i).TerrainTypeIndex = 1; } } 


рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдирдХреНрд╢реЗ рдкрд░ рдШрд╛рд╕ рдХрд╛ рд╕реНрддрдВрднред

unitypackage

рд╕реБрд╢реА рдмрдирд╛рдирд╛


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

рд░рд╛рд╣рдд рдмрдврд╝рд╛рдУ


рдЪрд▓реЛ рдЫреЛрдЯреА рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ - рдкрд╛рдиреА рдХреЗ рдКрдкрд░ рдЬрдореАрди рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдмрдврд╝рд╛рдПрдВред рд╣рдо RaiseTerrainрдкреНрд▓реЙрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ ред GenerateMapрдкрд┐рдЫрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреА рдЬрдЧрд╣, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ ред рдЪрд▓реЛ рд╕рд╛рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рднреВрдорд┐ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЯреБрдХрдбрд╝реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

  public void GenerateMap (int x, int z) { grid.CreateMap(x, z); // for (int i = 0; i < z; i++) { // grid.GetCell(x / 2, i).TerrainTypeIndex = 1; // } RaiseTerrain(7); } void RaiseTerrain (int chunkSize) {} 

рдЕрдм рддрдХ, рд╣рдо "рдШрд╛рд╕" рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд╛рд╣рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдКрдВрдЪреЗ рднреВрдорд┐ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореВрд▓ "рд░реЗрдд" рд░рд╛рд╣рдд рдорд╣рд╛рд╕рд╛рдЧрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИред рд╣рдореЗрдВ RaiseTerrainрдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реЗрд▓ рд▓реЗрдВ рдФрд░ рдЬрдм рддрдХ рд╣рдореЗрдВ рд╕рд╣реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЬрдореАрди рди рдорд┐рд▓ рдЬрд╛рдП, рддрдм рддрдХ рдЗрд╕рдХреА рд░рд╛рд╣рдд рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓ рджреЗрдВред

рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ GetRandomCellрдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реЗрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧреНрд░рд┐рдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

  void RaiseTerrain (int chunkSize) { for (int i = 0; i < chunkSize; i++) { GetRandomCell().TerrainTypeIndex = 1; } } HexCell GetRandomCell () { return grid.GetCell(Random.Range(0, grid.cellCountX * grid.cellCountZ)); } 


рд╕рд╛рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реБрд╢реА рдХреЛрд╢рд┐рдХрд╛рдУрдВред

рдЪреВрдВрдХрд┐ рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдХрдИ рдмрд╛рд░ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдИ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдпрд╛ рд▓реВрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЪрд▓реЛ рд╕реЗрд▓ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирдЬрд╝рд░ рд░рдЦреЗрдВ HexMapGeneratorред

  int cellCount; public void GenerateMap (int x, int z) { cellCount = x * z; тАж } тАж HexCell GetRandomCell () { return grid.GetCell(Random.Range(0, cellCount)); } 

рдПрдХ рд╕рд╛рдЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


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

рд╣рдо HexMapGeneratorрдЕрдкрдиреА рд╕рдВрдкрддреНрддрд┐ рдФрд░ рдЦреЛрдЬ рд╕реАрдорд╛ рдХреЗ рдЪрд░рдг рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛ HexGridред

  HexCellPriorityQueue searchFrontier; int searchFrontierPhase; 

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

  public void GenerateMap (int x, int z) { cellCount = x * z; grid.CreateMap(x, z); if (searchFrontier == null) { searchFrontier = new HexCellPriorityQueue(); } RaiseTerrain(7); } 

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

  RaiseTerrain(7); for (int i = 0; i < cellCount; i++) { grid.GetCell(i).SearchPhase = 0; } 

рдЕрдм рдореБрдЭреЗ RaiseTerrainрдЙрдкрдпреБрдХреНрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реИ, рди рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЪреБрдирдирд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЦреЛрдЬ рд╡рд┐рдзрд┐ рдХреЗ рд╕рдорд╛рди рд╣реИ HexGridред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рджреМрд░рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП 2 рдХреЗ рдмрдЬрд╛рдп 1 рд╕реЗ рдЦреЛрдЬ рд╕реАрдорд╛ рдХреЗ рдЪрд░рдг рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдлрд┐рд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗрд▓ рдХреЗ рд╕рд╛рде рд╕реАрдорд╛ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЗрд╕рдХреЗ рдЦреЛрдЬ рдЪрд░рдг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрд╕рдХреА рджреВрд░реА рдФрд░ рдЕрдиреБрдорд╛рди рдХреЛ рд╢реВрдиреНрдп рддрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

  void RaiseTerrain (int chunkSize) { // for (int i = 0; i < chunkSize; i++) { // GetRandomCell().TerrainTypeIndex = 1; // } searchFrontierPhase += 1; HexCell firstCell = GetRandomCell(); firstCell.SearchPhase = searchFrontierPhase; firstCell.Distance = 0; firstCell.SearchHeuristic = 0; searchFrontier.Enqueue(firstCell); } 

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

  searchFrontier.Enqueue(firstCell); int size = 0; while (size < chunkSize && searchFrontier.Count > 0) { HexCell current = searchFrontier.Dequeue(); current.TerrainTypeIndex = 1; size += 1; for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = current.GetNeighbor(d); if (neighbor && neighbor.SearchPhase < searchFrontierPhase) { neighbor.SearchPhase = searchFrontierPhase; neighbor.Distance = 0; neighbor.SearchHeuristic = 0; searchFrontier.Enqueue(neighbor); } } } searchFrontier.Clear(); 


рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ред

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

рд╣рдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ


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

  searchFrontier.Enqueue(firstCell); HexCoordinates center = firstCell.coordinates; int size = 0; while (size < chunkSize && searchFrontier.Count > 0) { HexCell current = searchFrontier.Dequeue(); current.TerrainTypeIndex = 1; size += 1; for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = current.GetNeighbor(d); if (neighbor && neighbor.SearchPhase < searchFrontierPhase) { neighbor.SearchPhase = searchFrontierPhase; neighbor.Distance = neighbor.coordinates.DistanceTo(center); neighbor.SearchHeuristic = 0; searchFrontier.Enqueue(neighbor); } } } 


рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рд╕рдВрдЪрдпред

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

  RaiseTerrain(30); 


30 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реБрд╢реА рджреНрд░рд╡реНрдпрдорд╛рдиред

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

рд╕реБрд╢реА рдпрд╛рджреГрдЪреНрдЫрд┐рдХрд░рдг


рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рд╕рднреА рдХреНрд╖реЗрддреНрд░ рд╕рдорд╛рди рджрд┐рдЦреЗрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реЗрд▓ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджреЗрдВрдЧреЗред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ рдкрдбрд╝реЛрд╕реА рд╕реЗрд▓ рдХреЛ рд╕реАрдорд╛ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЕрдЧрд▓реА рд╕рдВрдЦреНрдпрд╛ Random.valueрдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рдореВрд▓реНрдп рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдЗрд╕ рд╕реЗрд▓ рдХрд╛ рд╣реЗрдпреБрд░рд┐рд╕реНрдЯрд┐рдХ 0 рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 1. рдорд╛рди 0.5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдзреЗ рд╕реЗрд▓ рд╣реЛрдВрдЧреЗред

  neighbor.Distance = neighbor.coordinates.DistanceTo(center); neighbor.SearchHeuristic = Random.value < 0.5f ? 1: 0; searchFrontier.Enqueue(neighbor); 


рд╡рд┐рдХреГрдд рдХреНрд╖реЗрддреНрд░ред

рд╕реЗрд▓ рдХреЗ рдЦреЛрдЬ рдЕрдиреБрдорд╛рди рдХреЛ рдмрдврд╝рд╛рдХрд░, рд╣рдордиреЗ рдмрд╛рдж рдореЗрдВ рдЙрдореНрдореАрдж рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛рддреНрд░рд╛ рдХреАред рдЗрд╕реА рд╕рдордп, рдХреЗрдВрджреНрд░ рд╕реЗ рдПрдХ рдХрджрдо рдЖрдЧреЗ рд╕реНрдерд┐рдд рдЕрдиреНрдп рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рджреМрд░рд╛ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рднреА рд╡реГрджреНрдзрд┐ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╣реЗрдпреБрд░рд┐рд╕реНрдЯрд┐рдХ рдХреЛ рдПрдХ рдореВрд▓реНрдп рд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣реА рд╣реИ, рдереНрд░реЗрд╢реЛрд▓реНрдб 1 рдХрд╛ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдереНрд░реЗрд╢реЛрд▓реНрдб 0. рдФрд░ рдереНрд░реЗрд╢реЛрд▓реНрдб 0.8 0.2 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, 0.5 рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЦреЛрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдмрд╕реЗ "рдХрд╛рдВрдк" рдмрдирд╛рддреА рд╣реИред

рджреЛрд▓рди рдХреА рдЙрдкрдпреБрдХреНрдд рдорд╛рддреНрд░рд╛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рднреВрднрд╛рдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдмрдирд╛рддреЗ рд╣реИрдВред рдЬрдирд░реЗрдЯрд░ рдХреЗ jitterProbabilityрд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлреНрд▓реЛрдЯ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВRangeрд╕реАрдорд╛ 0-0.5 рдореЗрдВ рд╕реАрдорд┐рдд рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдФрд╕рдд рдХреЗ рдмрд░рд╛рдмрд░ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рджреЗрдВ, рдЕрд░реНрдерд╛рдд 0.25ред рдпрд╣ рд╣рдореЗрдВ рдпреВрдирд┐рдЯреА рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

  [Range(0f, 0.5f)] public float jitterProbability = 0.25f; 


рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЧреЗрдо UI рдореЗрдВ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
, . UI, . , UI. , . , .

рдЕрдм, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣реЗрдпреБрд░рд┐рд╕реНрдЯрд┐рдХ 1 рдХреЗ рдмрд░рд╛рдмрд░ рдХрдм рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

  neighbor.SearchHeuristic = Random.value < jitterProbability ? 1: 0; 

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

рдХреБрдЫ рдЬрдореАрди рдЙрдард╛рддреЗ рд╣реИрдВ


рд╣рдо рднреВрдорд┐ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреА рдкреАрдврд╝реА рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд░рд╣реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо RaiseTerrainрдкрд╛рдВрдЪ рдЦрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред

  for (int i = 0; i < 5; i++) { RaiseTerrain(30); } 


рдЬрдореАрди рдХреЗ рдкрд╛рдВрдЪ рдкреНрд▓реЙрдЯред

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

рднреВрдорд┐ рдХреА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рднреВрдЦрдВрдб рдХрд╛ рдЖрдХрд╛рд░ рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рднреВрдЦрдВрдбреЛрдВ рдХреЗ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ 20-200 рддрдХ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдмрдбрд╝рд╛ рдЕрдВрддрд░рд╛рд▓ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдореИрдВ рдорд╛рдирдХ рдХреЛ рдиреНрдпреВрдирддрдо 30 рдХреЗ рдмрд░рд╛рдмрд░ рдФрд░ рдорд╛рдирдХ рдЕрдзрд┐рдХрддрдо - 100 рдХрд░ рджреВрдВрдЧрд╛ред

  [Range(20, 200)] public int chunkSizeMin = 30; [Range(20, 200)] public int chunkSizeMax = 100; 


рдЖрдХрд╛рд░ рджреЗрдиреЗ рдХрд╛ рдЕрдВрддрд░рд╛рд▓ред

рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ RaiseTerrainред

  RaiseTerrain(Random.Range(chunkSizeMin, chunkSizeMax + 1)); 


рдмреАрдЪ рдХреЗ рдирдХреНрд╢реЗ рдкрд░ рдкрд╛рдВрдЪ рдмреЗрддрд░рддреАрдм рдЖрдХрд╛рд░ рдХреЗ рдЦрдВрдбред

рдкрд░реНрдпрд╛рдкреНрдд рд╕реБрд╢реА рдмрдирд╛рдПрдВ


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

  [Range(5, 95)] public int landPercentage = 50; 


рд╕реБрд╢реА рдХрд╛ рдкреНрд░рддрд┐рд╢рддред

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

  public void GenerateMap (int x, int z) { тАж // for (int i = 0; i < 5; i++) { // RaiseTerrain(Random.Range(chunkSizeMin, chunkSizeMax + 1)); // } CreateLand(); for (int i = 0; i < cellCount; i++) { grid.GetCell(i).SearchPhase = 0; } } void CreateLand () { int landBudget = Mathf.RoundToInt(cellCount * landPercentage * 0.01f); } 

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

 // void RaiseTerrain (int chunkSize) { int RaiseTerrain (int chunkSize, int budget) { тАж return budget; } 

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

  while (size < chunkSize && searchFrontier.Count > 0) { HexCell current = searchFrontier.Dequeue(); if (current.TerrainTypeIndex == 0) { current.TerrainTypeIndex = 1; if (--budget == 0) { break; } } size += 1; тАж } 

рдЕрдм рдпрд╣ CreateLandрддрдм рддрдХ рдЬрдореАрди рдЬреБрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдпрд╣ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдкреВрд░реА рдорд╛рддреНрд░рд╛ рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ред

  void CreateLand () { int landBudget = Mathf.RoundToInt(cellCount * landPercentage * 0.01f); while (landBudget > 0) { landBudget = RaiseTerrain( Random.Range(chunkSizeMin, chunkSizeMax + 1), landBudget ); } } 


рдмрд┐рд▓реНрдХреБрд▓ рдЖрдзрд╛ рдирдХреНрд╢рд╛ рдЬрдореАрди рдмрди рдЧрдпрд╛ред

unitypackage

рдКрдВрдЪрд╛рдИ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ


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

рдЬрдореАрди рдХреЛ рдзрдХреЗрд▓ рджреЛ


рдкреНрд░рддреНрдпреЗрдХ рднреВрдЦрдВрдб рд╕рдореБрджреНрд░ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдзрдХреЗрд▓ рджрд┐рдП рдЧрдП рднреВрдорд┐ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЪрд▓реЛ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреА рдКрдБрдЪрд╛рдИ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝рд╛рдПрдБ RaiseTerrainрдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

  HexCell current = searchFrontier.Dequeue(); current.Elevation += 1; if (current.TerrainTypeIndex == 0) { тАж } 


рдКрдБрдЪрд╛рдИ рд╡рд╛рд▓реА рднреВрдорд┐ред

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

рдпрджрд┐ рдКрдВрдЪрд╛рдИ рдЗрд▓рд╛рдХрд╝реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
. , .

рдКрдВрдЪрд╛рдИ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рд╕реЗрд▓ рдХреЗ рдЗрд▓рд╛рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЪрд▓реЛ SetTerrainTypeрдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рднреА рдЗрд▓рд╛рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ ред

  void SetTerrainType () { for (int i = 0; i < cellCount; i++) { HexCell cell = grid.GetCell(i); cell.TerrainTypeIndex = cell.Elevation; } } 

рд╕реБрд╢реА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣реЗрдВрдЧреЗред

  public void GenerateMap (int x, int z) { тАж CreateLand(); SetTerrainType(); тАж } 

рдЕрдм рд╡рд╣ RaiseTerrainрд░рд╛рд╣рдд рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдирд┐рдкрдЯ рд╕рдХрддрд╛, рдФрд░ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреА рдирдИ рдКрдВрдЪрд╛рдИ 1 рд╣реИ, рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рд╕реВрдЦ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдпреЛрдЧ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд╛рдЗрдЯ рдХреА рд╡реГрджреНрдзрд┐ рдкреВрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред

  HexCell current = searchFrontier.Dequeue(); current.Elevation += 1; if (current.Elevation == 1 && --budget == 0) { break; } // if (current.TerrainTypeIndex == 0) { // current.TerrainTypeIndex = 1; // if (--budget == 0) { // break; // } // } 


рдкрд░рддреЛрдВ рдХрд╛ рд╕реНрддрд░реАрдХрд░рдгред

рдкрд╛рдиреА рдбрд╛рд▓реЗрдВ


рдЖрдЗрдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреМрди рд╕реА рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдкрд╛рдиреА рдпрд╛ рднреВрдорд┐ рд╣реИрдВ, рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд▓ рд╕реНрддрд░ рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ GenerateMapред рднреВрдорд┐ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХрд░реЗрдВ ред

  public void GenerateMap (int x, int z) { cellCount = x * z; grid.CreateMap(x, z); if (searchFrontier == null) { searchFrontier = new HexCellPriorityQueue(); } for (int i = 0; i < cellCount; i++) { grid.GetCell(i).WaterLevel = 1; } CreateLand(); тАж } 

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

  void SetTerrainType () { for (int i = 0; i < cellCount; i++) { HexCell cell = grid.GetCell(i); if (!cell.IsUnderwater) { cell.TerrainTypeIndex = cell.Elevation - cell.WaterLevel; } } } 


рдЬрдореАрди рдФрд░ рдкрд╛рдиреАред

рдЬрд▓ рд╕реНрддрд░ рдмрдврд╝рд╛рдПрдВ


рд╣рдо рдПрдХ рдЬрд▓ рд╕реНрддрд░ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЖрдЗрдП рдЗрд╕реЗ 1-5 рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдФрд░ 3 рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдмрдирд╛рдПрдВред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

  [Range(1, 5)] public int waterLevel = 3; тАж public void GenerateMap (int x, int z) { тАж for (int i = 0; i < cellCount; i++) { grid.GetCell(i).WaterLevel = waterLevel; } тАж } 



рдЬрд▓ рд╕реНрддрд░ 3.

рдЬрдм рдЬрд▓ рд╕реНрддрд░ 3 рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╕реЗ рдХрдо рдЬрдореАрди рдорд┐рд▓рддреА рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ RaiseTerrainрдЕрднреА рднреА рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдиреА рдХрд╛ рд╕реНрддрд░ 1 рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред

  HexCell current = searchFrontier.Dequeue(); current.Elevation += 1; if (current.Elevation == waterLevel && --budget == 0) { break; } 

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





рдЬрд▓ рд╕реНрддрд░ 2-5 рд╣реИ, рд╕реБрд╢реА рд╣рдореЗрд╢рд╛ 50% рд╣реИред

unitypackage

рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдЖрдВрджреЛрд▓рди


рдЕрдм рддрдХ рд╣рдордиреЗ рдПрдХ рд╕рдордп рдореЗрдВ рднреВрдЦрдВрдбреЛрдВ рдХреЛ рдПрдХ рд╕реНрддрд░ рдКрдкрд░ рдЙрдард╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЦреБрдж рдХреЛ рдЗрд╕ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд░рдЦрдирд╛ рд╣реИред

рдЙрдЪреНрдЪ рд╕рд╛рдЗрдЯреЗрдВ


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

  [Range(0f, 1f)] public float highRiseProbability = 0.25f; 


рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдПрдХ рдордЬрдмреВрдд рд╡реГрджреНрдзрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ред

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

  int rise = Random.value < highRiseProbability ? 2 : 1; int size = 0; while (size < chunkSize && searchFrontier.Count > 0) { HexCell current = searchFrontier.Dequeue(); int originalElevation = current.Elevation; current.Elevation = originalElevation + rise; if ( originalElevation < waterLevel && current.Elevation >= waterLevel && --budget == 0 ) { break; } size += 1; тАж } 





рдКрдВрдЪрд╛рдИ рдореЗрдВ рдордЬрдмреВрдд рд╡реГрджреНрдзрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ 0.25, 0.50, 0.75 рдФрд░ 1 рд╣реИрдВред

рднреВрдорд┐ рдХреЛ рдХрдо рдХрд░реЛ


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


рдзрдБрд╕рд╛ рд╕реБрд╢реА рдХреЗ рдмрд┐рдирд╛ рдмрдбрд╝рд╛ рдирдХреНрд╢рд╛ред

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

  [Range(0f, 0.4f)] public float sinkProbability = 0.2f; 


рдХрдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ред

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

  int SinkTerrain (int chunkSize, int budget) { тАж int sink = Random.value < highRiseProbability ? 2 : 1; int size = 0; while (size < chunkSize && searchFrontier.Count > 0) { HexCell current = searchFrontier.Dequeue(); int originalElevation = current.Elevation; current.Elevation = originalElevation - sink; if ( originalElevation >= waterLevel && current.Elevation < waterLevel // && --budget == 0 ) { // break; budget += 1; } size += 1; тАж } searchFrontier.Clear(); return budget; } 

рдЕрдм, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, CreateLandрд╣рдореЗрдВ рдпрд╛ рддреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рднреВрдорд┐ рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рдХрдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

  void CreateLand () { int landBudget = Mathf.RoundToInt(cellCount * landPercentage * 0.01f); while (landBudget > 0) { int chunkSize = Random.Range(chunkSizeMin, chunkSizeMax - 1); if (Random.value < sinkProbability) { landBudget = SinkTerrain(chunkSize, landBudget); } else { landBudget = RaiseTerrain(chunkSize, landBudget); } } } 





рдЫреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ 0.1, 0.2, 0.3 рдФрд░ 0.4 рд╣реИред

рдКрдБрдЪрд╛рдИ рдХреА рд╕реАрдорд╛


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


90% рднреВрдорд┐ рдкрд░ рднрд╛рд░реА рдКрдВрдЪрд╛рдИред

рдКрдВрдЪрд╛рдИ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╕реНрдЯрдо рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдЬреЛрдбрд╝реЗрдВред рдПрдХ рдЙрдЪрд┐рдд рдиреНрдпреВрдирддрдо рдХрд╣реАрдВ тИТ4 рдФрд░ 0 рдХреЗ рдмреАрдЪ рд╣реЛрдЧрд╛, рдФрд░ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЕрдзрд┐рдХрддрдо 6-10 рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ and2 рдФрд░ 8 рд╣реЛрдиреЗ рджреЗрдВред рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╡реЗ рдЕрдиреБрдореЗрдп рд╕реАрдорд╛ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдк UI рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

  [Range(-4, 0)] public int elevationMinimum = -2; [Range(6, 10)] public int elevationMaximum = 8; 


рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИред

рдЕрдм RaiseTerrainрд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдКрдБрдЪрд╛рдИ рдЕрдиреБрдореЗрдп рдЕрдзрд┐рдХрддрдо рд╕реЗ рдЕрдзрд┐рдХ рди рд╣реЛред рдпрд╣ рдЬрд╛рдБрдЪ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдмрд╣реБрдд рдКрдБрдЪреА рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдКрдВрдЪрд╛рдИ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ рдХрд┐ рднреВрдорд┐ рдХреНрд╖реЗрддреНрд░ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рдмрдЪреЗрдВрдЧреЗ рдЬреЛ рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИ рддрдХ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВред

  HexCell current = searchFrontier.Dequeue(); int originalElevation = current.Elevation; int newElevation = originalElevation + rise; if (newElevation > elevationMaximum) { continue; } current.Elevation = newElevation; if ( originalElevation < waterLevel && newElevation >= waterLevel && --budget == 0 ) { break; } size += 1; 

рдЙрд╕реА рдореЗрдВ рдХрд░реЗрдВ SinkTerrain, рд▓реЗрдХрд┐рди рдиреНрдпреВрдирддрдо рдКрдВрдЪрд╛рдИ рдХреЗ рд▓рд┐рдПред

  HexCell current = searchFrontier.Dequeue(); int originalElevation = current.Elevation; int newElevation = current.Elevation - sink; if (newElevation < elevationMinimum) { continue; } current.Elevation = newElevation; if ( originalElevation >= waterLevel && newElevation < waterLevel ) { budget += 1; } size += 1; 


90% рднреВрдорд┐ рдХреЗ рд╕рд╛рде рд╕реАрдорд┐рдд рдКрдБрдЪрд╛рдИред

рдирдХрд╛рд░рд╛рддреНрдордХ рдКрдВрдЪрд╛рдИ рд╕рдВрд░рдХреНрд╖рдг


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

рд╣рдо рдЗрд╕реЗ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рдЛрдгрд╛рддреНрдордХ рдКрдБрдЪрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╛рдЗрдЯ рдирд╣реАрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдЕрднреА рднреА рдКрдВрдЪрд╛рдИ рдХреЗ рдХрдИ рд╕реНрддрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо 127 рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреЛ рдСрдлрд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдмрд╛рдЗрдЯ рдХреЗ рднреАрддрд░ рд░реЗрдВрдЬ тИТ127тАУ128 рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред HexCell.SaveрдЙрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓рд┐рдП ред

  public void Save (BinaryWriter writer) { writer.Write((byte)terrainTypeIndex); writer.Write((byte)(elevation + 127)); тАж } 

рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ SaveLoadMenu.mapFileVersion4 рддрдХ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ ред

  const int mapFileVersion = 4; 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ HexCell.Loadрддрд╛рдХрд┐ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг 4 рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рднрд░реА рд╣реБрдИ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рд╕реЗ 127 рдХреЛ рдШрдЯрд╛рдПред

  public void Load (BinaryReader reader, int header) { terrainTypeIndex = reader.ReadByte(); ShaderData.RefreshTerrain(this); elevation = reader.ReadByte(); if (header >= 4) { elevation -= 127; } тАж } 

unitypackage

рдЙрд╕реА рдирдХреНрд╢реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛


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

рдмреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдорд╛рдирдЪрд┐рддреНрд░ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ Random.RangeрдФрд░ Random.valueред рдПрдХ рд╣реА рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕реА рдмреАрдЬ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдкрд╣рд▓реЗ рднреА, рдореЗрдВ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗ рдЪреБрдХреЗ рд╣реИрдВ HexMetrics.InitializeHashGridред рдпрд╣ рдкрд╣рд▓реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмреАрдЬ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХреА рдЧрдИ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЕрдкрдиреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ HexMapGenerator.GenerateMapред рд╣рдо рдлрд┐рд░ рд╕реЗ рдкреБрд░рд╛рдиреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗрдВ Randomред

  public void GenerateMap (int x, int z) { Random.State originalRandomState = Random.state; тАж Random.state = originalRandomState; } 

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

  public int seed; 


рдмреАрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред

рдЕрдм рд╣рдореЗрдВ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреАрдЬ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Randomред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХрд╛рд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордирдорд╛рдирд╛ рдмреАрдЬ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ Random.Rangeред рддрд╛рдХрд┐ рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗ, рд╣рдореЗрдВ рдЗрд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  public void GenerateMap (int x, int z) { Random.State originalRandomState = Random.state; seed = Random.Range(0, int.MaxValue); Random.InitState(seed); тАж } 

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

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

  seed = Random.Range(0, int.MaxValue); seed ^= (int)System.DateTime.Now.Ticks; seed ^= (int)Time.unscaledTime; Random.InitState(seed); 

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

  seed ^= (int)Time.unscaledTime; seed &= int.MaxValue; Random.InitState(seed); 

рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдмреАрдЬ


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

  public bool useFixedSeed; 


рдПрдХ рдирд┐рд░рдВрддрд░ рдмреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдкред

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

  Random.State originalRandomState = Random.state; if (!useFixedSeed) { seed = Random.Range(0, int.MaxValue); seed ^= (int)System.DateTime.Now.Ticks; seed ^= (int)Time.time; seed &= int.MaxValue; } Random.InitState(seed); 

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



рдмреАрдЬ рдорд╛рди 0 рдФрд░ 929396788 рдХреЗ рд╕рд╛рде рдмрдбрд╝реЗ рдХрд╛рд░реНрдб, рдорд╛рдирдХ рдкреИрд░рд╛рдореАрдЯрд░ред

unitypackage

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


All Articles