рдПрдХрддрд╛ рд╣реЗрдХреНрд╕рд╛рдЧреЛрди рдореИрдкреНрд╕: рд░рдлрдиреЗрд╕, рдирджрд┐рдпрд╛рдВ рдФрд░ рд╕рдбрд╝рдХреЗрдВ

рдЫрд╡рд┐


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

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

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

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

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

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

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

рднрд╛рдЧ 4: рдЦреБрд░рджрд░рд╛рдкрди


рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛


  • рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ред
  • рд╕рд┐рд░реЛрдВ рдХреЛ рдШреБрдорд╛рдПрдВред
  • рд╣рдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рдорддрд▓рддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  • рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЙрдк-рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВред

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


рдХреЛрдИ рдФрд░ рднреА рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ред

рд╢реЛрд░


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

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

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

рд╢реЛрд░ рдмрдирд╛рд╡рдЯ


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


рдирд┐рд░реНрдмрд╛рдз рд░реВрдк рд╕реЗ рдкрд░реНрд▓рд┐рди рд╢реЛрд░ рдХреА рдмрдирд╛рд╡рдЯ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдКрдкрд░ рджрд┐рдЦрд╛рдИ рдЧрдИ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдкрд░реНрд▓рд┐рди рдХреА рдореВрд▓ рд░реВрдк рд╕реЗ рдпреБрдЧреНрдорд┐рдд рдмрд╣реБ-рдЖрд╡реГрддреНрддрд┐ рд╢реЛрд░ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдПрдХ рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдЗрдореЗрдЬ рд╣реИред рдЗрд╕рдХрд╛ рдФрд╕рдд рдорд╛рди 0.5 рд╣реИ, рдФрд░ рдЪрд░рдо рдорд╛рди 0 рдФрд░ 1 рддрдХ рд╣реИред

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

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


рдПрдХ рдореЗрдВ рдЪрд╛рд░ред

рдЗрд╕ рддрд░рд╣ рдХреА рдмрдирд╛рд╡рдЯ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ?
рдореИрдВрдиреЗ рдирдВрдмрд░рдлреНрд▓реЛ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдмрдирд╛рд╡рдЯ рд╕рдВрдкрд╛рджрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдПрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИред

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

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



рдЖрдпрд╛рддрд┐рдд рд╢реЛрд░ рдмрдирд╛рд╡рдЯред

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

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

рд╢реЛрд░ рдХрд╛ рдирдореВрдирд╛


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

  public static Texture2D noiseSource; 

рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдШрдЯрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╕рдВрдкрд╛рджрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдмрдирд╛рд╡рдЯ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдордзреНрдпрд╕реНрде рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо HexGrid рдЙрдкрдпреЛрдЧ HexGrid ред рдЪреВрдВрдХрд┐ HexGrid рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛, рдпрд╣ рдареАрдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЗрд╕рдХреА Awake рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрдирд╛рд╡рдЯ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

  public Texture2D noiseSource; void Awake () { HexMetrics.noiseSource = noiseSource; тАж } 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг Play рдореЛрдб рдореЗрдВ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рд╕реЗ рдирд╣реАрдВ рдмрдЪреЗрдЧрд╛ред рд╕реНрдЯреИрдЯрд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдПрдХрддрд╛ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, OnEnable рдЗрд╡реЗрдВрдЯ рдкрджреНрдзрддрд┐ рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЛ рдкреБрди: рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред

  void OnEnable () { HexMetrics.noiseSource = noiseSource; } 


рдПрдХ рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред

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

  public static Vector4 SampleNoise (Vector3 position) { } 

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

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рд░рдВрдЧ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ 4D рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдХрдореА рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рд╣рдо рд╕реАрдзреЗ рд░рдВрдЧ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ (Vector4) рд╕рд╣рд┐рддред

  public static Vector4 SampleNoise (Vector3 position) { return noiseSource.GetPixelBilinear(position.x, position.z); } 

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

unitypackage

рд╡рд░реНрдЯреЗрдХреНрд╕ рдЖрдВрджреЛрд▓рди


рд╣рдо рдЫрддреНрддреЗ рдХреА рд╣рдорд╛рд░реА рдЪрд┐рдХрдиреА рдЧреНрд░рд┐рдб рдХреЛ рд╡рд┐рдХреГрдд рдХрд░реЗрдВрдЧреЗ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдиреЗ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реБрдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП Perturb рдкрджреНрдзрддрд┐ рдХреЛ Perturb ред рдпрд╣ рдПрдХ unmoving рдмрд┐рдВрджреБ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдПрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рд╢реЛрд░ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╕рдордп рдПрдХ рдЧреИрд░-рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдмрд┐рдВрджреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

  Vector3 Perturb (Vector3 position) { Vector4 sample = HexMetrics.SampleNoise(position); } 

рдЖрдЗрдП рдмрд╕ рд╢реЛрд░ рдХреЗ рдирдореВрдиреЗ X, Y рдФрд░ Z рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдВрджреБ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд╕реАрдзреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

  Vector3 Perturb (Vector3 position) { Vector4 sample = HexMetrics.SampleNoise(position); position.x += sample.x; position.y += sample.y; position.z += sample.z; return position; } 

рд╣рдо рд╕рднреА рдХреЛрдиреЗ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HexMesh рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдХреИрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ? AddTriangle рдФрд░ AddQuad рдореЗрдВ рд╕реВрдЪреА рдореЗрдВ рд╢реАрд░реНрд╖ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЛ рдмрджрд▓рдХрд░ред рдЪрд▓реЛ рдХрд░рддреЗ рд╣реИрдВред

  void AddTriangle (Vector3 v1, Vector3 v2, Vector3 v3) { int vertexIndex = vertices.Count; vertices.Add(Perturb(v1)); vertices.Add(Perturb(v2)); vertices.Add(Perturb(v3)); тАж } void AddQuad (Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4) { int vertexIndex = vertices.Count; vertices.Add(Perturb(v1)); vertices.Add(Perturb(v2)); vertices.Add(Perturb(v3)); vertices.Add(Perturb(v4)); тАж } 

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


рдХреЛрдиреЗ рдпрд╛ рддреЛ рдЪрд▓реЗ рдЧрдП рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

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

  Vector3 Perturb (Vector3 position) { Vector4 sample = HexMetrics.SampleNoise(position); position.x += sample.x * 2f - 1f; position.y += sample.y * 2f - 1f; position.z += sample.z * 2f - 1f; return position; } 


рдХреЗрдиреНрджреНрд░рд┐рдд рд╡рд┐рд╕реНрдерд╛рдкрдиред

рд╡рд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдкрд░рд┐рдорд╛рдг (рдмрд▓)


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

рд╕рдорд╛рдзрд╛рди HexMetrics рд▓рд┐рдП рдПрдХ HexMetrics рдкреИрд░рд╛рдореАрдЯрд░ HexMetrics рддрд╛рдХрд┐ рдЖрдк рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░ рд╕рдХреЗрдВред рдЖрдЗрдП рдмрд▓ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ 5. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЕрдзрд┐рдХрддрдо рд╡рд┐рд╕реНрдерд╛рдкрди тЙИ75 6 8.66 рдЗрдХрд╛рдИ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

  public const float cellPerturbStrength = 5f; 

рд╣рдо HexMesh.Perturb рдореЗрдВ рдирдореВрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдмрд▓ рд▓рд╛рдЧреВ HexMesh.Perturb ред

  Vector3 Perturb (Vector3 position) { Vector4 sample = HexMetrics.SampleNoise(position); position.x += (sample.x * 2f - 1f) * HexMetrics.cellPerturbStrength; position.y += (sample.y * 2f - 1f) * HexMetrics.cellPerturbStrength; position.z += (sample.z * 2f - 1f) * HexMetrics.cellPerturbStrength; return position; } 



рдмрдврд╝реА рд╣реБрдИ рддрд╛рдХрддред

рд╢реЛрд░ рдкреИрдорд╛рдирд╛


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

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


10 рд╕реЗ 10 рдЧреНрд░рд┐рдб рдУрд╡рд░рд▓реИрдк рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдкрдВрдХреНрддрд┐рдпрд╛рдБред

рд╣рдореЗрдВ рд╢реЛрд░ рдХреЗ рдирдореВрдиреЗ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдмрдирд╛рд╡рдЯ рдмрд╣реБрдд рдмрдбрд╝реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХрд╡рд░ рдХрд░реЗред рдЪрд▓реЛ рдЗрд╕ рдкреИрдорд╛рдиреЗ рдХреЛ HexMetrics рдФрд░ рдЗрд╕реЗ 0.003 рдХрд╛ рдорд╛рди рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдХрд╛рд░рдХ рджреНрд╡рд╛рд░рд╛ рдирдореВрдиреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рддреЗ рд╣реИрдВред

  public const float noiseScale = 0.003f; public static Vector4 SampleNoise (Vector3 position) { return noiseSource.GetPixelBilinear( position.x * noiseScale, position.z * noiseScale ); } 

рдпрд╣ рдЕрдЪрд╛рдирдХ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдмрдирд╛рд╡рдЯ 333 & frac13; рд╡рд░реНрдЧ рдЗрдХрд╛рдЗрдпрд╛рдБ, рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд╛рдиреАрдп рдЕрдЦрдВрдбрддрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИред



рд╢реЛрд░ рдордЪрд╛рдпрд╛ред

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

unitypackage

рд╕реЗрд▓ рдХреЗрдВрджреНрд░реЛрдВ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдирд╛


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


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

рдЪреМрд░рд╛рд╣реЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреЛ рд╕рдкрд╛рдЯ рдмрдирд╛рдирд╛ рд╣реИред рдЪрд▓реЛ HexMesh.Perturb рдореЗрдВ Y рд╕рдордиреНрд╡рдп рдХреЛ рди рдмрджрд▓реЗрдВред

  Vector3 Perturb (Vector3 position) { Vector4 sample = HexMetrics.SampleNoise(position); position.x += (sample.x * 2f - 1f) * HexMetrics.cellPerturbStrength; // position.y += (sample.y * 2f - 1f) * HexMetrics.cellPerturbStrength; position.z += (sample.z * 2f - 1f) * HexMetrics.cellPerturbStrength; return position; } 


рд╕рдВрд░реЗрдЦрд┐рдд рдХреЛрд╢рд┐рдХрд╛рдПрдВред

рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде, рд╕рднреА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд┐рддрд┐ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдВрдЧреА, рджреЛрдиреЛрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдФрд░ рдЕрдЧреБрд╡рд╛рдИ рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ XZ рд╡рд┐рдорд╛рди рдореЗрдВ тЙИ50 this 7.07 рдХреЗ рдЕрдзрд┐рдХрддрдо рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред

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

рд╕реЗрд▓ рдХреА рдКрдБрдЪрд╛рдИ рдкрд░ рдЬрд╛рдПрдБ


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

  public const float elevationPerturbStrength = 1.5f; 

HexCell.Elevation рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕реЗрд▓ рдХреЗ рд╡рд░реНрдЯрд┐рдХрд▓ рдкреЛрдЬрд┐рд╢рди рдореЗрдВ рдпрд╣ рдореВрд╡ HexCell.Elevation ред

  public int Elevation { get { return elevation; } set { elevation = value; Vector3 position = transform.localPosition; position.y = value * HexMetrics.elevationStep; position.y += (HexMetrics.SampleNoise(position).y * 2f - 1f) * HexMetrics.elevationPerturbStrength; transform.localPosition = position; Vector3 uiPosition = uiRect.localPosition; uiPosition.z = -position.y; uiRect.localPosition = uiPosition; } } 

рдЗрд╕ рдХрджрдо рдХреЛ рддреБрд░рдВрдд рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ HexGrid.CreateCell рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреА рдКрдВрдЪрд╛рдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЧреНрд░рд┐рдб рд╢реБрд░реВ рдореЗрдВ рд╕рдкрд╛рдЯ рд╣реЛрдЧрд╛ред UI рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдЕрдВрдд рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред

  void CreateCell (int x, int z, int i) { тАж cell.Elevation = 0; } 



рджрд░рд╛рд░реЗрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрдерд╛рдкрд┐рдд рдКрдВрдЪрд╛рдЗрдпреЛрдВред

рд╕рдорд╛рди рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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

  public Vector3 Position { get { return transform.localPosition; } } 

рдЕрдм рд╣рдо рд╕реЗрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HexMesh.Triangulate рдореЗрдВ рдЗрд╕ рдЧреБрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  void Triangulate (HexDirection direction, HexCell cell) { Vector3 center = cell.Position; тАж } 

рдФрд░ рдЬрдм рд╣рдо рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдкрджреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ TriangulateConnection рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  void TriangulateConnection ( HexDirection direction, HexCell cell, Vector3 v1, Vector3 v2 ) { тАж Vector3 bridge = HexMetrics.GetBridge(direction); Vector3 v3 = v1 + bridge; Vector3 v4 = v2 + bridge; v3.y = v4.y = neighbor.Position.y; тАж HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (direction <= HexDirection.E && nextNeighbor != null) { Vector3 v5 = v2 + HexMetrics.GetBridge(direction.Next()); v5.y = nextNeighbor.Position.y; тАж } } 


рд╕реЗрд▓ рдКрдВрдЪрд╛рдИ рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧред

unitypackage

рд╕реЗрд▓ рдПрдЬ рдпреВрдирд┐рдЯ


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


рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреГрд╢реНрдпрдорд╛рди рд╣реЗрдХреНрд╕рд╛рдЧреЛрдирд▓ рдХреЛрд╢рд┐рдХрд╛рдПрдВред

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

  void Triangulate (HexDirection direction, HexCell cell) { Vector3 center = cell.Position; Vector3 v1 = center + HexMetrics.GetFirstSolidCorner(direction); Vector3 v2 = center + HexMetrics.GetSecondSolidCorner(direction); Vector3 e1 = Vector3.Lerp(v1, v2, 0.5f); AddTriangle(center, v1, e1); AddTriangleColor(cell.color); AddTriangle(center, e1, v2); AddTriangleColor(cell.color); if (direction <= HexDirection.SE) { TriangulateConnection(direction, cell, v1, v2); } } 


рдЫрд╣ рдХреЗ рдмрдЬрд╛рдп рдмрд╛рд░рд╣ рдкрдХреНрд╖ред

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

  Vector3 e1 = Vector3.Lerp(v1, v2, 1f / 3f); Vector3 e2 = Vector3.Lerp(v1, v2, 2f / 3f); AddTriangle(center, v1, e1); AddTriangleColor(cell.color); AddTriangle(center, e1, e2); AddTriangleColor(cell.color); AddTriangle(center, e2, v2); AddTriangleColor(cell.color); 


18 рдкрдХреНрд╖ред

рд░рд┐рдм рдЬреЙрдЗрдВрдЯ рдбрд┐рд╡реАрдЬрди


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

  if (direction <= HexDirection.SE) { TriangulateConnection(direction, cell, v1, e1, e2, v2); } 

TriangulateConnection рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХреЗред

  void TriangulateConnection ( HexDirection direction, HexCell cell, Vector3 v1, Vector3 e1, Vector3 e2, Vector3 v2 ) { тАж } 

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

  Vector3 bridge = HexMetrics.GetBridge(direction); Vector3 v3 = v1 + bridge; Vector3 v4 = v2 + bridge; v3.y = v4.y = neighbor.Position.y; Vector3 e3 = Vector3.Lerp(v3, v4, 1f / 3f); Vector3 e4 = Vector3.Lerp(v3, v4, 2f / 3f); 

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

  if (cell.GetEdgeType(direction) == HexEdgeType.Slope) { TriangulateEdgeTerraces(v1, v2, cell, v3, v4, neighbor); } else { AddQuad(v1, e1, v3, e3); AddQuadColor(cell.color, neighbor.color); AddQuad(e1, e2, e3, e4); AddQuadColor(cell.color, neighbor.color); AddQuad(e2, v2, e4, v4); AddQuadColor(cell.color, neighbor.color); } 


рдЙрдкрд╡рд┐рднрд╛рдЬрд┐рдд рдХрдиреЗрдХреНрд╢рдиред

рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рдорд┐рд▓рди


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

 using UnityEngine; public struct EdgeVertices { public Vector3 v1, v2, v3, v4; } 

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

рдЗрд╕рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдмрд┐рдВрджреБрдУрдВ рдХреА рдЧрдгрдирд╛ рд╕реЗ рдирд┐рдкрдЯреЗрдЧрд╛ред

  public EdgeVertices (Vector3 corner1, Vector3 corner2) { v1 = corner1; v2 = Vector3.Lerp(corner1, corner2, 1f / 3f); v3 = Vector3.Lerp(corner1, corner2, 2f / 3f); v4 = corner2; } 

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

  void TriangulateEdgeFan (Vector3 center, EdgeVertices edge, Color color) { AddTriangle(center, edge.v1, edge.v2); AddTriangleColor(color); AddTriangle(center, edge.v2, edge.v3); AddTriangleColor(color); AddTriangle(center, edge.v3, edge.v4); AddTriangleColor(color); } 

рдФрд░ рджреЛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЪрддреБрд╖реНрдХреЛрдг рдХреА рдПрдХ рдкрдЯреНрдЯреА рдХреЛ рддреНрд░рд┐рднреБрдЬ рдмрдирд╛рдиреЗ рдХреА рдПрдХ рд╡рд┐рдзрд┐ред

  void TriangulateEdgeStrip ( EdgeVertices e1, Color c1, EdgeVertices e2, Color c2 ) { AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); AddQuadColor(c1, c2); AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); AddQuadColor(c1, c2); AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); AddQuadColor(c1, c2); } 

рдпрд╣ рд╣рдореЗрдВ Triangulate рдкрджреНрдзрддрд┐ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

  void Triangulate (HexDirection direction, HexCell cell) { Vector3 center = cell.Position; EdgeVertices e = new EdgeVertices( center + HexMetrics.GetFirstSolidCorner(direction), center + HexMetrics.GetSecondSolidCorner(direction) ); TriangulateEdgeFan(center, e, cell.color); if (direction <= HexDirection.SE) { TriangulateConnection(direction, cell, e); } } 

рдЪрд▓рд┐рдП TriangulateConnection рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдЕрдм рд╣рдо TriangulateEdgeStrip рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд╣рд╛рдВ рд╣рдо v1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗ, рд╣рдореЗрдВ e1.v1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, v2 e1.v4 рдмрди рдЬрд╛рддрд╛ рд╣реИ, v3 e2.v1 рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ v4 e2.v4 рдмрди рдЬрд╛рддрд╛ рд╣реИред

  void TriangulateConnection ( HexDirection direction, HexCell cell, EdgeVertices e1 ) { HexCell neighbor = cell.GetNeighbor(direction); if (neighbor == null) { return; } Vector3 bridge = HexMetrics.GetBridge(direction); bridge.y = neighbor.Position.y - cell.Position.y; EdgeVertices e2 = new EdgeVertices( e1.v1 + bridge, e1.v4 + bridge ); if (cell.GetEdgeType(direction) == HexEdgeType.Slope) { TriangulateEdgeTerraces(e1.v1, e1.v4, cell, e2.v1, e2.v4, neighbor); } else { TriangulateEdgeStrip(e1, cell.color, e2, neighbor.color); } HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (direction <= HexDirection.E && nextNeighbor != null) { Vector3 v5 = e1.v4 + HexMetrics.GetBridge(direction.Next()); v5.y = nextNeighbor.Position.y; if (cell.Elevation <= neighbor.Elevation) { if (cell.Elevation <= nextNeighbor.Elevation) { TriangulateCorner( e1.v4, cell, e2.v4, neighbor, v5, nextNeighbor ); } else { TriangulateCorner( v5, nextNeighbor, e1.v4, cell, e2.v4, neighbor ); } } else if (neighbor.Elevation <= nextNeighbor.Elevation) { TriangulateCorner( e2.v4, neighbor, v5, nextNeighbor, e1.v4, cell ); } else { TriangulateCorner( v5, nextNeighbor, e1.v4, cell, e2.v4, neighbor ); } } 

рд▓реЗрдбрд┐рдЬ рдбрд┐рд╡реАрдЬрди


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

  if (cell.GetEdgeType(direction) == HexEdgeType.Slope) { TriangulateEdgeTerraces(e1, cell, e2, neighbor); } 

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

  void TriangulateEdgeTerraces ( EdgeVertices begin, HexCell beginCell, EdgeVertices end, HexCell endCell ) { EdgeVertices e2 = EdgeVertices.TerraceLerp(begin, end, 1); Color c2 = HexMetrics.TerraceLerp(beginCell.color, endCell.color, 1); TriangulateEdgeStrip(begin, beginCell.color, e2, c2); for (int i = 2; i < HexMetrics.terraceSteps; i++) { EdgeVertices e1 = e2; Color c1 = c2; e2 = EdgeVertices.TerraceLerp(begin, end, i); c2 = HexMetrics.TerraceLerp(beginCell.color, endCell.color, i); TriangulateEdgeStrip(e1, c1, e2, c2); } TriangulateEdgeStrip(e2, c2, end, endCell.color); } 

EdgeVertices.TerraceLerp рд╡рд┐рдзрд┐ рдмрд╕ рджреЛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ EdgeVertices.TerraceLerp рд╕рднреА рдЪрд╛рд░ рдЬреЛрдбрд╝реЗ рдХреЗ рдмреАрдЪ рдХреА EdgeVertices.TerraceLerp рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рддреА рд╣реИред

  public static EdgeVertices TerraceLerp ( EdgeVertices a, EdgeVertices b, int step) { EdgeVertices result; result.v1 = HexMetrics.TerraceLerp(a.v1, b.v1, step); result.v2 = HexMetrics.TerraceLerp(a.v2, b.v2, step); result.v3 = HexMetrics.TerraceLerp(a.v3, b.v3, step); result.v4 = HexMetrics.TerraceLerp(a.v4, b.v4, step); return result; } 


рдЙрдкрд╡рд┐рднрд╛рдЬрд┐рдд рдЕрдЧреБрд╡рд╛рдИред

unitypackage

рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдФрд░ рдкреБрд▓реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ


рдЕрдм рддрдХ, рд╣рдордиреЗ рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдФрд░ рдкрдЯреНрдЯрд┐рдпреЛрдВ рдХреЗ рдЬрдВрдХреНрд╢рди рдореЗрдВ рджрд░рд╛рд░реЗрдВ рдХреА рдЕрдирджреЗрдЦреА рдХреА рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рдкрд╣рд▓реЗ рдЪрдЯреНрдЯрд╛рди-рдврд▓рд╛рди-рдврд▓рд╛рди (OSS) рдФрд░ рдврд▓рд╛рди-рдЪрдЯреНрдЯрд╛рди-рдврд▓рд╛рди (SOS) рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВред


рдореЗрд╖ рдЫреЗрджред

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

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

  void AddTriangleUnperturbed (Vector3 v1, Vector3 v2, Vector3 v3) { int vertexIndex = vertices.Count; vertices.Add(v1); vertices.Add(v2); vertices.Add(v3); triangles.Add(vertexIndex); triangles.Add(vertexIndex + 1); triangles.Add(vertexIndex + 2); } 

TriangulateBoundaryTriangle рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рд╡рд╣ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рд╕реАрдорд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╕реАрдорд╛ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред

  void TriangulateBoundaryTriangle ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 boundary, Color boundaryColor ) { Vector3 v2 = HexMetrics.TerraceLerp(begin, left, 1); Color c2 = HexMetrics.TerraceLerp(beginCell.color, leftCell.color, 1); AddTriangleUnperturbed(Perturb(begin), Perturb(v2), boundary); AddTriangleColor(beginCell.color, c2, boundaryColor); for (int i = 2; i < HexMetrics.terraceSteps; i++) { Vector3 v1 = v2; Color c1 = c2; v2 = HexMetrics.TerraceLerp(begin, left, i); c2 = HexMetrics.TerraceLerp(beginCell.color, leftCell.color, i); AddTriangleUnperturbed(Perturb(v1), Perturb(v2), boundary); AddTriangleColor(c1, c2, boundaryColor); } AddTriangleUnperturbed(Perturb(v2), Perturb(left), boundary); AddTriangleColor(c2, leftCell.color, boundaryColor); } 

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

  void TriangulateBoundaryTriangle ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 boundary, Color boundaryColor ) { Vector3 v2 = Perturb(HexMetrics.TerraceLerp(begin, left, 1)); Color c2 = HexMetrics.TerraceLerp(beginCell.color, leftCell.color, 1); AddTriangleUnperturbed(Perturb(begin), v2, boundary); AddTriangleColor(beginCell.color, c2, boundaryColor); for (int i = 2; i < HexMetrics.terraceSteps; i++) { Vector3 v1 = v2; Color c1 = c2; v2 = Perturb(HexMetrics.TerraceLerp(begin, left, i)); c2 = HexMetrics.TerraceLerp(beginCell.color, leftCell.color, i); AddTriangleUnperturbed(v1, v2, boundary); AddTriangleColor(c1, c2, boundaryColor); } AddTriangleUnperturbed(v2, Perturb(left), boundary); AddTriangleColor(c2, leftCell.color, boundaryColor); } 


рдмреЗрдорд┐рд╕рд╛рд▓ рд╕реАрдорд╛рдПрдБред

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

  Vector3 boundary = Vector3.Lerp(Perturb(begin), Perturb(right), b); 

TriangulateCornerCliffTerraces рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рддреНрдп рд╣реИред

  Vector3 boundary = Vector3.Lerp(Perturb(begin), Perturb(left), b); 


рдЫреЗрдж рд╣реЛ рдЧрдП рд╣реИрдВред

рдбрдмрд▓ рдЪрдЯреНрдЯрд╛рди рдФрд░ рдврд▓рд╛рди


рд╢реЗрд╖ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рджреЛ рдЪрдЯреНрдЯрд╛рдиреЗрдВ рдФрд░ рдПрдХ рдврд▓рд╛рди рдореМрдЬреВрдж рд╣реИрдВред


рдПрдХрд▓ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдХрд╛рд░рдг рдмрдбрд╝рд╛ рдЫреЗрджред

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ TriangulateCornerTerracesCliff рдХреЗ рдЕрдВрдд рдореЗрдВ else рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХрд▓ рддреНрд░рд┐рднреБрдЬ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХреА рдЧрдИ рд╣реИред

  else { AddTriangleUnperturbed(Perturb(left), Perturb(right), boundary); AddTriangleColor(leftCell.color, rightCell.color, boundaryColor); } 

рд╡рд╣реА TriangulateCornerCliffTerraces рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред

  else { AddTriangleUnperturbed(Perturb(left), Perturb(right), boundary); AddTriangleColor(leftCell.color, rightCell.color, boundaryColor); } 


рдирд╡реАрдирддрдо рджрд░рд╛рд░реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред

unitypackage

рдкреБрдирд░реНрдирд┐рдорд╛рдг


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



рдЕрд╡рд┐рднрд╛рдЬрд┐рдд рдФрд░ рд╡рд┐рдХреГрдд рдореЗрд╖ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд▓ 5 рдмрд╣реБрдд рдорд╣рд╛рди рд╣реИред


рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╡рд┐рдХреГрддрд┐ 0 рд╕реЗ 5 рддрдХ рд╣реИред

рдЪрд▓реЛ рдЧреНрд░рд┐рдб рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ 4 рддрдХ рдХрдо рдХрд░реЗрдВ, рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕рд╣реА рдХрд┐рдПред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрддрдо XZ рдСрдлрд╕реЗрдЯ тЙИ32 units 5.66 рдпреВрдирд┐рдЯ рд╣реЛрдЧрд╛ред

  public const float cellPerturbStrength = 4f; 


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


0.75 рд╕реЗ 0.95 рддрдХ рдЕрдЦрдВрдбрддрд╛ рдХрд╛ рдЧреБрдгрд╛рдВрдХред

0.8 рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЗ рдЧреБрдгрд╛рдВрдХ рдореЗрдВ рдереЛрдбрд╝реА рд╡реГрджреНрдзрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХрд░реЗрдЧреАред

  public const float solidFactor = 0.8f; 


рдЕрдЦрдВрдбрддрд╛ рдХрд╛ рдЧреБрдгрд╛рдВрдХ 0.8ред

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

  public const float elevationStep = 3f; 


рдкрд┐рдЪ рдХрдо рд╣реЛ рдЧрдИ рд╣реИ 3.

рд╣рдо рдкрд┐рдЪ рд╡рд┐рд░реВрдкрдг рдХреА рддрд╛рдХрдд рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕рдХрд╛ рдореВрд▓реНрдп 1.5 рд╣реИ, рдЬреЛ рдКрдВрдЪрд╛рдИ рдореЗрдВ рдЖрдзрд╛ рдХрджрдо рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред

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


рд╣рдо рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЗ рд╕рд╛рдд рд╕реНрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

unitypackage

рднрд╛рдЧ 5: рдмрдбрд╝реЗ рдХрд╛рд░реНрдб


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

рдЕрднреА рддрдХ рд╣рдо рдмрд╣реБрдд рдЫреЛрдЯреЗ рдирдХреНрд╢реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕реЗ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред


рдЗрд╕рдореЗрдВ рдЬрд╝реВрдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдЬрд╛рд▓ рдХреЗ рдЯреБрдХрдбрд╝реЗ


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


рдЧреНрд░рд┐рдб рдХреЛ 3 рд╕реЗ 3 рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ред

рдЖрдЗрдП 5 рдХрд╛ рдЙрдкрдпреЛрдЧ 5 рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рдХрд░реЗрдВ, рдпрд╛рдиреА рдкреНрд░рддрд┐ рдЦрдВрдб 25 рдХреЛрд╢рд┐рдХрд╛рдПрдВред рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ HexMetricsред

  public const int chunkSizeX = 5, chunkSizeZ = 5; 

рдХрд┐рд╕ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЖрдХрд╛рд░ рдЙрдкрдпреБрдХреНрдд рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
. , . . , (frustum culling), . .

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

  public int chunkCountX = 4, chunkCountZ = 3; 

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

 // public int width = 6; // public int height = 6; int cellCountX, cellCountZ; 



рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдЖрдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред

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

  void Awake () { HexMetrics.noiseSource = noiseSource; gridCanvas = GetComponentInChildren<Canvas>(); hexMesh = GetComponentInChildren<HexMesh>(); cellCountX = chunkCountX * HexMetrics.chunkSizeX; cellCountZ = chunkCountZ * HexMetrics.chunkSizeZ; CreateCells(); } void CreateCells () { cells = new HexCell[cellCountZ * cellCountX]; for (int z = 0, i = 0; z < cellCountZ; z++) { for (int x = 0; x < cellCountX; x++) { CreateCell(x, z, i++); } } } 

рднрдЧрджрдбрд╝ рдкреНрд░реАрдлрд╝рдм


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

 using UnityEngine; using UnityEngine.UI; public class HexGridChunk : MonoBehaviour { } 

рдЖрдЧреЗ рд╣рдо рдПрдХ рдкреНрд░реАрдлреИрдм рдЯреБрдХрдбрд╝рд╛ рдмрдирд╛рдПрдВрдЧреЗред рд╣рдо рд╣реЗрдХреНрд╕ рдЧреНрд░рд┐рдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдХреЗ рдФрд░ рд╣реЗрдХреНрд╕ рдЧреНрд░рд┐рдб рдЪрдВрдХ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ ред рдЗрд╕рдХреЗ рдШрдЯрдХ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдВ HexGridрдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВ HexGridChunkред рдлрд┐рд░ рдЗрд╕реЗ рдкреНрд░реАрдлрд╝реИрдм рдореЗрдВ рдмрджрд▓ рджреЗрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реАрди рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред



рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреИрдирд╡рд╛рд╕ рдФрд░ рдЬрд╛рд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░реАрдлрд╝реИрдмред

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

  public HexGridChunk chunkPrefab; 


рдЕрдм рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рдеред

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

  HexGridChunk[] chunks; void Awake () { тАж CreateChunks(); CreateCells(); } void CreateChunks () { chunks = new HexGridChunk[chunkCountX * chunkCountZ]; for (int z = 0, i = 0; z < chunkCountZ; z++) { for (int x = 0; x < chunkCountX; x++) { HexGridChunk chunk = chunks[i++] = Instantiate(chunkPrefab); chunk.transform.SetParent(transform); } } } 

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

 public class HexGridChunk : MonoBehaviour { HexCell[] cells; HexMesh hexMesh; Canvas gridCanvas; void Awake () { gridCanvas = GetComponentInChildren<Canvas>(); hexMesh = GetComponentInChildren<HexMesh>(); cells = new HexCell[HexMetrics.chunkSizeX * HexMetrics.chunkSizeZ]; } void Start () { hexMesh.Triangulate(cells); } } 

рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдирд┐рд░реБрдкрд┐рдд


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

  void CreateCell (int x, int z, int i) { тАж HexCell cell = cells[i] = Instantiate<HexCell>(cellPrefab); // cell.transform.SetParent(transform, false); cell.transform.localPosition = position; cell.coordinates = HexCoordinates.FromOffsetCoordinates(x, z); cell.color = defaultColor; тАж Text label = Instantiate<Text>(cellLabelPrefab); // label.rectTransform.SetParent(gridCanvas.transform, false); label.rectTransform.anchoredPosition = new Vector2(position.x, position.z); label.text = cell.coordinates.ToStringOnSeparateLines(); cell.uiRect = label.rectTransform; cell.Elevation = 0; AddCellToChunk(x, z, cell); } void AddCellToChunk (int x, int z, HexCell cell) { } 

рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ xрдФрд░ zрдЦрдВрдб рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рдЯреБрдХрдбрд╝рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

  void AddCellToChunk (int x, int z, HexCell cell) { int chunkX = x / HexMetrics.chunkSizeX; int chunkZ = z / HexMetrics.chunkSizeZ; HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; } 

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

  void AddCellToChunk (int x, int z, HexCell cell) { int chunkX = x / HexMetrics.chunkSizeX; int chunkZ = z / HexMetrics.chunkSizeZ; HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; int localX = x - chunkX * HexMetrics.chunkSizeX; int localZ = z - chunkZ * HexMetrics.chunkSizeZ; chunk.AddCell(localX + localZ * HexMetrics.chunkSizeX, cell); } 

рддрдм рдпрд╣ HexGridChunk.AddCellрд╕реЗрд▓ рдХреЛ рдЕрдкрдиреЗ рд╕рд░рдгреА рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпрд╣ рд╕реЗрд▓ рдФрд░ рдЙрд╕рдХреЗ UI рдХреЗ рд▓рд┐рдП рдореВрд▓ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

  public void AddCell (int index, HexCell cell) { cells[index] = cell; cell.transform.SetParent(transform, false); cell.uiRect.SetParent(gridCanvas.transform, false); } 

рдорд┐рдЯрд╛рдирд╛


рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╡рд╣ HexGridрдЕрдкрдиреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рдХреИрдирд╡рд╛рд╕ рдФрд░ рд╖рдЯреНрднреБрдЬ рдЬрд╛рд▓ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреЛрдб рднреАред

 // Canvas gridCanvas; // HexMesh hexMesh; void Awake () { HexMetrics.noiseSource = noiseSource; // gridCanvas = GetComponentInChildren<Canvas>(); // hexMesh = GetComponentInChildren<HexMesh>(); тАж } // void Start () { // hexMesh.Triangulate(cells); // } // public void Refresh () { // hexMesh.Triangulate(cells); // } 

рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ Refresh, рд╣рдореЗрдВ HexMapEditorрдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

  void EditCell (HexCell cell) { cell.color = activeColor; cell.Elevation = activeElevation; // hexGrid.Refresh(); } 


рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреА рд╕рд╛рдл рдЧреНрд░рд┐рдбред

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


рдкреНрд▓реЗ рдореЛрдб рдореЗрдВ рдмрд╛рд▓ рдЯреБрдХрдбрд╝реЗред

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



рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реЗрд▓ рд▓реЗрдмрд▓ред

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

рд╕реЗрд▓ рд╕рдВрдкрд╛рджрди рдареАрдХ рдХрд░реЗрдВ


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

  public void Refresh () { hexMesh.Triangulate(cells); } 

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

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

  public HexGridChunk chunk; 

HexGridChunk рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╕реЗрд▓ рдореЗрдВ рдЦреБрдж рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

  public void AddCell (int index, HexCell cell) { cells[index] = cell; cell.chunk = this; cell.transform.SetParent(transform, false); cell.uiRect.SetParent(gridCanvas.transform, false); } 

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

  void Refresh () { chunk.Refresh(); } 

рд╣рдореЗрдВ рдЗрд╕реЗ HexCell.Refreshрд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЗрд╕реЗ рдмрджрд▓рд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рд╕реЗрд▓ рд╕реНрд╡рдпрдВ рдмреЗрд╣рддрд░ рдЬрд╛рдирддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рджред

  public int Elevation { get { return elevation; } set { тАж Refresh(); } } 

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

  public int Elevation { get { return elevation; } set { if (elevation == value) { return; } тАж } } 

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

  int elevation = int.MinValue; 

Int.inValue рдХреНрдпрд╛ рд╣реИ?
, integer. C# integer тАФ
32- , 2 32 integer, , . .

тАФ тИТ2 31 = тИТ2 147 483 648. !

2 31 тИТ 1 = 2 147 483 647. 2 31 - .

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

  public Color Color { get { return color; } set { if (color == value) { return; } color = value; Refresh(); } } Color color; 

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

  void Refresh () { if (chunk) { chunk.Refresh(); } } 

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


рдЯреБрдХрдбрд╝реЛрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВред

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

  void Refresh () { if (chunk) { chunk.Refresh(); for (int i = 0; i < neighbors.Length; i++) { HexCell neighbor = neighbors[i]; if (neighbor != null && neighbor.chunk != chunk) { neighbor.chunk.Refresh(); } } } } 

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

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

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

рд╣рдо LateUpdateрдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВUpdate рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди рд╣реЛрддрд╛ рд╣реИред

  public void Refresh () { // hexMesh.Triangulate(cells); enabled = true; } void LateUpdate () { hexMesh.Triangulate(cells); enabled = false; } 

рдЕрджреНрдпрддрди рдФрд░ рд▓реЗрдЯрдЕрдк рдХреЗ рдмреАрдЪ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?
Update - . LateUpdate . , .

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

 // void Start () { // hexMesh.Triangulate(cells); // } 


10,000 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╡рд╛рд▓реЗ 20 рд╕реЗ 20 рдХреЗ рдЯреБрдХрдбрд╝реЗред

рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕реВрдЪреА


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

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

  static List<Vector3> vertices = new List<Vector3>(); static List<Color> colors = new List<Color>(); static List<int> triangles = new List<int>(); void Awake () { GetComponent<MeshFilter>().mesh = hexMesh = new Mesh(); meshCollider = gameObject.AddComponent<MeshCollider>(); hexMesh.name = "Hex Mesh"; // vertices = new List<Vector3>(); // colors = new List<Color>(); // triangles = new List<int>(); } 

рдХреНрдпрд╛ рд╕реНрдереИрддрд┐рдХ рд╕реВрдЪреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ?
. , , .

, . 20 20 100.

unitypackage

рдХреИрдорд░рд╛ рдирд┐рдпрдВрддреНрд░рдг


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

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


рдХреИрдорд░реЗ рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдоред

рдХреИрдорд░рд╛ рдХрд╛рдЬ (рдХреБрдВрдбрд╛) рдХрд╛ рд▓рдХреНрд╖реНрдп рдЙрд╕ рдХреЛрдг рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдХреИрдорд░рд╛ рдирдХреНрд╢реЗ рдкрд░ рджрд┐рдЦрддрд╛ рд╣реИред рдЖрдЗрдП рд╣рдо рдЗрд╕реЗ рдПрдХ рдореЛрдбрд╝ рджреЗрдВ (45, 0, 0)ред рд╣реИрдВрдбрд▓ (рд╕реНрдЯрд┐рдХ) рдЙрд╕ рджреВрд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдХреИрдорд░реЗ рд╕реНрдерд┐рдд рд╣реИрдВред рдЖрдЗрдП рдЙрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ (0, 0, -45)ред

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

 using UnityEngine; public class HexMapCamera : MonoBehaviour { Transform swivel, stick; void Awake () { swivel = transform.GetChild(0); stick = swivel.GetChild(0); } } 


рд╖рдЯреНрдХреЛрдг рдорд╛рдирдЪрд┐рддреНрд░ рдХреИрдорд░рд╛ред

рдЬрд╝реВрдо


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

  float zoom = 1f; 

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

  void Update () { float zoomDelta = Input.GetAxis("Mouse ScrollWheel"); if (zoomDelta != 0f) { AdjustZoom(zoomDelta); } } void AdjustZoom (float delta) { } 

рдЬрд╝реВрдо рд╕реНрддрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдЗрд╕рдореЗрдВ рдПрдХ рдбреЗрд▓реНрдЯрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдорд╛рди рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ (0-8)ред

  void AdjustZoom (float delta) { zoom = Mathf.Clamp01(zoom + delta); } 

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

  public float stickMinZoom, stickMaxZoom; 

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

  void AdjustZoom (float delta) { zoom = Mathf.Clamp01(zoom + delta); float distance = Mathf.Lerp(stickMinZoom, stickMaxZoom, zoom); stick.localPosition = new Vector3(0f, 0f, distance); } 



рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рд╕реНрдЯрд┐рдХ рдорд╛рдиред

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

  public float swivelMinZoom, swivelMaxZoom; 

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

  void AdjustZoom (float delta) { zoom = Mathf.Clamp01(zoom + delta); float distance = Mathf.Lerp(stickMinZoom, stickMaxZoom, zoom); stick.localPosition = new Vector3(0f, 0f, distance); float angle = Mathf.Lerp(swivelMinZoom, swivelMaxZoom, zoom); swivel.localRotation = Quaternion.Euler(angle, 0f, 0f); } 



рдХреБрдВрдбрд╛ рдХрд╛ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдпред

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


рдорд╛рдЙрд╕ рд╡реНрд╣реАрд▓ рдЗрдирдкреБрдЯ рд╡рд┐рдХрд▓реНрдкред

рд╡рд┐рд╕реНрдерд╛рдкрди


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

  void Update () { float zoomDelta = Input.GetAxis("Mouse ScrollWheel"); if (zoomDelta != 0f) { AdjustZoom(zoomDelta); } float xDelta = Input.GetAxis("Horizontal"); float zDelta = Input.GetAxis("Vertical"); if (xDelta != 0f || zDelta != 0f) { AdjustPosition(xDelta, zDelta); } } void AdjustPosition (float xDelta, float zDelta) { } 

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

  void AdjustPosition (float xDelta, float zDelta) { Vector3 position = transform.localPosition; position += new Vector3(xDelta, 0f, zDelta); transform.localPosition = position; } 

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

  public float moveSpeed; void AdjustPosition (float xDelta, float zDelta) { float distance = moveSpeed * Time.deltaTime; Vector3 position = transform.localPosition; position += new Vector3(xDelta, 0f, zDelta) * distance; transform.localPosition = position; } 


рдЧрддрд┐ рдмрдврд╝ рд░рд╣реА рд╣реИред

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

  void AdjustPosition (float xDelta, float zDelta) { Vector3 direction = new Vector3(xDelta, 0f, zDelta).normalized; float distance = moveSpeed * Time.deltaTime; Vector3 position = transform.localPosition; position += direction * distance; transform.localPosition = position; } 

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

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

  Vector3 direction = new Vector3(xDelta, 0f, zDelta).normalized; float damping = Mathf.Max(Mathf.Abs(xDelta), Mathf.Abs(zDelta)); float distance = moveSpeed * damping * Time.deltaTime; 


рдХреНрд╖реАрдгрди рдХреЗ рд╕рд╛рде рдЖрдВрджреЛрд▓рдиред

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

 // public float moveSpeed; public float moveSpeedMinZoom, moveSpeedMaxZoom; void AdjustPosition (float xDelta, float zDelta) { Vector3 direction = new Vector3(xDelta, 0f, zDelta).normalized; float damping = Mathf.Max(Mathf.Abs(xDelta), Mathf.Abs(zDelta)); float distance = Mathf.Lerp(moveSpeedMinZoom, moveSpeedMaxZoom, zoom) * damping * Time.deltaTime; Vector3 position = transform.localPosition; position += direction * distance; transform.localPosition = position; } 



рдЖрдВрджреЛрд▓рди рдХреА рдЧрддрд┐ рдЬрд╝реВрдо рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреА рд╣реИред

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

  public HexGrid grid; 


рдЧреНрд░рд┐рдб рдЖрдХрд╛рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

  void AdjustPosition (float xDelta, float zDelta) { тАж transform.localPosition = ClampPosition(position); } Vector3 ClampPosition (Vector3 position) { return position; } 

рд╕реНрдерд┐рддрд┐ X рдХрд╛ рдиреНрдпреВрдирддрдо рдорд╛рди 0 рд╣реИ, рдФрд░ рдЕрдзрд┐рдХрддрдо рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред

  Vector3 ClampPosition (Vector3 position) { float xMax = grid.chunkCountX * HexMetrics.chunkSizeX * (2f * HexMetrics.innerRadius); position.x = Mathf.Clamp(position.x, 0f, xMax); return position; } 

рдпрд╣реА рд╕реНрдерд┐рддрд┐ Z рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред

  Vector3 ClampPosition (Vector3 position) { float xMax = grid.chunkCountX * HexMetrics.chunkSizeX * (2f * HexMetrics.innerRadius); position.x = Mathf.Clamp(position.x, 0f, xMax); float zMax = grid.chunkCountZ * HexMetrics.chunkSizeZ * (1.5f * HexMetrics.outerRadius); position.z = Mathf.Clamp(position.z, 0f, zMax); return position; } 

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

  float xMax = (grid.chunkCountX * HexMetrics.chunkSizeX - 0.5f) * (2f * HexMetrics.innerRadius); position.x = Mathf.Clamp(position.x, 0f, xMax); 

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

  float zMax = (grid.chunkCountZ * HexMetrics.chunkSizeZ - 1) * (1.5f * HexMetrics.outerRadius); position.z = Mathf.Clamp(position.z, 0f, zMax); 

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

рдЖрдк рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рд╕реБрдирдиреЗ рд╕реЗ рдпреВрдЖрдИ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ EventSystem рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдХреЛрдИ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЗрд╡реЗрдВрдЯ рдирд╣реАрдВред

рдореЛрдбрд╝


рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЪрдЯреНрдЯрд╛рди рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рд╣реИ? рдХреИрдорд░реЗ рдХреЛ рдШреБрдорд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛! рдЖрдЗрдП рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

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

  public float rotationSpeed; void Update () { float zoomDelta = Input.GetAxis("Mouse ScrollWheel"); if (zoomDelta != 0f) { AdjustZoom(zoomDelta); } float rotationDelta = Input.GetAxis("Rotation"); if (rotationDelta != 0f) { AdjustRotation(rotationDelta); } float xDelta = Input.GetAxis("Horizontal"); float zDelta = Input.GetAxis("Vertical"); if (xDelta != 0f || zDelta != 0f) { AdjustPosition(xDelta, zDelta); } } void AdjustRotation (float delta) { } 



рдореБрдбрд╝рдиреЗ рдХреА рдЧрддрд┐ред

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


рдЗрдирдкреБрдЯ рдЕрдХреНрд╖ рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВред

рдореИрдВрдиреЗ рдПрдХрддрд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛, рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдЗрдирдкреБрдЯ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?
. Unity. , . , , .

рд░реЛрдЯреЗрд╢рди рдХреЛрдг рд╣рдо рдЯреНрд░реИрдХ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЕрдВрджрд░ рдмрджрд▓реЗрдВрдЧреЗ AdjustRotationред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдкреВрд░реЗ рдХреИрдорд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд░реЛрдЯреЗрдЯ рдХрд░реЗрдВрдЧреЗред

  float rotationAngle; void AdjustRotation (float delta) { rotationAngle += delta * rotationSpeed * Time.deltaTime; transform.localRotation = Quaternion.Euler(0f, rotationAngle, 0f); } 

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

  void AdjustRotation (float delta) { rotationAngle += delta * rotationSpeed * Time.deltaTime; if (rotationAngle < 0f) { rotationAngle += 360f; } else if (rotationAngle >= 360f) { rotationAngle -= 360f; } transform.localRotation = Quaternion.Euler(0f, rotationAngle, 0f); } 


рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдмрд╛рд░реАред

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

  void AdjustPosition (float xDelta, float zDelta) { Vector3 direction = transform.localRotation * new Vector3(xDelta, 0f, zDelta).normalized; тАж } 


рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд┐рд╕реНрдерд╛рдкрдиред

unitypackage

рдЙрдиреНрдирдд рд╕рдВрдкрд╛рджрди


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

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░рдВрдЧ рдФрд░ рдКрдВрдЪрд╛рдИ


рд╣рдо рдЯреЙрдЧрд▓ рд╕рдореВрд╣ рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдЪрдпрди рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдХрд░ рд░рдВрдЧреЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд░рдВрдЧ рд╕реНрд╡рд┐рдЪреЗрд╕ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓реЗрдмрд▓ рдХреЛ --- рдпрд╛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд░рдВрдЧ рдирд╣реАрдВ рд╣реИред рдлрд┐рд░ рдЗрд╕рдХреЗ рдСрди рд╡реИрд▓реНрдпреВ рдЪреЗрдВрдЬреЗрдб рдЗрд╡реЗрдВрдЯ рдХреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдХрд░ its1 рдХрд░ рджреЗрдВред


рдЕрдорд╛рдиреНрдп рд░рдВрдЧ рд╕реВрдЪрдХрд╛рдВрдХред

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

  bool applyColor; public void SelectColor (int index) { applyColor = index >= 0; if (applyColor) { activeColor = colors[index]; } } void EditCell (HexCell cell) { if (applyColor) { cell.Color = activeColor; } cell.Elevation = activeElevation; } 

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

  bool applyElevation = true; void EditCell (HexCell cell) { if (applyColor) { cell.Color = activeColor; } if (applyElevation) { cell.Elevation = activeElevation; } } 

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


рд╡реИрдХрд▓реНрдкрд┐рдХ рд░рдВрдЧ рдФрд░ рдКрдВрдЪрд╛рдИред

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

  public void SetApplyElevation (bool toggle) { applyElevation = toggle; } 

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


рд╣рдо рдКрдВрдЪрд╛рдИ рд╕реНрд╡рд┐рдЪ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

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


рд░рдВрдЧ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред

рд░рдВрдЧ рдЪреБрдирддреЗ рд╕рдордп рдКрдБрдЪрд╛рдИ рдХреНрдпреЛрдВ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ?
, toggle group. , , toggle group.

рдмреНрд░рд╢ рдХрд╛ рдЖрдХрд╛рд░


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

  int brushSize; public void SetBrushSize (float size) { brushSize = (int)size; } 


рдмреНрд░рд╢ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рд╕реНрд▓рд╛рдЗрдбрд░ред

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


рдмреНрд░рд╢ рдЖрдХрд╛рд░ рд╕реНрд▓рд╛рдЗрдбрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ред

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

  void HandleInput () { Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(inputRay, out hit)) { EditCells(hexGrid.GetCell(hit.point)); } } void EditCells (HexCell center) { } void EditCell (HexCell cell) { тАж } 

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


рддреНрд░рд┐рдЬреНрдпрд╛ рддрдХред 3.

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

  void EditCells (HexCell center) { int centerX = center.coordinates.X; int centerZ = center.coordinates.Z; } 

рд╣рдо рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЛ рдШрдЯрд╛рдХрд░ рдиреНрдпреВрдирддрдо Z рд╕рдордиреНрд╡рдп рдкрд╛рддреЗ рд╣реИрдВред рддреЛ рд╣рдо рд╢реВрдиреНрдп рд░реЗрдЦрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХреЗрдВрджреНрд░ рдореЗрдВ рд▓рд╛рдЗрди рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рддрдХ рд▓реВрдк рдХрд░рддреЗ рд╣реИрдВред

  void EditCells (HexCell center) { int centerX = center.coordinates.X; int centerZ = center.coordinates.Z; for (int r = 0, z = centerZ - brushSize; z <= centerZ; z++, r++) { } } 

рдиреАрдЪреЗ рдХреА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкрд╣рд▓реА рд╕реЗрд▓ рдореЗрдВ рдХреЗрдВрджреНрд░ рд╕реЗрд▓ рдХреЗ рд╕рдорд╛рди рдПрдХреНрд╕ рд╕рдордиреНрд╡рдп рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рдордиреНрд╡рдп рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдШрдЯрддрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рд╕реЗрд▓ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреЗрдВрджреНрд░ рд╕рдордиреНрд╡рдп рдкреНрд▓рд╕ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рдПрдХ рдПрдХреНрд╕ рд╕рдордиреНрд╡рдп рд╣реЛрддрд╛ рд╣реИред

рдЕрдм рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓реВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  for (int r = 0, z = centerZ - brushSize; z <= centerZ; z++, r++) { for (int x = centerX - r; x <= centerX + brushSize; x++) { EditCell(hexGrid.GetCell(new HexCoordinates(x, z))); } } 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ HexGrid.GetCellрд╕рдордиреНрд╡рдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрдирд╛рдПрдВред рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕реЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

  public HexCell GetCell (HexCoordinates coordinates) { int z = coordinates.Z; int x = coordinates.X + z / 2; return cells[x + z * cellCountX]; } 


рдмреНрд░рд╢ рдХрд╛ рдирд┐рдЪрд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛, рдЖрдХрд╛рд░ 2.

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

  void EditCells (HexCell center) { int centerX = center.coordinates.X; int centerZ = center.coordinates.Z; for (int r = 0, z = centerZ - brushSize; z <= centerZ; z++, r++) { for (int x = centerX - r; x <= centerX + brushSize; x++) { EditCell(hexGrid.GetCell(new HexCoordinates(x, z))); } } for (int r = 0, z = centerZ + brushSize; z > centerZ; z--, r++) { for (int x = centerX - brushSize; x <= centerX + r; x++) { EditCell(hexGrid.GetCell(new HexCoordinates(x, z))); } } } 


рд╕рдВрдкреВрд░реНрдг рдмреНрд░рд╢, рдЖрдХрд╛рд░ 2.

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

  public HexCell GetCell (HexCoordinates coordinates) { int z = coordinates.Z; if (z < 0 || z >= cellCountZ) { return null; } int x = coordinates.X + z / 2; if (x < 0 || x >= cellCountX) { return null; } return cells[x + z * cellCountX]; } 

рдирд▓-рд╕рдВрджрд░реНрдн-рдЕрдкрд╡рд╛рдж рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ HexMapEditorрд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╕реЗрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред

  void EditCell (HexCell cell) { if (cell) { if (applyColor) { cell.Color = activeColor; } if (applyElevation) { cell.Elevation = activeElevation; } } } 


рдХрдИ рдмреНрд░рд╢ рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

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


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

  public void ShowUI (bool visible) { gridCanvas.gameObject.SetActive(visible); } 

рдЖрдЗрдП рдпреВрдЖрдИ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВред

  void Awake () { gridCanvas = GetComponentInChildren<Canvas>(); hexMesh = GetComponentInChildren<HexMesh>(); cells = new HexCell[HexMetrics.chunkSizeX * HexMetrics.chunkSizeZ]; ShowUI(false); } 

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

  public void ShowUI (bool visible) { for (int i = 0; i < chunks.Length; i++) { chunks[i].ShowUI(visible); } } 

HexMapEditor рдЧреНрд░рд┐рдб рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИред

  public void ShowUI (bool visible) { hexGrid.ShowUI(visible); } 

рдЕрдВрдд рдореЗрдВ, рд╣рдо UI рдореЗрдВ рдПрдХ рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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

unitypackage

рднрд╛рдЧ 6: рдирджрд┐рдпрд╛рдБ


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

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


рдкрд╣рд╛рдбрд╝реЛрдВ рд╕реЗ рдирджрд┐рдпрд╛рдБ рдмрд╣рддреА рд╣реИрдВред

рдирджреА рдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдБ


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

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


рдкрд╛рдВрдЪ рд╕рдВрднрд╡ рдирджреА рд╡рд┐рдиреНрдпрд╛рд╕ред

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

рдирджреА рдХреА рдЯреНрд░реИрдХрд┐рдВрдЧ


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

  bool hasIncomingRiver, hasOutgoingRiver; 

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

  bool hasIncomingRiver, hasOutgoingRiver; HexDirection incomingRiver, outgoingRiver; 

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

  public bool HasIncomingRiver { get { return hasIncomingRiver; } } public bool HasOutgoingRiver { get { return hasOutgoingRiver; } } public HexDirection IncomingRiver { get { return incomingRiver; } } public HexDirection OutgoingRiver { get { return outgoingRiver; } } 

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

  public bool HasRiver { get { return hasIncomingRiver || hasOutgoingRiver; } } 

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

  public bool HasRiverBeginOrEnd { get { return hasIncomingRiver != hasOutgoingRiver; } } 

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

  public bool HasRiverThroughEdge (HexDirection direction) { return hasIncomingRiver && incomingRiver == direction || hasOutgoingRiver && outgoingRiver == direction; } 

рдирджреА рдирд┐рдХрд╛рд▓рдирд╛


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

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

  public void RemoveOutgoingRiver () { if (!hasOutgoingRiver) { return; } hasOutgoingRiver = false; Refresh(); } 

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

  public void RemoveOutgoingRiver () { if (!hasOutgoingRiver) { return; } hasOutgoingRiver = false; Refresh(); HexCell neighbor = GetNeighbor(outgoingRiver); neighbor.hasIncomingRiver = false; neighbor.Refresh(); } 

рдХреНрдпрд╛ рдПрдХ рдирджреА рдПрдХ рдирдХреНрд╢реЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓ рд╕рдХрддреА рд╣реИ?
, . , .

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

  public void RemoveOutgoingRiver () { if (!hasOutgoingRiver) { return; } hasOutgoingRiver = false; RefreshSelfOnly(); HexCell neighbor = GetNeighbor(outgoingRiver); neighbor.hasIncomingRiver = false; neighbor.RefreshSelfOnly(); } 

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

  void RefreshSelfOnly () { chunk.Refresh(); } 

рдЖрдиреЗ рд╡рд╛рд▓реА рдирджрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

  public void RemoveIncomingRiver () { if (!hasIncomingRiver) { return; } hasIncomingRiver = false; RefreshSelfOnly(); HexCell neighbor = GetNeighbor(incomingRiver); neighbor.hasOutgoingRiver = false; neighbor.RefreshSelfOnly(); } 

рдФрд░ рдкреВрд░реА рдирджреА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рд╕реАрдзрд╛ рдорддрд▓рдм рд╣реИ рдирджреА рдХреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдФрд░ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рджреЛрдиреЛрдВ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ред

  public void RemoveRiver () { RemoveOutgoingRiver(); RemoveIncomingRiver(); } 

рдирджрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛


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

рдпрджрд┐ рдирджреА рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

  public void SetOutgoingRiver (HexDirection direction) { if (hasOutgoingRiver && outgoingRiver == direction) { return; } } 

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

  HexCell neighbor = GetNeighbor(direction); if (!neighbor || elevation < neighbor.elevation) { return; } 

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

  RemoveOutgoingRiver(); if (hasIncomingRiver && incomingRiver == direction) { RemoveIncomingRiver(); } 

рдЕрдм рд╣рдо рдирд┐рд╡рд░реНрддрдорд╛рди рдирджреА рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

  hasOutgoingRiver = true; outgoingRiver = direction; RefreshSelfOnly(); 

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

  neighbor.RemoveIncomingRiver(); neighbor.hasIncomingRiver = true; neighbor.incomingRiver = direction.Opposite(); neighbor.RefreshSelfOnly(); 

рдмрд╣ рд░рд╣реА рдирджрд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛


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

  public int Elevation { get { return elevation; } set { тАж if ( hasOutgoingRiver && elevation < GetNeighbor(outgoingRiver).elevation ) { RemoveOutgoingRiver(); } if ( hasIncomingRiver && elevation > GetNeighbor(incomingRiver).elevation ) { RemoveIncomingRiver(); } Refresh(); } } 

unitypackage

рдирджрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓реЛ


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

  enum OptionalToggle { Ignore, Yes, No } OptionalToggle riverMode; 

рдФрд░ рд╣рдореЗрдВ UI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирджреА рд╢рд╛рд╕рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  public void SetRiverMode (int mode) { riverMode = (OptionalToggle)mode; } 

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


рдпреВрдЖрдИ рдирджрд┐рдпреЛрдВ

рдбреНрд░реЙрдк рдбрд╛рдЙрди рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ?
, . dropdown list Unity Play. , .

рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдорд╛рдиреНрдпрддрд╛


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

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

  bool isDrag; HexDirection dragDirection; HexCell previousCell; 

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

  void Update () { if ( Input.GetMouseButton(0) && !EventSystem.current.IsPointerOverGameObject() ) { HandleInput(); } else { previousCell = null; } } void HandleInput () { Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(inputRay, out hit)) { EditCells(hexGrid.GetCell(hit.point)); } else { previousCell = null; } } 

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

  void HandleInput () { Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(inputRay, out hit)) { HexCell currentCell = hexGrid.GetCell(hit.point); EditCells(currentCell); previousCell = currentCell; } else { previousCell = null; } } 

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

  if (Physics.Raycast(inputRay, out hit)) { HexCell currentCell = hexGrid.GetCell(hit.point); if (previousCell && previousCell != currentCell) { ValidateDrag(currentCell); } else { isDrag = false; } EditCells(currentCell); previousCell = currentCell; isDrag = true; } 

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

  void ValidateDrag (HexCell currentCell) { for ( dragDirection = HexDirection.NE; dragDirection <= HexDirection.NW; dragDirection++ ) { if (previousCell.GetNeighbor(dragDirection) == currentCell) { isDrag = true; return; } } isDrag = false; } 

рдХреНрдпрд╛ рд╣рдо рдЭрдЯрдХреЗрджрд╛рд░ рдбреНрд░рдЧреНрд╕ рдмрдирд╛рдПрдВрдЧреЗ?
, . ┬л┬╗ , .

, . .

рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрджрд▓реЗрдВ


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

  void EditCell (HexCell cell) { if (cell) { if (applyColor) { cell.Color = activeColor; } if (applyElevation) { cell.Elevation = activeElevation; } if (riverMode == OptionalToggle.No) { cell.RemoveRiver(); } else if (isDrag && riverMode == OptionalToggle.Yes) { previousCell.SetOutgoingRiver(dragDirection); } } } 

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

  else if (isDrag && riverMode == OptionalToggle.Yes) { HexCell otherCell = cell.GetNeighbor(dragDirection.Opposite()); if (otherCell) { otherCell.SetOutgoingRiver(dragDirection); } } 

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


рдбрд┐рдмрдЧ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдирджреА рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд▓ред

рдбрд┐рдмрдЧ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреНрдпрд╛ рд╣реИ?
. . , .

unitypackage

рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд░рд┐рд╡рд░рдмреЗрдбреНрд╕


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

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


рдПрдХ рд░рд┐рдм рдкрдЯреНрдЯреА рдореЗрдВ рдПрдХ рдирджреА рдЬреЛрдбрд╝рдирд╛ред

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


рд╣рдореЗрд╢рд╛ рдЪреМрдорд╛рд╕рд╛ред

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

рдПрдЬ рдЯреЙрдкреНрд╕ рдЬреЛрдбрд╝рдирд╛


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

  public Vector3 v1, v2, v4, v5; 

рд╕рдм рдХреБрдЫ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдирдпрд╛ рдЬреЛрдбрд╝реЗрдВ v3ред

  public Vector3 v1, v2, v3, v4, v5; 

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╢реАрд░реНрд╖ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдХреЛрдиреЗ рдХреА рдЪреЛрдЯрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреНрдп рдХреЛрдиреЗ рдЕрдм, рдФрд░ ices рдореЗрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ frac13 рдореЗрдВ рдирд╣реАрдВ; рдФрд░ frac23;

  public EdgeVertices (Vector3 corner1, Vector3 corner2) { v1 = corner1; v2 = Vector3.Lerp(corner1, corner2, 0.25f); v3 = Vector3.Lerp(corner1, corner2, 0.5f); v4 = Vector3.Lerp(corner1, corner2, 0.75f); v5 = corner2; } 

рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ v3рдФрд░ TerraceLerpред

  public static EdgeVertices TerraceLerp ( EdgeVertices a, EdgeVertices b, int step) { EdgeVertices result; result.v1 = HexMetrics.TerraceLerp(a.v1, b.v1, step); result.v2 = HexMetrics.TerraceLerp(a.v2, b.v2, step); result.v3 = HexMetrics.TerraceLerp(a.v3, b.v3, step); result.v4 = HexMetrics.TerraceLerp(a.v4, b.v4, step); result.v5 = HexMetrics.TerraceLerp(a.v5, b.v5, step); return result; } 

рдЕрдм рдореБрдЭреЗ HexMeshрд░рд┐рдм рдХреЗ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢реАрд░реНрд╖ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

  void TriangulateEdgeFan (Vector3 center, EdgeVertices edge, Color color) { AddTriangle(center, edge.v1, edge.v2); AddTriangleColor(color); AddTriangle(center, edge.v2, edge.v3); AddTriangleColor(color); AddTriangle(center, edge.v3, edge.v4); AddTriangleColor(color); AddTriangle(center, edge.v4, edge.v5); AddTriangleColor(color); } 

рдФрд░ рдЗрд╕рдХреЗ рдЪрддреБрд░реНрднреБрдЬреЛрдВ рдХреА рдзрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рднреАред

  void TriangulateEdgeStrip ( EdgeVertices e1, Color c1, EdgeVertices e2, Color c2 ) { AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); AddQuadColor(c1, c2); AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); AddQuadColor(c1, c2); AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); AddQuadColor(c1, c2); AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); AddQuadColor(c1, c2); } 



рдкреНрд░рддрд┐ рдЫреЛрд░ рдЪрд╛рд░ рдФрд░ рдкрд╛рдВрдЪ рдХреЛрдиреЗ рдХреА рддреБрд▓рдирд╛ред

рдирджреА рддрд▓ рдХреА рдКрдБрдЪрд╛рдИ


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

рдЖрдЗрдП рдЗрд╕ рдСрдлрд╕реЗрдЯ рдХреЛ HexMetricsрдКрдВрдЪрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░реЗрдВред рдПрдХ рд╕реНрддрд░ рдХреЗ рдСрдлрд╕реЗрдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдВрдЧреЗред

  public const float streamBedElevationOffset = -1f; 

рд╣рдо HexCellрд╕реЗрд▓ рдирджреА рдХреЗ рддрд▓ рдХреА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

  public float StreamBedY { get { return (elevation + HexMetrics.streamBedElevationOffset) * HexMetrics.elevationStep; } } 

рдПрдХ рдЪреИрдирд▓ рдмрдирд╛рдирд╛


рдЬрдм HexMeshрдПрдХ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдЫрд╣ рддреНрд░рд┐рдХреЛрдгреАрдп рднрд╛рдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рддреНрд░рд┐рднреБрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдирджреА рдЗрд╕рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рдмрд╣рддреА рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рд░рд┐рдм рдХреЗ рдордзреНрдп рд╢рд┐рдЦрд░ рдХреЛ рдирджреА рдХреЗ рдмрд┐рд╕реНрддрд░ рдХреА рдКрдВрдЪрд╛рдИ рддрдХ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  void Triangulate (HexDirection direction, HexCell cell) { Vector3 center = cell.Position; EdgeVertices e = new EdgeVertices( center + HexMetrics.GetFirstSolidCorner(direction), center + HexMetrics.GetSecondSolidCorner(direction) ); if (cell.HasRiverThroughEdge(direction)) { e.v3.y = cell.StreamBedY; } TriangulateEdgeFan(center, e, cell.Color); if (direction <= HexDirection.SE) { TriangulateConnection(direction, cell, e); } } 


рд░рд┐рдм рдХреЗ рдордзреНрдп рд╢реАрд░реНрд╖ рдХреЛ рдмрджрд▓реЗрдВред

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

  void TriangulateConnection ( HexDirection direction, HexCell cell, EdgeVertices e1 ) { HexCell neighbor = cell.GetNeighbor(direction); if (neighbor == null) { return; } Vector3 bridge = HexMetrics.GetBridge(direction); bridge.y = neighbor.Position.y - cell.Position.y; EdgeVertices e2 = new EdgeVertices( e1.v1 + bridge, e1.v5 + bridge ); if (cell.HasRiverThroughEdge(direction)) { e2.v3.y = neighbor.StreamBedY; } тАж } 


рд░рд┐рдм рдЬреЛрдбрд╝реЛрдВ рдХреЗ рдкреВрд░реНрдг рдЪреИрдирд▓ред

unitypackage

рдПрдХ рд╕реЗрд▓ рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рд░рд┐рд╡рд░рдмреЗрдб


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

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


рд╣рдо рдЪреИрдирд▓ рдХреЛ рддреНрд░рд┐рдХреЛрдг рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

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


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

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

  void Triangulate (HexDirection direction, HexCell cell) { Vector3 center = cell.Position; EdgeVertices e = new EdgeVertices( center + HexMetrics.GetFirstSolidCorner(direction), center + HexMetrics.GetSecondSolidCorner(direction) ); if (cell.HasRiver) { if (cell.HasRiverThroughEdge(direction)) { e.v3.y = cell.StreamBedY; TriangulateWithRiver(direction, cell, center, e); } } else { TriangulateEdgeFan(center, e, cell.Color); } if (direction <= HexDirection.SE) { TriangulateConnection(direction, cell, e); } } void TriangulateWithRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { } 


рдЫреЗрдж рдЬрд┐рд╕рдореЗрдВ рдирджрд┐рдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЕрд╕реНрдерд╛рдИ рд░реВрдк рд╕реЗ рд╕реЗрд▓ рд╡рд┐рдХреГрддрд┐ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВред

  public const float cellPerturbStrength = 0f; // 4f; 


рдЕрд╡рд┐рд░рд▓ рдЪреЛрдЯрд┐рдпрд╛рдБред

рд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди


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

  void TriangulateWithRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { Vector3 centerL = center + HexMetrics.GetFirstSolidCorner(direction.Previous()) * 0.25f; } 

рдЗрд╕реА рддрд░рд╣ рд╕рд╣реА рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЗ рджреВрд╕рд░реЗ рдХреЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  Vector3 centerL = center + HexMetrics.GetFirstSolidCorner(direction.Previous()) * 0.25f; Vector3 centerR = center + HexMetrics.GetSecondSolidCorner(direction.Next()) * 0.25f; 

рдХреЗрдВрджреНрд░ рдФрд░ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдмреАрдЪ рд╢реАрд░реНрд╖ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдмрдирд╛рдХрд░ рдордзреНрдп рд░реЗрдЦрд╛ рдХреЛ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  EdgeVertices m = new EdgeVertices( Vector3.Lerp(centerL, e.v1, 0.5f), Vector3.Lerp(centerR, e.v5, 0.5f) ); 

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

  m.v3.y = center.y = e.v3.y; 

рдЕрдм рд╣рдо TriangulateEdgeStripрдордзреНрдп рд░реЗрдЦрд╛ рдФрд░ рдХрд┐рдирд╛рд░реЗ рд░реЗрдЦрд╛ рдХреЗ рдмреАрдЪ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

  TriangulateEdgeStrip(m, cell.Color, e, cell.Color); 


рд╕рдВрдХреБрдЪрд┐рдд рдЪреИрдирд▓ред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЪреИрдирд▓ рд╕рдВрдХреБрдЪрд┐рдд рджрд┐рдЦрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд╕рд▓реА рдХреЗ рдордзреНрдп рдХреЛрдиреЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реЛрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реБрдЖ?

рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдмрд╛рд╣рд░реА рдХрд┐рдирд╛рд░реЗ рдХреА рд▓рдВрдмрд╛рдИ 1 рд╣реИ, рддреЛ рдХреЗрдВрджреНрд░ рд░реЗрдЦрд╛ рдХреА рд▓рдВрдмрд╛рдИ length рд╣реЛрдЧреАред рдЪреВрдВрдХрд┐ рдмреАрдЪ рдХрд╛ рдХрд┐рдирд╛рд░рд╛ рдЙрдирдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ in рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдЪреИрдирд▓ рдХреА рдЪреМрдбрд╝рд╛рдИ ┬╜ рд╣реИ рдФрд░ рд╕реНрдерд┐рд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдордзреНрдп рдХрд┐рдирд╛рд░реЗ рдХреА рд▓рдВрдмрд╛рдИ ┬╛ рд╣реИ, рдХреЗрд╡рд▓ according рдмрдиреА рд╣реБрдИ рд╣реИ, & frac18 рдХреЗ рдЕрдиреБрд╕рд╛рд░; рдЪреИрдирд▓ рдХреЗ рджреЛрдиреЛрдВ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ред


рд╕рд╛рдкреЗрдХреНрд╖ рд▓рдВрдмрд╛рдИред

рдЪреВрдВрдХрд┐ рдордзреНрдп рдХрд┐рдирд╛рд░реЗ рдХреА рд▓рдВрдмрд╛рдИ middle рд╣реИ, рддреЛ & frac18; рдордзреНрдп рд░рд┐рдм рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдФрд░ frac16 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ ;; рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рджреВрд╕рд░реЗ рдФрд░ рдЪреМрдереЗ рдХреЛрдиреЗ рдХреЛ рдЫрдареЗ рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХреНрд╡рд╛рд░реНрдЯрд░ рд╕реЗ рдЗрдВрдЯрд░рдкреЛрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

  public EdgeVertices (Vector3 corner1, Vector3 corner2, float outerStep) { v1 = corner1; v2 = Vector3.Lerp(corner1, corner2, outerStep); v3 = Vector3.Lerp(corner1, corner2, 0.5f); v4 = Vector3.Lerp(corner1, corner2, 1f - outerStep); v5 = corner2; } 

рдЕрдм рд╣рдо рдЗрд╕реЗ & frac16 рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рд╕реА HexMesh.TriangulateWithRiverред

  EdgeVertices m = new EdgeVertices( Vector3.Lerp(centerL, e.v1, 0.5f), Vector3.Lerp(centerR, e.v5, 0.5f), 1f / 6f ); 


рд╕реАрдзрд╛ рдЪреИрдирд▓ред

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

  AddTriangle(centerL, m.v1, m.v2); AddTriangleColor(cell.Color); AddTriangle(centerR, m.v4, m.v5); AddTriangleColor(cell.Color); 


рд╕рд╛рдЗрдб рддреНрд░рд┐рдХреЛрдгред

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

  AddTriangle(centerL, m.v1, m.v2); AddTriangleColor(cell.Color); AddQuad(centerL, center, m.v2, m.v3); AddQuadColor(cell.Color); AddQuad(center, centerR, m.v3, m.v4); AddQuadColor(cell.Color); AddTriangle(centerR, m.v4, m.v5); AddTriangleColor(cell.Color); 

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

  void AddQuadColor (Color color) { colors.Add(color); colors.Add(color); colors.Add(color); colors.Add(color); } 


рд╕реАрдзреЗ рдЪреИрдирд▓реЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ред

рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ


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

  if (cell.HasRiver) { if (cell.HasRiverThroughEdge(direction)) { e.v3.y = cell.StreamBedY; if (cell.HasRiverBeginOrEnd) { TriangulateWithRiverBeginOrEnd(direction, cell, center, e); } else { TriangulateWithRiver(direction, cell, center, e); } } } 

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

  void TriangulateWithRiverBeginOrEnd ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { EdgeVertices m = new EdgeVertices( Vector3.Lerp(center, e.v1, 0.5f), Vector3.Lerp(center, e.v5, 0.5f) ); } 

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

  m.v3.y = e.v3.y; 

рд╣рдо рдПрдХ рд░рд┐рдм рд╕реНрдЯреНрд░рд┐рдк рдФрд░ рдПрдХ рдкреНрд░рд╢рдВрд╕рдХ рдХреЗ рд╕рд╛рде рддреНрд░рд┐рдХреЛрдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  TriangulateEdgeStrip(m, cell.Color, e, cell.Color); TriangulateEdgeFan(center, m, cell.Color); 


рдЕрдВрдХ рд╢реБрд░реВ рдФрд░ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред

рд╡рди-рд╕реНрдЯреЗрдк рдЯрд░реНрди


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


рдЬрд╝рд┐рдЧрдЬрд╝рдЧ рдирджреАред

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

  Vector3 centerL, centerR; if (cell.HasRiverThroughEdge(direction.Opposite())) { centerL = center + HexMetrics.GetFirstSolidCorner(direction.Previous()) * 0.25f; centerR = center + HexMetrics.GetSecondSolidCorner(direction.Next()) * 0.25f; } else { centerL = centerR = center; } 


рдХрд░реНрд▓ рдХрд┐рдП рд╣реБрдП рдЬрд╝рд┐рдЧрдЬрд╝реИрдЧред

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

  if (cell.HasRiverThroughEdge(direction.Opposite())) { centerL = center + HexMetrics.GetFirstSolidCorner(direction.Previous()) * 0.25f; centerR = center + HexMetrics.GetSecondSolidCorner(direction.Next()) * 0.25f; } else if (cell.HasRiverThroughEdge(direction.Next())) { centerL = center; centerR = Vector3.Lerp(center, e.v5, 0.5f); } else if (cell.HasRiverThroughEdge(direction.Previous())) { centerL = Vector3.Lerp(center, e.v1, 0.5f); centerR = center; } else { centerL = centerR = center; } 

рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдмрд┐рдВрджреБ рдХрд╣рд╛рдВ рд╣реИрдВ, рд╣рдо рдФрд╕рдд рдХреЗрдВрджреНрд░ рдХреЛ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  if (cell.HasRiverThroughEdge(direction.Opposite())) { тАж } center = Vector3.Lerp(centerL, centerR, 0.5f); 


рдСрдлрд╕реЗрдЯ рдХреЗрдВрджреНрд░реАрдп рд░рд┐рдмред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЪреИрдирд▓ рдХреА рджреЛрдиреЛрдВ рддрд░рдл рд╕рдорд╛рди рдЪреМрдбрд╝рд╛рдИ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рд╕рдВрдХреБрдЪрд┐рдд рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдХреЗрдВрджреНрд░ рд░реЗрдЦрд╛ 60 ┬░ рдореЛрдбрд╝рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рдХреЗрдВрджреНрд░ рд░реЗрдЦрд╛ рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рдХрд░ рдЖрдк рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ┬╜ рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд╖реЗрдк рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо & frac23 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ;

  else if (cell.HasRiverThroughEdge(direction.Next())) { centerL = center; centerR = Vector3.Lerp(center, e.v5, 2f / 3f); } else if (cell.HasRiverThroughEdge(direction.Previous())) { centerL = Vector3.Lerp(center, e.v1, 2f / 3f); centerR = center; } 


рд╕рдВрдкреАрдбрд╝рди рдХреЗ рдмрд┐рдирд╛ рдЬрд╝рд┐рдЧрдЬрд╝реИрдЧред

рджреЛ-рдЪрд░рдг рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ


рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдЭреАрдЧреНрдЬ рдФрд░ рд╕реАрдзреА рдирджрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рд╣реИрдВред рдпреЗ рджреЛ-рдЪрд░рдг рдореЛрдбрд╝ рд╣реИрдВ рдЬреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдШреБрдорд╛рд╡рджрд╛рд░ рдирджрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред


рдмрд╣рддреА рд╣реБрдИ рдирджреАред

рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдЭреБрдХрд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ direction.Next().Next()ред рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬреЛрдбрд╝рдХрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддреЗ рд╣реИрдВ HexDirectionрд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ Next2рдФрд░ Previous2ред

  public static HexDirection Previous2 (this HexDirection direction) { direction -= 2; return direction >= HexDirection.NE ? direction : (direction + 6); } public static HexDirection Next2 (this HexDirection direction) { direction += 2; return direction <= HexDirection.NW ? direction : (direction - 6); } 

рдкрд░ рд╡рд╛рдкрд╕ HexMesh.TriangulateWithRiverред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рд╕рд╛рде рдмрд╣рдиреЗ рд╡рд╛рд▓реА рдирджреА рдХреА рджрд┐рд╢рд╛ рдХреЛ рдкрд╣рдЪрд╛рди рд╕рдХрддреЗ рд╣реИрдВ direction.Next2()ред

  if (cell.HasRiverThroughEdge(direction.Opposite())) { centerL = center + HexMetrics.GetFirstSolidCorner(direction.Previous()) * 0.25f; centerR = center + HexMetrics.GetSecondSolidCorner(direction.Next()) * 0.25f; } else if (cell.HasRiverThroughEdge(direction.Next())) { centerL = center; centerR = Vector3.Lerp(center, e.v5, 2f / 3f); } else if (cell.HasRiverThroughEdge(direction.Previous())) { centerL = Vector3.Lerp(center, e.v1, 2f / 3f); centerR = center; } else if (cell.HasRiverThroughEdge(direction.Next2())) { centerL = centerR = center; } else { centerL = centerR = center; } 

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

  else if (cell.HasRiverThroughEdge(direction.Next2())) { centerL = center; centerR = center + HexMetrics.GetSolidEdgeMiddle(direction.Next()) * 0.5f; } else { centerL = center + HexMetrics.GetSolidEdgeMiddle(direction.Previous()) * 0.5f; centerR = center; } 

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

  public static Vector3 GetSolidEdgeMiddle (HexDirection direction) { return (corners[(int)direction] + corners[(int)direction + 1]) * (0.5f * solidFactor); } 


рдереЛрдбрд╝рд╛ рд╕рдВрдХреБрдЪрд┐рдд рдШрдЯрддрд╛ рд╣реИред

рд╣рдорд╛рд░реА рдХреЗрдВрджреНрд░ рд░реЗрдЦрд╛рдПрдВ рдЕрдм 30 ┬░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдШреВрдо рд░рд╣реА рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдЪреИрдирд▓ рдереЛрдбрд╝рд╛ рд╕рдВрдХреБрдЪрд┐рдд рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдм рдХрд╛ рдордзреНрдпрдмрд┐рдВрджреБ рд░рд┐рдм рдХреЗ рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЗрдВрджреНрд░ рдХреЗ рдХрд░реАрдм рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреА рджреВрд░реА рдЖрдВрддрд░рд┐рдХ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдмрд╛рд╣рд░реА рдирд╣реАрдВред рдпрд╛рдиреА рд╣рдо рдЧрд▓рдд рдкреИрдорд╛рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╛рд╣рд░реА рд╕реЗ рдЖрдВрддрд░рд┐рдХ рддреНрд░рд┐рдЬреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ HexMetricsред рд╣рдореЗрдВ рд░рд┐рд╡рд░реНрд╕ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ рдЪрд▓реЛ рджреЛрдиреЛрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛рд░рдХ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддреЗ рд╣реИрдВ HexMetricsред

  public const float outerToInner = 0.866025404f; public const float innerToOuter = 1f / outerToInner; public const float outerRadius = 10f; public const float innerRadius = outerRadius * outerToInner; 

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

  else if (cell.HasRiverThroughEdge(direction.Next2())) { centerL = center; centerR = center + HexMetrics.GetSolidEdgeMiddle(direction.Next()) * (0.5f * HexMetrics.innerToOuter); } else { centerL = center + HexMetrics.GetSolidEdgeMiddle(direction.Previous()) * (0.5f * HexMetrics.innerToOuter); centerR = center; } 


рдЪрд┐рдХрдиреА рдШрдЯрддрд╛ рд╣реИред

unitypackage

рдирджрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди


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


рдЪреИрдирд▓реЛрдВ рдХреЗ рдкрд╛рд╕ рдЫреЗрджред

рдпрджрд┐ рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдирджреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд░реНрддрдорд╛рди рджрд┐рд╢рд╛ рдореЗрдВ рдирд╣реАрдВ рдмрд╣рддреА рд╣реИ, рддреЛ Triangulateрд╣рдо рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред

  if (cell.HasRiver) { if (cell.HasRiverThroughEdge(direction)) { e.v3.y = cell.StreamBedY; if (cell.HasRiverBeginOrEnd) { TriangulateWithRiverBeginOrEnd(direction, cell, center, e); } else { TriangulateWithRiver(direction, cell, center, e); } } else { TriangulateAdjacentToRiver(direction, cell, center, e); } } else { TriangulateEdgeFan(center, e, cell.Color); } 

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

  void TriangulateAdjacentToRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { EdgeVertices m = new EdgeVertices( Vector3.Lerp(center, e.v1, 0.5f), Vector3.Lerp(center, e.v5, 0.5f) ); TriangulateEdgeStrip(m, cell.Color, e, cell.Color); TriangulateEdgeFan(center, m, cell.Color); } 


рдШрдЯрддрд╛ рдФрд░ рд╕реАрдзреА рдирджрд┐рдпреЛрдВ рдореЗрдВ рдУрд╡рд░рд▓реЗред

рдЪреИрдирд▓ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░реЗрдВ


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

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

  if (cell.HasRiverThroughEdge(direction.Next())) { if (cell.HasRiverThroughEdge(direction.Previous())) { center += HexMetrics.GetSolidEdgeMiddle(direction) * (HexMetrics.innerToOuter * 0.5f); } } EdgeVertices m = new EdgeVertices( Vector3.Lerp(center, e.v1, 0.5f), Vector3.Lerp(center, e.v5, 0.5f) ); 


рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдирджреА рджреЛрдиреЛрдВ рдУрд░ рд╕реЗ рдмрд╣рддреА рд╣реИред

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдирджреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рдПрдХ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реАрдзрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХреЗрдВрджреНрд░ рдХреЛ рдкрд╣рд▓реЗ рдХреЛрдиреЗ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВред

  if (cell.HasRiverThroughEdge(direction.Next())) { if (cell.HasRiverThroughEdge(direction.Previous())) { center += HexMetrics.GetSolidEdgeMiddle(direction) * (HexMetrics.innerToOuter * 0.5f); } else if ( cell.HasRiverThroughEdge(direction.Previous2()) ) { center += HexMetrics.GetFirstSolidCorner(direction) * 0.25f; } } 


рд╕реАрдзреА рдирджреА рдХреЗ рд╕рд╛рде рдЖрдзрд╛ рдУрд╡рд░рд▓реЗред

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

  if (cell.HasRiverThroughEdge(direction.Next())) { if (cell.HasRiverThroughEdge(direction.Previous())) { center += HexMetrics.GetSolidEdgeMiddle(direction) * (HexMetrics.innerToOuter * 0.5f); } else if ( cell.HasRiverThroughEdge(direction.Previous2()) ) { center += HexMetrics.GetFirstSolidCorner(direction) * 0.25f; } } else if ( cell.HasRiverThroughEdge(direction.Previous()) && cell.HasRiverThroughEdge(direction.Next2()) ) { center += HexMetrics.GetSecondSolidCorner(direction) * 0.25f; } 


рдФрд░ рдХреЛрдИ рдУрд╡рд░рд▓реЗ рдирд╣реАрдВред

unitypackage

рд╣реЗрдХреНрд╕рдореЗрд╢ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг


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

Perturb рд╡рд┐рдзрд┐ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдирд╛


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

рд╡рд┐рдзрд┐ рдХреЛ рдЕрдВрджрд░ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдХрд░ HexMetrics, рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рд╕реНрдерд┐рд░ рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рдирд╛рдо рд╕рд╣реА рдХрд░реЗрдВред

  public static Vector3 Perturb (Vector3 position) { Vector4 sample = SampleNoise(position); position.x += (sample.x * 2f - 1f) * cellPerturbStrength; position.z += (sample.z * 2f - 1f) * cellPerturbStrength; return position; } 

рддреНрд░рд┐рднреБрдЬ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдирд╛


рдореЗрдВ HexGridChunkрдЪрд░ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди hexMeshрд╕рд╛рдЭрд╛ рдЪрд░ рдореЗрдВ terrainред

  public HexMesh terrain; // HexMesh hexMesh; void Awake () { gridCanvas = GetComponentInChildren<Canvas>(); // hexMesh = GetComponentInChildren<HexMesh>(); cells = new HexCell[HexMetrics.chunkSizeX * HexMetrics.chunkSizeZ]; ShowUI(false); } 

рдЕрдЧрд▓рд╛, рд╣рдо c AddтАжрд╕реЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ HexMeshрд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ terrain.AddтАжред рдлрд┐рд░ рд╕рднреА рддрд░реАрдХреЛрдВ TriangulateтАжрдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ HexGridChunkред рдлрд┐рд░ рдЖрдк рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдо рдХреЛ рд╕рд╣реА рдХрд░ рд╕рдХрддреЗ AddтАжрдореЗрдВ HexMeshрд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдо рд╣реИрдВред рдирддреАрдЬрддрди, рд╕рднреА рдЬрдЯрд┐рд▓ рддреНрд░рд┐рднреБрдЬ рддрд░реАрдХреЗ рдорд┐рд▓реЗрдВрдЧреЗ HexGridChunk, рдФрд░ рдЬрд╛рд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рддрд░реАрдХреЗ рдЕрдВрджрд░ рд░рд╣реЗрдВрдЧреЗ HexMeshред

рд╣рдо рдЕрднреА рддрдХ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЕрдм рдЗрд╕реЗ HexGridChunk.LateUpdateрдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХрд╣рдиреА рдЪрд╛рд╣рд┐рдП Triangulateред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рдЕрдм рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдпрд╣ TriangulateрдЕрдкрдирд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЦреЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЙрд╕реЗ рдЬрд╛рд▓ рдбреЗрдЯрд╛ рдХреА рд╕рдлрд╛рдИ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рд╕реМрдВрдкрдирд╛ рд╣реЛрдЧрд╛ HexMeshред

  void LateUpdate () { Triangulate(); // hexMesh.Triangulate(cells); enabled = false; } public void Triangulate () { terrain.Clear(); // hexMesh.Clear(); // vertices.Clear(); // colors.Clear(); // triangles.Clear(); for (int i = 0; i < cells.Length; i++) { Triangulate(cells[i]); } terrain.Apply(); // hexMesh.vertices = vertices.ToArray(); // hexMesh.colors = colors.ToArray(); // hexMesh.triangles = triangles.ToArray(); // hexMesh.RecalculateNormals(); // meshCollider.sharedMesh = hexMesh; } 

рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬреЛрдбрд╝реЗрдВ ClearрдФрд░ ApplyрдореЗрдВ HexMeshред

  public void Clear () { hexMesh.Clear(); vertices.Clear(); colors.Clear(); triangles.Clear(); } public void Apply () { hexMesh.SetVertices(vertices); hexMesh.SetColors(colors); hexMesh.SetTriangles(triangles, 0); hexMesh.RecalculateNormals(); meshCollider.sharedMesh = hexMesh; } 

SetVertices, SetColors рдФрд░ SetTriangles рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
Mesh . . , .

SetTriangles integer, . , .

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


рдПрдХ рд░рд╛рд╣рдд рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

рдкреНрд░реАрдлрд╝реИрдм рдмрдЪреНрдЪреЗ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?
. , . , Apply , . .

рд╕реВрдЪреА рдкреВрд▓ рдмрдирд╛рдирд╛


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

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

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

 public static class ListPool<T> { } 

ListPool <T> рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
, List<int> . <T> ListPool , , . , T ( template).

рдПрдХ рдкреВрд▓ рдореЗрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдХрддрд╛ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

 using System.Collections.Generic; public static class ListPool<T> { static Stack<List<T>> stack = new Stack<List<T>>(); } 

рд╕реНрдЯреИрдХ <рд╕реВрдЪреА <t >> рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
. , . .

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

  public static List<T> Get () { if (stack.Count > 0) { return stack.Pop(); } return new List<T>(); } 

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

  public static void Add (List<T> list) { list.Clear(); stack.Push(list); } 

рдЕрдм рд╣рдо рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ HexMeshред рд╕реНрдереИрддрд┐рдХ рд╕реВрдЪреА рдХреЛ рдЧреИрд░-рд╕реНрдерд┐рд░ рдирд┐рдЬреА рд▓рд┐рдВрдХ рд╕реЗ рдмрджрд▓реЗрдВред рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ NonSerializedрддрд╛рдХрд┐ рдПрдХрддрд╛ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рди рдХрд░реЗрдВред рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦрдирд╛ System.NonSerializedрдпрд╛ рдЬреЛрдбрд╝рдирд╛ using System;ред

  [NonSerialized] List<Vector3> vertices; [NonSerialized] List<Color> colors; [NonSerialized] List<int> triangles; // static List<Vector3> vertices = new List<Vector3>(); // static List<Color> colors = new List<Color>(); // static List<int> triangles = new List<int>(); 

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

  public void Clear () { hexMesh.Clear(); vertices = ListPool<Vector3>.Get(); colors = ListPool<Color>.Get(); triangles = ListPool<int>.Get(); } 

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

  public void Apply () { hexMesh.SetVertices(vertices); ListPool<Vector3>.Add(vertices); hexMesh.SetColors(colors); ListPool<Color>.Add(colors); hexMesh.SetTriangles(triangles, 0); ListPool<int>.Add(triangles); hexMesh.RecalculateNormals(); meshCollider.sharedMesh = hexMesh; } 

рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рднрд▓реЗ рд╣реА рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрд┐рддрдиреЗ рдЬрд╛рд▓ рднрд░реЗрдВред

рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЙрд▓рд░


рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рдЗрд▓рд╛рдХреЗ рдХреЛ рдПрдХ рдХреЛрд▓рд╛рдЗрдбрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирджрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдХрд┐рд░рдгреЗрдВ рдХреЗрд╡рд▓ рдкрд╛рдиреА рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░реЗрдВрдЧреА рдФрд░ рдиреАрдЪреЗ рдХреЗ рдЪреИрдирд▓ рд╕реЗ рдорд┐рд▓реЗрдВрдЧреАред рдЖрдЗрдП рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрд▓рд╛рдЗрдбрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХреЗрдВ HexMeshред рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ bool useColliderред рдЗрд▓рд╛рдХреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВред

  public bool useCollider; 


рдПрдХ рдЬрд╛рд▓ рдХреЛрд▓реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЙрд╕ рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ рдЙрд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрд▓рд╛рдЗрдбрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  void Awake () { GetComponent<MeshFilter>().mesh = hexMesh = new Mesh(); if (useCollider) { meshCollider = gameObject.AddComponent<MeshCollider>(); } hexMesh.name = "Hex Mesh"; } public void Apply () { тАж if (useCollider) { meshCollider.sharedMesh = hexMesh; } тАж } 

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░рдВрдЧ


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

  public bool useCollider, useColors; public void Clear () { hexMesh.Clear(); vertices = ListPool<Vector3>.Get(); if (useColors) { colors = ListPool<Color>.Get(); } triangles = ListPool<int>.Get(); } public void Apply () { hexMesh.SetVertices(vertices); ListPool<Vector3>.Add(vertices); if (useColors) { hexMesh.SetColors(colors); ListPool<Color>.Add(colors); } тАж } 

рдмреЗрд╢рдХ, рдЗрд▓рд╛рдХреЗ рдХреЛ рд░рдВрдЧреЛрдВ рдХреЗ рд░рдВрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд▓реВ рдХрд░реЗрдВред


рд░рдВрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧред

рд╡реИрдХрд▓реНрдкрд┐рдХ рдпреВрд╡реА


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

  public bool useCollider, useColors, useUVCoordinates; [NonSerialized] List<Vector2> uvs; public void Clear () { hexMesh.Clear(); vertices = ListPool<Vector3>.Get(); if (useColors) { colors = ListPool<Color>.Get(); } if (useUVCoordinates) { uvs = ListPool<Vector2>.Get(); } triangles = ListPool<int>.Get(); } public void Apply () { hexMesh.SetVertices(vertices); ListPool<Vector3>.Add(vertices); if (useColors) { hexMesh.SetColors(colors); ListPool<Color>.Add(colors); } if (useUVCoordinates) { hexMesh.SetUVs(0, uvs); ListPool<Vector2>.Add(uvs); } тАж } 


рд╣рдо рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

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

  public void AddTriangleUV (Vector2 uv1, Vector2 uv2, Vector3 uv3) { uvs.Add(uv1); uvs.Add(uv2); uvs.Add(uv3); } public void AddQuadUV (Vector2 uv1, Vector2 uv2, Vector3 uv3, Vector3 uv4) { uvs.Add(uv1); uvs.Add(uv2); uvs.Add(uv3); uvs.Add(uv4); } 

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

  public void AddQuadUV (float uMin, float uMax, float vMin, float vMax) { uvs.Add(new Vector2(uMin, vMin)); uvs.Add(new Vector2(uMax, vMin)); uvs.Add(new Vector2(uMin, vMax)); uvs.Add(new Vector2(uMax, vMax)); } 

unitypackage

рд╡рд░реНрддрдорд╛рди рдирджрд┐рдпрд╛рдБ


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

 Shader "Custom/River" { тАж void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb * IN.color; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; o.Albedo.rg = IN.uv_MainTex; } ENDCG } FallBack "Diffuse" } 

HexGridChunkрд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ HexMesh riversред рд╣рдо рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд╛рд╣рдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

  public HexMesh terrain, rivers; public void Triangulate () { terrain.Clear(); rivers.Clear(); for (int i = 0; i < cells.Length; i++) { Triangulate(cells[i]); } terrain.Apply(); rivers.Apply(); } 

рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреНрд░реЙ рдХреЙрд▓ рд╣реЛрдВрдЧреЗ, рднрд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирджрд┐рдпрд╛рдБ рди рд╣реЛрдВ?
Unity , . , - .

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



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

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


Subobject Riversред

рдкрд╛рдиреА рдХреЛ рдЯреНрд░рд╛рдИ рдХрд░реЗрдВ


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

  public const float riverSurfaceElevationOffset = -0.5f; 

рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛?
, . , .

HexCellрдЕрдкрдиреА рдирджреА рдХреА рд╕рддрд╣ рдХреА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ ред

  public float RiverSurfaceY { get { return (elevation + HexMetrics.riverSurfaceElevationOffset) * HexMetrics.elevationStep; } } 

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

  void TriangulateRiverQuad ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y ) { v1.y = v2.y = v3.y = v4.y = y; rivers.AddQuad(v1, v2, v3, v4); } 

рд╣рдо рдпрд╣рд╛рдВ рдЪрддреБрд░реНрднреБрдЬ рдХреЗ рдпреВрд╡реА-рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдмрд╕ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдФрд░ рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рдШреВрдореЗрдВред

  rivers.AddQuad(v1, v2, v3, v4); rivers.AddQuadUV(0f, 1f, 0f, 1f); 

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

  void TriangulateWithRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж TriangulateRiverQuad(centerL, centerR, m.v2, m.v4, cell.RiverSurfaceY); TriangulateRiverQuad(m.v2, m.v4, e.v2, e.v4, cell.RiverSurfaceY); } 


рдкрд╛рдиреА рдХреЗ рдкрд╣рд▓реЗ рд▓рдХреНрд╖рдгред

рдкрд╛рдиреА рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреНрдпреЛрдВ рдмрджрд▓рддреА рд╣реИ?
, , тАФ . . .

рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣рд╛ рд╣реИ


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

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

  void TriangulateRiverQuad ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y, bool reversed ) { v1.y = v2.y = v3.y = v4.y = y; rivers.AddQuad(v1, v2, v3, v4); if (reversed) { rivers.AddQuadUV(1f, 0f, 1f, 0f); } else { rivers.AddQuadUV(0f, 1f, 0f, 1f); } } 

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

  bool reversed = cell.IncomingRiver == direction; TriangulateRiverQuad( centerL, centerR, m.v2, m.v4, cell.RiverSurfaceY, reversed ); TriangulateRiverQuad( m.v2, m.v4, e.v2, e.v4, cell.RiverSurfaceY, reversed ); 


рдирджрд┐рдпреЛрдВ рдХреА рд╕рд╣рдорддрд┐ рд╡рд╛рд▓реА рджрд┐рд╢рд╛ред

рдирджреА рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд


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

  void TriangulateWithRiverBeginOrEnd ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж bool reversed = cell.HasIncomingRiver; TriangulateRiverQuad( m.v2, m.v4, e.v2, e.v4, cell.RiverSurfaceY, reversed ); } 

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

  center.y = m.v2.y = m.v4.y = cell.RiverSurfaceY; rivers.AddTriangle(center, m.v2, m.v4); if (reversed) { rivers.AddTriangleUV( new Vector2(0.5f, 1f), new Vector2(1f, 0f), new Vector2(0f, 0f) ); } else { rivers.AddTriangleUV( new Vector2(0.5f, 0f), new Vector2(0f, 1f), new Vector2(1f, 1f) ); } 


рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдореЗрдВ рдкрд╛рдиреАред

рдХреНрдпрд╛ рд╕рд┐рд░реЛрдВ рдкрд░ рдкрд╛рдиреА рдХреЗ рдЧрд╛рдпрдм рд╣рд┐рд╕реНрд╕реЗ рд╣реИрдВ?
, quad , . . .

, . , . .

рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рд╡рд╛рд╣


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

  void TriangulateRiverQuad ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y1, float y2, bool reversed ) { v1.y = v2.y = y1; v3.y = v4.y = y2; rivers.AddQuad(v1, v2, v3, v4); if (reversed) { rivers.AddQuadUV(1f, 0f, 1f, 0f); } else { rivers.AddQuadUV(0f, 1f, 0f, 1f); } } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдПрдХ рдКрдВрдЪрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдХрд╣реЗрдЧрд╛ред

  void TriangulateRiverQuad ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y, bool reversed ) { TriangulateRiverQuad(v1, v2, v3, v4, y, y, reversed); } 

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

  if (cell.HasRiverThroughEdge(direction)) { e2.v3.y = neighbor.StreamBedY; TriangulateRiverQuad( e1.v2, e1.v4, e2.v2, e2.v4, cell.RiverSurfaceY, neighbor.RiverSurfaceY, cell.HasIncomingRiver && cell.IncomingRiver == direction ); } 


рдкреВрд░реА рд╣реЛ рдЪреБрдХреА рдирджреАред

рд╡реА рд╕рдордиреНрд╡рдп рдЦрд┐рдВрдЪрд╛рд╡


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

рд╣рдо V рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЦреАрдВрдЪрдХрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рдкреВрд░реЗ рд╕реЗрд▓ рдкреНрд▓рд╕ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ 0 рд╕реЗ 1 рддрдХ рдЬрд╛ рд╕рдХреЗрдВред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб рдореЗрдВ рд╡реА рд╕рдордиреНрд╡рдп рдХреЛ 0.2 рд╕реЗ рдмрдврд╝рд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдХреЗрдВрджреНрд░ рдореЗрдВ 0.4 рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдордзреНрдп рдореЗрдВ рдпрд╣ 0.6 рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдпрд╣ 0.8 рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ред рдлрд┐рд░ рд╕реЗрд▓ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ, рдорд╛рди 1 рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдирджреА рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдмрд╣рддреА рд╣реИ, рддреЛ рд╣рдо рдЕрднреА рднреА рдХреЗрдВрджреНрд░ рдореЗрдВ 0.4 рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмреАрдЪ рдореЗрдВ рдпрд╣ 0.2 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рдирд╛рд░реЗ рдкрд░ - 0. рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рд╕реЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рддрдХ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ -0.2 рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЛрд╣рд░рд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдореЛрдб рдХреЗ рд╕рд╛рде рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП 0.8 рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ 0 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред


рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ V рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиред

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ TriangulateRiverQuadрдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ ред

  void TriangulateRiverQuad ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y, float v, bool reversed ) { TriangulateRiverQuad(v1, v2, v3, v4, y, y, v, reversed); } void TriangulateRiverQuad ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y1, float y2, float v, bool reversed ) { тАж } 

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

  else { rivers.AddQuadUV(0f, 1f, v, v + 0.2f); } 

рд╣рдо 0.8 рдФрд░ 0.6 рд╕реЗ рд╕рдордиреНрд╡рдп рдХреЛ рдШрдЯрд╛рдХрд░ рдПрдХ рдЙрд▓реНрдЯреЗ рджрд┐рд╢рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  if (reversed) { rivers.AddQuadUV(1f, 0f, 0.8f - v, 0.6f - v); } 

рдЕрдм рд╣рдореЗрдВ рд╕рд╣реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдПрдХ рдирд┐рд╡рд░реНрддрдорд╛рди рдирджреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдереЗред рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ TriangulateWithRiverред

  TriangulateRiverQuad( centerL, centerR, m.v2, m.v4, cell.RiverSurfaceY, 0.4f, reversed ); TriangulateRiverQuad( m.v2, m.v4, e.v2, e.v4, cell.RiverSurfaceY, 0.6f, reversed ); 

рдлрд┐рд░ TriangulateConnectionрдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓реЗрдВред

  TriangulateRiverQuad( e1.v2, e1.v4, e2.v2, e2.v4, cell.RiverSurfaceY, neighbor.RiverSurfaceY, 0.8f, cell.HasIncomingRiver && cell.IncomingRiver == direction ); 

рдФрд░ рдЕрдВрдд рдореЗрдВ TriangulateWithRiverBeginOrEndред

  TriangulateRiverQuad( m.v2, m.v4, e.v2, e.v4, cell.RiverSurfaceY, 0.6f, reversed ); center.y = m.v2.y = m.v4.y = cell.RiverSurfaceY; rivers.AddTriangle(center, m.v2, m.v4); if (reversed) { rivers.AddTriangleUV( new Vector2(0.5f, 0.4f), new Vector2(1f, 0.2f), new Vector2(0f, 0.2f) ); } else { rivers.AddTriangleUV( new Vector2(0.5f, 0.4f), new Vector2(0f, 0.6f), new Vector2(1f, 0.6f) ); } 


рд╕реНрдЯреНрд░реЗрдЪреНрдб V рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред V рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ

рдХреЗ рддрд╣ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рдирджреА рдХреЗ рдХрд┐рдирд╛рд░реЗ рдореЗрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрдиреЗ рд╣реБрдП рд╣реИрдВред

  if (IN.uv_MainTex.y < 0) { IN.uv_MainTex.y += 1; } o.Albedo.rg = IN.uv_MainTex; 


рд╕рдВрдХреБрдЪрд┐рдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ V.

unitypackage

рдирджреА рдХрд╛ рдПрдиреАрдореЗрд╢рди


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

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

рдПрдиреАрдореЗрд╢рди рдЦреЗрд▓ рдХреЗ рд╕рдордп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ V рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХрддрд╛ рдЖрдкрдХреЛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ _Timeред рдЗрд╕рдХреЗ рдШрдЯрдХ Y рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдордп рдХреЗ рдкреИрдорд╛рдиреЗ рд╣реЛрддреЗ рд╣реИрдВред

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

 // if (IN.uv_MainTex.y < 0) { // IN.uv_MainTex.y += 1; // } IN.uv_MainTex.y -= _Time.y; o.Albedo.rg = IN.uv_MainTex; 

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

  IN.uv_MainTex.y -= _Time.y; IN.uv_MainTex.y = frac(IN.uv_MainTex.y); o.Albedo.rg = IN.uv_MainTex; 


рдПрдирд┐рдореЗрдЯреЗрдб V рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред

рд╢реЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ


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

  void surf (Input IN, inout SurfaceOutputStandard o) { float2 uv = IN.uv_MainTex; uv.y -= _Time.y; float4 noise = tex2D(_MainTex, uv); fixed4 c = _Color * noise.r; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } 

рдирджреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕рдлреЗрдж рд╣реИред



рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

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

  float2 uv = IN.uv_MainTex; uv.x *= 0.0625; uv.y -= _Time.y; 


рдпреВ рдХреЛ рд╕рдордиреНрд╡рд┐рдд рдХрд░рдирд╛ред

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

  uv.y -= _Time.y * 0.25; 


рд╡рд░реНрддрдорд╛рди рд╢реЛрд░ред

рд╢реЛрд░ рдорд┐рд▓рд╛рдирд╛


рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреИрдЯрд░реНрди рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд░рд╣рддрд╛ рд╣реИред рдкрд╛рдиреА рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

  uv.x = uv.x * 0.0625 + _Time.y * 0.005; 


рдЪрд▓рддреА рд╣реБрдИ рдЖрд╡рд╛рдЬред

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

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

  float2 uv = IN.uv_MainTex; uv.x = uv.x * 0.0625 + _Time.y * 0.005; uv.y -= _Time.y * 0.25; float4 noise = tex2D(_MainTex, uv); float2 uv2 = IN.uv_MainTex; uv2.x = uv2.x * 0.0625 - _Time.y * 0.0052; uv2.y -= _Time.y * 0.23; float4 noise2 = tex2D(_MainTex, uv2); fixed4 c = _Color * (noise.r * noise2.a); 


рджреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╢реЛрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрдиред

рдкрд╛рд░рднрд╛рд╕реА рдЬрд▓


рд╣рдорд╛рд░рд╛ рдкреИрдЯрд░реНрди рдХрд╛рдлреА рдЧрддрд┐рд╢реАрд▓ рджрд┐рдЦрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдХрджрдо рдЗрд╕реЗ рдкрд╛рд░рднрд╛рд╕реА рдмрдирд╛рдирд╛ рд╣реИред

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


рдЫрд╛рдпрд╛ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдЕрдХреНрд╖рдо рд╣реИред

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

  Tags { "RenderType"="Transparent" "Queue"="Transparent" } LOD 200 CGPROGRAM #pragma surface surf Standard alpha // fullforwardshadows #pragma target 3.0 

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

  fixed4 c = saturate(_Color + noise.r * noise2.a); 

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



рд░рдВрдЧреАрди рдкрд╛рд░рднрд╛рд╕реА рдЬрд▓ред

unitypackage

рдкреБрдирд░реНрдирд┐рдорд╛рдг


рдЕрдм рдЬрдм рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рд╕рдордп рд╣реИ рдЪреЛрдЯрд┐рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рдХрд╛ред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╣рдорд╛рд░реА рдирджрд┐рдпреЛрдВ рдХреЛ рдЕрд╕рдорд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред

  public const float cellPerturbStrength = 4f; 



рд╡рд┐рдХреГрдд рдФрд░ рд╡рд┐рдХреГрдд рдЪреЛрдЯрд┐рдпрд╛рдВред

рд╡рд┐рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд▓рд╛рдХреЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╡реЗ рд╣реИрдВ! рдЪрд▓реЛ рд▓рдВрдмреЗ рдЭрд░рдиреЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред


рдЪрдЯреНрдЯрд╛рдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рдЯреЗ рдЧрдП рдкрд╛рдиреАред

рдПрдХ рдКрдВрдЪреЗ рдЭрд░рдиреЗ рд╕реЗ рдЧрд┐рд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╛рдиреА рдПрдХ рдЪрдЯреНрдЯрд╛рди рдХреЗ рдкреАрдЫреЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рд╣реА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

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

рдкрд╛рдиреА рдХреА рдХрдореА рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдирджреА рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЧрд╣рд░рд╛ рдХрд░рдирд╛ред рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдФрд░ рдирджреА рдХреЗ рдмрд┐рд╕реНрддрд░ рдХреЗ рдмреАрдЪ рдЕрдзрд┐рдХ рдЬрдЧрд╣ рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рдЪреИрдирд▓ рдХреА рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдмрдирд╛ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рдЧрд╣рд░рд╛рдИ рддрдХ рди рдЬрд╛рдПрдВред рдЪрд▓реЛ рдкреВрдЫрддреЗ рд╣реИрдВHexMetrics.streamBedElevationOffsetрдорд╛рди -1.75ред рдпрд╣ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдереЛрдХ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛, рдФрд░ рдмрд┐рд╕реНрддрд░ рдмрд╣реБрдд рдЧрд╣рд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдкрд╛рдиреА рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЕрднреА рднреА рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдкреВрд░реЗ рдЭрд░рдиреЗ рдирд╣реАрдВред

  public const float streamBedElevationOffset = -1.75f; 


рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЪреИрдирд▓ред

unitypackage

рднрд╛рдЧ 7: рд╕рдбрд╝рдХреЗрдВ


  • рд╕рдбрд╝рдХ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВред
  • рд╕рдбрд╝рдХ рдХреЛ рддреНрд░рд┐рдХреЛрдгрд┐рдд рдХрд░реЗрдВред
  • рд╣рдо рд╕рдбрд╝рдХреЛрдВ рдФрд░ рдирджрд┐рдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВред
  • рд╕рдбрд╝рдХреЛрдВ рдХреА рд╕реВрд░рдд рд╕реБрдзрд╛рд░рдирд╛ред


рд╕рднреНрдпрддрд╛ рдХреЗ рдкрд╣рд▓реЗ рд▓рдХреНрд╖рдгред

рд╕рдбрд╝рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕реЗрд▓


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

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


14 рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдбрд╝рдХ рд╡рд┐рдиреНрдпрд╛рд╕ред

рд╕рдбрд╝рдХ рдХреА рдЯреНрд░реИрдХрд┐рдВрдЧ


рд╕реЗрд▓ рдореЗрдВ рд╕рдбрд╝рдХреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдмреВрд▓рд┐рдпрди рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╕рд░рдгреА рдХреЗ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ HexCellрдФрд░ рдЗрд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рдирд┐рд░реАрдХреНрд╖рдХ рдореЗрдВ рджреЗрдЦ рд╕рдХреЗрдВред рд╕реЗрд▓ рдкреНрд░реАрдлреИрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдЫрд╣ рд╕рдбрд╝рдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗред

  [SerializeField] bool[] roads; 


рдЫрд╣ рд╕рдбрд╝рдХреЛрдВ рдХреЗ рд╕рд╛рде Prefab рд╕реЗрд▓ред

рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИред

  public bool HasRoadThroughEdge (HexDirection direction) { return roads[(int)direction]; } 

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

  public bool HasRoads { get { for (int i = 0; i < roads.Length; i++) { if (roads[i]) { return true; } } return false; } } 

рд╕рдбрд╝рдХ рд╣рдЯрд╛рдиреЗ


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

  public void RemoveRoads () { for (int i = 0; i < neighbors.Length; i++) { if (roads[i]) { roads[i] = false; } } } 

рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ рднреА рдЗрд╕реА рдорд╣рдВрдЧреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  if (roads[i]) { roads[i] = false; neighbors[i].roads[(int)((HexDirection)i).Opposite()] = false; } 

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

  if (roads[i]) { roads[i] = false; neighbors[i].roads[(int)((HexDirection)i).Opposite()] = false; neighbors[i].RefreshSelfOnly(); RefreshSelfOnly(); } 

рд╕рдбрд╝рдХреЗрдВ рдЬреЛрдбрд╝рдирд╛


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

  public void AddRoad (HexDirection direction) { if (!roads[(int)direction]) { SetRoad((int)direction, true); } } public void RemoveRoads () { for (int i = 0; i < neighbors.Length; i++) { if (roads[i]) { SetRoad(i, false); } } } void SetRoad (int index, bool state) { roads[index] = state; neighbors[index].roads[(int)((HexDirection)index).Opposite()] = state; neighbors[index].RefreshSelfOnly(); RefreshSelfOnly(); } 

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

  public void AddRoad (HexDirection direction) { if (!roads[(int)direction] && !HasRiverThroughEdge(direction)) { SetRoad((int)direction, true); } } 

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

  public int GetElevationDifference (HexDirection direction) { int difference = elevation - GetNeighbor(direction).elevation; return difference >= 0 ? difference : -difference; } 

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

  public void AddRoad (HexDirection direction) { if ( !roads[(int)direction] && !HasRiverThroughEdge(direction) && GetElevationDifference(direction) <= 1 ) { SetRoad((int)direction, true); } } 

рдЧрд▓рдд рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛


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

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

  public void SetOutgoingRiver (HexDirection direction) { if (hasOutgoingRiver && outgoingRiver == direction) { return; } HexCell neighbor = GetNeighbor(direction); if (!neighbor || elevation < neighbor.elevation) { return; } RemoveOutgoingRiver(); if (hasIncomingRiver && incomingRiver == direction) { RemoveIncomingRiver(); } hasOutgoingRiver = true; outgoingRiver = direction; // RefreshSelfOnly(); neighbor.RemoveIncomingRiver(); neighbor.hasIncomingRiver = true; neighbor.incomingRiver = direction.Opposite(); // neighbor.RefreshSelfOnly(); SetRoad((int)direction, false); } 

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

  public int Elevation { get { return elevation; } set { тАж for (int i = 0; i < roads.Length; i++) { if (roads[i] && GetElevationDifference((HexDirection)i) > 1) { SetRoad(i, false); } } Refresh(); } } 

unitypackage

рд╕рдбрд╝рдХ рдХрд╛ рд╕рдВрдкрд╛рджрди


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

  OptionalToggle riverMode, roadMode; public void SetRiverMode (int mode) { riverMode = (OptionalToggle)mode; } public void SetRoadMode (int mode) { roadMode = (OptionalToggle)mode; } 

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

  void EditCell (HexCell cell) { if (cell) { if (applyColor) { cell.Color = activeColor; } if (applyElevation) { cell.Elevation = activeElevation; } if (riverMode == OptionalToggle.No) { cell.RemoveRiver(); } if (roadMode == OptionalToggle.No) { cell.RemoveRoads(); } if (isDrag) { HexCell otherCell = cell.GetNeighbor(dragDirection.Opposite()); if (otherCell) { if (riverMode == OptionalToggle.Yes) { otherCell.SetOutgoingRiver(dragDirection); } if (roadMode == OptionalToggle.Yes) { otherCell.AddRoad(dragDirection); } } } } } 

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

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


рд╕рдбрд╝рдХреЛрдВ рдХреЗ рд╕рд╛рде рдпреВрдЖрдИред

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



рдкрд╛рдВрдЪ рд░рдВрдЧ: рдкреАрд▓рд╛, рд╣рд░рд╛, рдиреАрд▓рд╛, рдирд╛рд░рдВрдЧреА рдФрд░ рд╕рдлреЗрджред

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


рдирд┐рд░реАрдХреНрд╖рдХ рдореЗрдВ рд╕рдбрд╝рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕реЗрд▓ред

unitypackage

рд╕рдбрд╝рдХ рдХрд╛ рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди


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

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

 Shader "Custom/Road" { 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 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; half _Glossiness; half _Metallic; fixed4 _Color; void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = fixed4(IN.uv_MainTex, 1, 1); o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } ENDCG } FallBack "Diffuse" } 

рдЗрд╕ shader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдбрд╝рдХ рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рдПрдБред


рд╕рд╛рдордЧреНрд░реА рд╕рдбрд╝рдХред

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



рдмрд╛рд▓ рд╡рд╕реНрддреБ рд╕рдбрд╝рдХреЗрдВред

рдЙрд╕рдХреЗ рдмрд╛рдж, HexGridChunkрд╕рд╛рдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ HexMesh roadsрдФрд░ рдЗрд╕реЗ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ Triangulateред рдЗрд╕реЗ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ рд░реЛрдбреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ ред

  public HexMesh terrain, rivers, roads; public void Triangulate () { terrain.Clear(); rivers.Clear(); roads.Clear(); for (int i = 0; i < cells.Length; i++) { Triangulate(cells[i]); } terrain.Apply(); rivers.Apply(); roads.Apply(); } 


рд░реЛрдбреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреА рд╕рдбрд╝рдХреЗрдВ


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

  void TriangulateRoadSegment ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, Vector3 v5, Vector3 v6 ) { roads.AddQuad(v1, v2, v4, v5); roads.AddQuad(v2, v3, v5, v6); } 

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

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


рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдбрд╝рдХ рдХрд╛ рдПрдХ рдЦрдВрдбред

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

  void TriangulateEdgeStrip ( EdgeVertices e1, Color c1, EdgeVertices e2, Color c2, bool hasRoad ) { тАж } 

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

  void TriangulateEdgeStrip ( EdgeVertices e1, Color c1, EdgeVertices e2, Color c2, bool hasRoad = false ) { тАж } 

рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ?
, . ,

 int MyMethod (int x = 1, int y = 2) { return x + y; } 



 int MyMethod (int x, int y) { return x + y; } int MyMethod (int x) { return MyMethod(x, 2); } int MyMethod () { return MyMethod(1, 2}; } 

. . . .

рд╕рдбрд╝рдХ рдХреЛ рддреНрд░рд┐рднреБрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TriangulateRoadSegment, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХреЗрд╡рд▓ рдордзреНрдп рдЫрд╣ рдЪреЛрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВ ред

  void TriangulateEdgeStrip ( EdgeVertices e1, Color c1, EdgeVertices e2, Color c2, bool hasRoad = false ) { terrain.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); terrain.AddQuadColor(c1, c2); terrain.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); terrain.AddQuadColor(c1, c2); terrain.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); terrain.AddQuadColor(c1, c2); terrain.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); terrain.AddQuadColor(c1, c2); if (hasRoad) { TriangulateRoadSegment(e1.v2, e1.v3, e1.v4, e2.v2, e2.v3, e2.v4); } } 

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

  void TriangulateEdgeTerraces ( EdgeVertices begin, HexCell beginCell, EdgeVertices end, HexCell endCell, bool hasRoad ) { EdgeVertices e2 = EdgeVertices.TerraceLerp(begin, end, 1); Color c2 = HexMetrics.TerraceLerp(beginCell.Color, endCell.Color, 1); TriangulateEdgeStrip(begin, beginCell.Color, e2, c2, hasRoad); for (int i = 2; i < HexMetrics.terraceSteps; i++) { EdgeVertices e1 = e2; Color c1 = c2; e2 = EdgeVertices.TerraceLerp(begin, end, i); c2 = HexMetrics.TerraceLerp(beginCell.Color, endCell.Color, i); TriangulateEdgeStrip(e1, c1, e2, c2, hasRoad); } TriangulateEdgeStrip(e2, c2, end, endCell.Color, hasRoad); } 

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

 if (cell.GetEdgeType(direction) == HexEdgeType.Slope) { TriangulateEdgeTerraces( e1, cell, e2, neighbor, cell.HasRoadThroughEdge(direction) ); } else { TriangulateEdgeStrip( e1, cell.Color, e2, neighbor.Color, cell.HasRoadThroughEdge(direction) ); } 


рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдбрд╝рдХ рдЦрдВрдбред

рдкреНрд░рддрд┐рдкрд╛рджрди рдкрд░ рд╕реЗрд▓


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

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

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

  Tags { "RenderType"="Opaque" "Queue" = "Geometry+1" } 

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

  Tags { "RenderType"="Opaque" "Queue" = "Geometry+1" } LOD 200 Offset -1, -1 

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


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

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


рд╕рдбрд╝рдХ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рддреНрд░рд┐рдХреЛрдгрд╛рд╕рдиред

рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЛ рддреНрд░рд┐рднреБрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реЗрд▓ рдХреЗ рдХреЗрдВрджреНрд░, рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рдордзреНрдп рдХреЛрдиреЗ рдФрд░ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдХреЛрдиреЗ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред TriangulateRoadрдЙрдкрдпреБрдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ ред

  void TriangulateRoad ( Vector3 center, Vector3 mL, Vector3 mR, EdgeVertices e ) { } 

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

  void TriangulateRoad ( Vector3 center, Vector3 mL, Vector3 mR, EdgeVertices e ) { Vector3 mC = Vector3.Lerp(mL, mR, 0.5f); TriangulateRoadSegment(mL, mC, mR, e.v2, e.v3, e.v4); } 

рдЕрдм рд╣рдо рд╢реЗрд╖ рджреЛ рддреНрд░рд┐рдХреЛрдгреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

  TriangulateRoadSegment(mL, mC, mR, e.v2, e.v3, e.v4); roads.AddTriangle(center, mL, mC); roads.AddTriangle(center, mC, mR); 

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

  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) ); 

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

  void Triangulate (HexDirection direction, HexCell cell) { тАж if (cell.HasRiver) { тАж } else { TriangulateWithoutRiver(direction, cell, center, e); } тАж } void TriangulateWithoutRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { TriangulateEdgeFan(center, e, cell.Color); if (cell.HasRoadThroughEdge(direction)) { TriangulateRoad( center, Vector3.Lerp(center, e.v1, 0.5f), Vector3.Lerp(center, e.v5, 0.5f), e ); } } 


рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕реЗ рдЧреБрдЬрд░рддреА рд╕рдбрд╝рдХреЗрдВред

рд╕рдбрд╝рдХ рдХреА рдкрд╕рд▓рд┐рдпрд╛рдБ


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

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

  void TriangulateRoadEdge (Vector3 center, Vector3 mL, Vector3 mR) { roads.AddTriangle(center, mL, mR); roads.AddTriangleUV( new Vector2(1f, 0f), new Vector2(0f, 0f), new Vector2(0f, 0f) ); } 


рд╕рдбрд╝рдХ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ред

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

  void TriangulateRoad ( Vector3 center, Vector3 mL, Vector3 mR, EdgeVertices e, bool hasRoadThroughCellEdge ) { if (hasRoadThroughCellEdge) { Vector3 mC = Vector3.Lerp(mL, mR, 0.5f); TriangulateRoadSegment(mL, mC, mR, e.v2, e.v3, e.v4); 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) ); } else { TriangulateRoadEdge(center, mL, mR); } } 

рдЕрдм рдХрд┐рд╕реА рднреА рд╕рдбрд╝рдХ рдХреЗ рд╕реЗрд▓ рд╕реЗ рдЧреБрдЬрд░рдиреЗ TriangulateWithoutRiverрдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ TriangulateRoadред рдФрд░ рдЙрд╕реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреА рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рд╕рдбрд╝рдХ рд╡рд░реНрддрдорд╛рди рдХрд┐рдирд╛рд░реЗ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИред

  void TriangulateWithoutRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { TriangulateEdgeFan(center, e, cell.Color); if (cell.HasRoads) { TriangulateRoad( center, Vector3.Lerp(center, e.v1, 0.5f), Vector3.Lerp(center, e.v5, 0.5f), e, cell.HasRoadThroughEdge(direction) ); } } 


рдкреВрд░реНрдг рдкрд╕рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдбрд╝рдХреЗрдВред

рд╕рдбрд╝рдХ рдХрд╛ рд╕реБрдЪрд╛рд░реВ рд╣реЛрдирд╛


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

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

  Vector2 GetRoadInterpolators (HexDirection direction, HexCell cell) { Vector2 interpolators; return interpolators; } 

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

  Vector2 GetRoadInterpolators (HexDirection direction, HexCell cell) { Vector2 interpolators; if (cell.HasRoadThroughEdge(direction)) { interpolators.x = interpolators.y = 0.5f; } return interpolators; } 

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

  Vector2 GetRoadInterpolators (HexDirection direction, HexCell cell) { Vector2 interpolators; if (cell.HasRoadThroughEdge(direction)) { interpolators.x = interpolators.y = 0.5f; } else { interpolators.x = cell.HasRoadThroughEdge(direction.Previous()) ? 0.5f : 0.25f; interpolators.y = cell.HasRoadThroughEdge(direction.Next()) ? 0.5f : 0.25f; } return interpolators; } 

рдЕрдм рдЖрдк рдЗрд╕ рдирдИ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдкреНрд░рдХреНрд╖реЗрдкрдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕рдбрд╝рдХреЛрдВ рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

  void TriangulateWithoutRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { TriangulateEdgeFan(center, e, cell.Color); 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) ); } } 



рдЪрд┐рдХрдиреА рд╕рдбрд╝рдХреЗрдВред

unitypackage

рдирджрд┐рдпреЛрдВ рдФрд░ рд╕рдбрд╝рдХреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди


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


рдирджрд┐рдпреЛрдВ рдХреЗ рдкрд╛рд╕ рд╕рдбрд╝рдХреЗрдВ рдирд╣реАрдВ рд╣реИрдВред

рдЖрдЗрдП TriangulateRoadAdjacentToRiverрдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ ред рд╣рдо рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣реЗрдВрдЧреЗ TriangulateAdjacentToRiverред

  void TriangulateAdjacentToRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { if (cell.HasRoads) { TriangulateRoadAdjacentToRiver(direction, cell, center, e); } тАж } void TriangulateRoadAdjacentToRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { } 

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

 void TriangulateRoadAdjacentToRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { bool hasRoadThroughEdge = cell.HasRoadThroughEdge(direction); Vector2 interpolators = GetRoadInterpolators(direction, cell); Vector3 roadCenter = center; Vector3 mL = Vector3.Lerp(roadCenter, e.v1, interpolators.x); Vector3 mR = Vector3.Lerp(roadCenter, e.v5, interpolators.y); TriangulateRoad(roadCenter, mL, mR, e, hasRoadThroughEdge); } 

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


рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╡рд╛рд▓реА рд╕рдбрд╝рдХреЗрдВред

рдирджреА рдХрд╛ рдЖрд░рдВрдн рдпрд╛ рдЕрдВрдд


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

  public HexDirection RiverBeginOrEndDirection { get { return hasIncomingRiver ? incomingRiver : outgoingRiver; } } 

рдЕрдм рд╣рдо рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ HexGridChunk.TriangulateRoadAdjacentToRiverрд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рд╕рдбрд╝рдХ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рддрд┐рд╣рд╛рдИ рдХреЛ рдордзреНрдп рд░рд┐рдм рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

  bool hasRoadThroughEdge = cell.HasRoadThroughEdge(direction); Vector2 interpolators = GetRoadInterpolators(direction, cell); Vector3 roadCenter = center; if (cell.HasRiverBeginOrEnd) { roadCenter += HexMetrics.GetSolidEdgeMiddle( cell.RiverBeginOrEndDirection.Opposite() ) * (1f / 3f); } Vector3 mL = Vector3.Lerp(roadCenter, e.v1, interpolators.x); Vector3 mR = Vector3.Lerp(roadCenter, e.v5, interpolators.y); TriangulateRoad(roadCenter, mL, mR, e, hasRoadThroughEdge); 


рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдбрд╝рдХреЗрдВред

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

рд╣рдо рдирджреА рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рдЦреЗрдВред

  Vector3 mL = Vector3.Lerp(roadCenter, e.v1, interpolators.x); Vector3 mR = Vector3.Lerp(roadCenter, e.v5, interpolators.y); TriangulateRoad(roadCenter, mL, mR, e, hasRoadThroughEdge); if (cell.HasRiverThroughEdge(direction.Previous())) { TriangulateRoadEdge(roadCenter, center, mL); } if (cell.HasRiverThroughEdge(direction.Next())) { TriangulateRoadEdge(roadCenter, mR, center); } 

рдХреНрдпрд╛ рдЖрдк рдЕрдиреНрдп рд╡рд┐рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?
. , .


рддреИрдпрд╛рд░ рд╕рдбрд╝рдХреЗрдВред

рд╕реАрдзреА рдирджрд┐рдпрд╛рдБ


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


рдПрдХ рд╕реАрдзреА рдирджреА рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реБрдП рд╕рдбрд╝рдХреЗрдВред

рдпрджрд┐ рд╕реЗрд▓ рдореЗрдВ рдирджреА рдХреА рд╢реБрд░реБрдЖрдд рдпрд╛ рдЕрдВрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓реА рдФрд░ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдирджрд┐рдпрд╛рдВ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЬрд╛рддреА рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реАрдзреА рдирджреА рд╣реИред

  if (cell.HasRiverBeginOrEnd) { roadCenter += HexMetrics.GetSolidEdgeMiddle( cell.RiverBeginOrEndDirection.Opposite() ) * (1f / 3f); } else if (cell.IncomingRiver == cell.OutgoingRiver.Opposite()) { } 

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

  bool hasRoadThroughEdge = cell.HasRoadThroughEdge(direction); bool previousHasRiver = cell.HasRiverThroughEdge(direction.Previous()); bool nextHasRiver = cell.HasRiverThroughEdge(direction.Next()); Vector2 interpolators = GetRoadInterpolators(direction, cell); Vector3 roadCenter = center; if (cell.HasRiverBeginOrEnd) { roadCenter += HexMetrics.GetSolidEdgeMiddle( cell.RiverBeginOrEndDirection.Opposite() ) * (1f / 3f); } else if (cell.IncomingRiver == cell.OutgoingRiver.Opposite()) { if (previousHasRiver) { } else { } } Vector3 mL = Vector3.Lerp(roadCenter, e.v1, interpolators.x); Vector3 mR = Vector3.Lerp(roadCenter, e.v5, interpolators.y); TriangulateRoad(roadCenter, mL, mR, e, hasRoadThroughEdge); if (previousHasRiver) { TriangulateRoadEdge(roadCenter, center, mL); } if (nextHasRiver) { TriangulateRoadEdge(roadCenter, mR, center); } 

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

  else if (cell.IncomingRiver == cell.OutgoingRiver.Opposite()) { Vector3 corner; if (previousHasRiver) { corner = HexMetrics.GetSecondSolidCorner(direction); } else { corner = HexMetrics.GetFirstSolidCorner(direction); } } 

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

  else if (cell.IncomingRiver == cell.OutgoingRiver.Opposite()) { Vector3 corner; if (previousHasRiver) { corner = HexMetrics.GetSecondSolidCorner(direction); } else { corner = HexMetrics.GetFirstSolidCorner(direction); } roadCenter += corner * 0.5f; center += corner * 0.25f; } 


рд╡рд┐рднрд╛рдЬрд┐рдд рд╕рдбрд╝рдХреЗрдВред

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

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

  if (previousHasRiver) { if ( !hasRoadThroughEdge && !cell.HasRoadThroughEdge(direction.Next()) ) { return; } corner = HexMetrics.GetSecondSolidCorner(direction); } else { if ( !hasRoadThroughEdge && !cell.HasRoadThroughEdge(direction.Previous()) ) { return; } corner = HexMetrics.GetFirstSolidCorner(direction); } 


рд╕рдбрд╝рдХреЛрдВ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ред

рдкреБрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
. .

рдЬрд╝рд┐рдЧрдЬрд╝реИрдЧ рдирджрд┐рдпрд╛рдБ


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


рд╕рдбрд╝рдХреЛрдВ рд╕реЗ рдЧреБрдЬрд░ рд░рд╣реЗ рдЭреВрд▓реЗ

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

  if (cell.HasRiverBeginOrEnd) { тАж } else if (cell.IncomingRiver == cell.OutgoingRiver.Opposite()) { тАж } else if (cell.IncomingRiver == cell.OutgoingRiver.Previous()) { } else if (cell.IncomingRiver == cell.OutgoingRiver.Next()) { } 

рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реА рдирджреА рдХреА рджрд┐рд╢рд╛ рдХреЗ рдХреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдбрд╝рдХ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдирд╛ рдЧрдпрд╛ рдХреЛрдг рдкреНрд░рд╡рд╛рд╣ рдХреА рджрд┐рд╢рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред 0.2 рдХреЗ рдХрд╛рд░рдХ рдХреЗ рд╕рд╛рде рдЗрд╕ рдХреЛрдг рд╕реЗ рд╕рдбрд╝рдХ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред

  else if (cell.IncomingRiver == cell.OutgoingRiver.Previous()) { roadCenter -= HexMetrics.GetSecondCorner(cell.IncomingRiver) * 0.2f; } else if (cell.IncomingRiver == cell.OutgoingRiver.Next()) { roadCenter -= HexMetrics.GetFirstCorner(cell.IncomingRiver) * 0.2f; } 


рд╕рдбрд╝рдХ рдХреЛ рдЬрд╝рд┐рдЧрдЬрд╝реИрдЧ рд╕реЗ рджреВрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ред

рдХреБрдЯрд┐рд▓ рдирджрд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░


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


рдкрдХреНрдХреА рд╕рдбрд╝рдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдШреБрдорд╛рд╡рджрд╛рд░ рдирджреАред

рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рджрд┐рд╢рд╛ рдХреЗ рджреЛрдиреЛрдВ рддрд░рдл рдПрдХ рдирджреА рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рд╡рдХреНрд░ рдХреЗ рдЕрдВрджрд░ рд╣реЛрддреЗ рд╣реИрдВред

  else if (cell.IncomingRiver == cell.OutgoingRiver.Next()) { тАж } else if (previousHasRiver && nextHasRiver) { } 

рд╣рдореЗрдВ рд╕рдбрд╝рдХ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рд╕реЗрд▓ рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд┐рдирд╛рд░реЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдбрд╝рдХ рдереЛрдбрд╝реА рдЫреЛрдЯреА рд╣реЛ рдЬрд╛рдПред 0.7 рдХрд╛ рдЧреБрдгрд╛рдВрдХ рдХрд░реЗрдЧрд╛ред рд╕реЗрд▓ рдХреЗрдВрджреНрд░ рдХреЛ 0.5 рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

  else if (previousHasRiver && nextHasRiver) { Vector3 offset = HexMetrics.GetSolidEdgeMiddle(direction) * HexMetrics.innerToOuter; roadCenter += offset * 0.7f; center += offset * 0.5f; } 


рдЫреЛрдЯреА рд╕рдбрд╝рдХреЗрдВред

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

  else if (previousHasRiver && nextHasRiver) { if (!hasRoadThroughEdge) { return; } Vector3 offset = HexMetrics.GetSolidEdgeMiddle(direction) * HexMetrics.innerToOuter; roadCenter += offset * 0.7f; center += offset * 0.5f; } 


рд╕рдбрд╝рдХреЛрдВ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ред

рдХреБрдЯрд┐рд▓ рдирджрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд╣рд░


рдкрд┐рдЫрд▓реЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рдж, рдХреЗрд╡рд▓ рд╢реЗрд╖ рд╡рд┐рдХрд▓реНрдк рдШреБрдорд╛рд╡рджрд╛рд░ рдирджреА рдХрд╛ рдмрд╛рд╣рд░реА рд╣рд┐рд╕реНрд╕рд╛ рдерд╛ред рдмрд╛рд╣рд░ рд╕реЗрд▓ рдХреЗ рддреАрди рд╣рд┐рд╕реНрд╕реЗ рд╣реИрдВред рд╣рдореЗрдВ рдордзреНрдп рджрд┐рд╢рд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдбрд╝рдХ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ 0.25 рдХреЗ рдХрд╛рд░рдХ рд╕реЗ рдЗрд╕ рд░рд┐рдм рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

  else if (previousHasRiver && nextHasRiver) { тАж } else { HexDirection middle; if (previousHasRiver) { middle = direction.Next(); } else if (nextHasRiver) { middle = direction.Previous(); } else { middle = direction; } roadCenter += HexMetrics.GetSolidEdgeMiddle(middle) * 0.25f; } 


рд╕рдбрд╝рдХ рдХреЗ рдмрд╛рд╣рд░ рдмрджрд▓ рджрд┐рдпрд╛ред

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

  else { HexDirection middle; if (previousHasRiver) { middle = direction.Next(); } else if (nextHasRiver) { middle = direction.Previous(); } else { middle = direction; } if ( !cell.HasRoadThroughEdge(middle) && !cell.HasRoadThroughEdge(middle.Previous()) && !cell.HasRoadThroughEdge(middle.Next()) ) { return; } roadCenter += HexMetrics.GetSolidEdgeMiddle(middle) * 0.25f; } 



рдХреНрд▓рд┐рдкрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╕рдбрд╝рдХреЗрдВред

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


рдирджрд┐рдпреЛрдВ рдФрд░ рд╕рдбрд╝рдХреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрдиред

unitypackage

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


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


рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рдиред

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

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

  void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = _Color; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } 


рд▓рд╛рд▓ рд╕рдбрд╝рдХреЗрдВред

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

  void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = _Color; float blend = IN.uv_MainTex.x; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = blend; } 

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рд╢реЗрдк рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реИред рдЕрдм рдЙрд╕реЗ рдЕрд▓реНрдлрд╛ рдмреНрд▓реЗрдВрдбрд┐рдВрдЧ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдореЗрдВ рдПрдХ рд╕рдВрднреЛрдЧ decal рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ shader рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ #pragma surfaceрдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдХрд░ рдЖрд╡рд╢реНрдпрдХ shader рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ decal:blendред

  #pragma surface surf Standard fullforwardshadows decal:blend 


рд╕рдбрд╝рдХреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдгред

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


рд░реИрдЦрд┐рдХ рдкреНрд░рдЧрддрд┐ рдФрд░ smoothstepред

рдлрд╝рдВрдХреНрд╢рди smoothstepрдореЗрдВ рдПрдХ рдордирдорд╛рдирд╛ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рд╡рдХреНрд░ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рд╕реАрдорд╛ рдХреЗ рдмрд╛рд╣рд░ рдЗрдирдкреБрдЯ рдорд╛рди рд╡рдХреНрд░ рдХреЛ рд╕рдкрд╛рдЯ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рд╣реИрдВред рдХрд░реНрд╡ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ 0.4 рдФрд░ рдЕрдВрдд рдореЗрдВ 0.7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпреВ 0 рд╕реЗ 0.4 рддрдХ рд╕рдордиреНрд╡рдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрдЧрд╛ред рдФрд░ рдпреВ 0.7 рд╕реЗ 1 рддрдХ рд╕рдордиреНрд╡рдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрдЧрд╛ред рд╕рдВрдХреНрд░рдордг 0.4 рдФрд░ 0.7 рдХреЗ рдмреАрдЪ рд╣реЛрддрд╛ рд╣реИред

  float blend = IN.uv_MainTex.x; blend = smoothstep(0.4, 0.7, blend); 


рдЕрдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рддреНрд╡рд░рд┐рдд рд╕рдВрдХреНрд░рдордгред

рд╢реЛрд░ рдХреЗ рд╕рд╛рде рд╕рдбрд╝рдХ


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

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

рд╕рддрд╣ рдХреА рдЫрд╛рдпрд╛ рдореЗрдВ рджреБрдирд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдирдкреБрдЯ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ float3 worldPosред

  struct Input { float2 uv_MainTex; float3 worldPos; }; 

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

  float4 noise = tex2D(_MainTex, IN.worldPos.xz * 0.025); fixed4 c = _Color; float blend = IN.uv_MainTex.x; 

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

  float blend = IN.uv_MainTex.x; blend *= noise.x + 0.5; blend = smoothstep(0.4, 0.7, blend); 



рд╕рдбрд╝рдХ рдХреЗ рд╡рд┐рдХреГрдд рдХрд┐рдирд╛рд░реЗред

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

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

  fixed4 c = _Color * (noise.y * 0.75 + 0.25); 


рдЦрд╕реНрддрд╛рд╣рд╛рд▓ рд╕рдбрд╝рдХреЗрдВред

unitypackage

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


All Articles