рдПрдХрддрд╛ рдореЗрдВ рд╣реЗрдХреНрд╕рд╛рдЧреЛрди рдореИрдкреНрд╕: рднрд╛рдЧ 1-3

рдЫрд╡рд┐

рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдпрд╣ рд▓реЗрдЦ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рд╕реЗ рдирдХреНрд╢реЗ рдмрдирд╛рдиреЗ рдкрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд (27 рднрд╛рдЧреЛрдВ) рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рд╣реИред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

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

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

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

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

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

рднрд╛рдЧ 1: рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рд╕реЗ рдореЗрд╖


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


  • рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред
  • рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреЗ рдПрдХ рдЧреНрд░рд┐рдб рдХреЛ рддреНрд░рд┐рдХреЛрдгрд┐рдд рдХрд░реЗрдВред
  • рд╣рдо рдШрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
  • рд╣рдо рдЧреНрд░рд┐рдб рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВред
  • рдПрдХ рдЗрди-рдЧреЗрдо рдПрдбрд┐рдЯрд░ рдмрдирд╛рдПрдВред

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

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


рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдирдХреНрд╢рд╛ред

рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


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


рдЪреМрдХреЛрд░ рдФрд░ рдЙрд╕рдХреЗ рдкрдбрд╝реЛрд╕реАред

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

рдЖрд╕рдиреНрди рд╡рд░реНрдЧ рдЧреНрд░рд┐рдб рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреНрдпрд╛ рд╣реИ? рдпрджрд┐ рдХрд┐рдирд╛рд░реЗ рдХреА рд▓рдВрдмрд╛рдИ 1 рд╣реИ, рддреЛ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ 1 рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рдХрд░реНрдг рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╡рд╛рдм тИЪ2 рд╣реИред

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


рд╖рдЯреНрдХреЛрдг рдФрд░ рдЙрд╕рдХреЗ рдкрдбрд╝реЛрд╕реАред

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

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


рд╣реЗрдХреНрд╕рд╛рдЧреЛрди рдХреЗ рдмрд╛рд╣рд░реА рдФрд░ рдЖрдВрддрд░рд┐рдХ рддреНрд░рд┐рдЬреНрдпрд╛ред

рдПрдХ рдЖрдВрддрд░рд┐рдХ рддреНрд░рд┐рдЬреНрдпрд╛ рднреА рд╣реИ, рдЬреЛ рдХреЗрдВрджреНрд░ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рдирд╛рд░реЗ рддрдХ рдХреА рджреВрд░реА рд╣реИред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдЗрд╕ рдорд╛рди рджреЛ рдмрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рднреАрддрд░ рдХрд╛ рджрд╛рдпрд░рд╛ рд╣реИ  f r a c s q r t 3 2  рдмрд╛рд╣рд░реА рджрд╛рдпрд░реЗ рд╕реЗ, рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИ 5 рдПрд╕ рдХреНрдпреВ рдЖрд░ рдЯреА 3  ред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдореЗрдВ рд░рдЦреЗрдВред

using UnityEngine; public static class HexMetrics { public const float outerRadius = 10f; public const float innerRadius = outerRadius * 0.866025404f; } 

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

рдЗрд╕рд▓рд┐рдП, рд░рд┐рдм рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рдИрдИ рдЖрдВрддрд░рд┐рдХ рддреНрд░рд┐рдЬреНрдпрд╛ рд╣реИ  sqrte2тИТ(e/2)2= sqrt3e2/4=e sqrt3/2 рд▓рдЧрднрдЧ0.886eрд▓рдЧрднрдЧ ред

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


рд╕рдВрднрд╡ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ред

  public static Vector3[] corners = { new Vector3(0f, 0f, outerRadius), new Vector3(innerRadius, 0f, 0.5f * outerRadius), new Vector3(innerRadius, 0f, -0.5f * outerRadius), new Vector3(0f, 0f, -outerRadius), new Vector3(-innerRadius, 0f, -0.5f * outerRadius), new Vector3(-innerRadius, 0f, 0.5f * outerRadius) }; 

unitypackage

рдПрдХ рдЧреНрд░рд┐рдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг


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

 using UnityEngine; public class HexCell : MonoBehaviour { } 

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


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

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

 using UnityEngine; public class HexGrid : MonoBehaviour { public int width = 6; public int height = 6; public HexCell cellPrefab; } 


рд╖рдЯреНрднреБрдЬ рдореЗрд╖ рд╡рд╕реНрддреБред

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

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

  HexCell[] cells; void Awake () { cells = new HexCell[height * width]; for (int z = 0, i = 0; z < height; z++) { for (int x = 0; x < width; x++) { CreateCell(x, z, i++); } } } void CreateCell (int x, int z, int i) { Vector3 position; position.x = x * 10f; position.y = 0f; position.z = z * 10f; HexCell cell = cells[i] = Instantiate<HexCell>(cellPrefab); cell.transform.SetParent(transform, false); cell.transform.localPosition = position; } 


рд╡рд┐рдорд╛рдиреЛрдВ рдХрд╛ рд╡рд░реНрдЧ рдЧреНрд░рд┐рдбред

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

рд╕рдордиреНрд╡рдп рдХрд╛ рдкреНрд░рджрд░реНрд╢рди


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

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

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



рд╣реЗрдХреНрд╕рд╛рдЧреЛрди рдХреЗ рдЧреНрд░рд┐рдб рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдХреИрдирд╡рд╛рд╕ред

рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ ( рдЧреЗрдордСрдмрдЬреЗрдХреНрдЯ / рдпреВрдЖрдИ / рдЯреЗрдХреНрд╕реНрдЯ ) рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░реАрдлреИрдм рдореЗрдВ рдмрджрд▓ рджреЗрдВред рдЗрд╕рдХреЗ рдПрдВрдХрд░реЛрдВ рдФрд░ рдзреБрд░реА рдХреЛ рдХреЗрдВрджреНрд░ рдореЗрдВ рд░рдЦреЗрдВ, рдЖрдХрд╛рд░ 5 рд╕реЗ 15. рддрдХ рд╕реЗрдЯ рдХрд░реЗрдВред рдХреЗрдВрджреНрд░ рдореЗрдВ рдкрд╛рда рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рднреА рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд╝реЙрдиреНрдЯ рдЖрдХрд╛рд░ рдХреЛ 4 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╛рда рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рд░рд┐рдЪ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рдХрд┐ рдХреНрдпрд╛ Raycast рдЯрд╛рд░реНрдЧреЗрдЯ рдЪрд╛рд▓реВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред



Prefab рд╕реЗрд▓ рд▓реЗрдмрд▓ред

рдЕрдм рд╣рдореЗрдВ рдЧреНрд░рд┐рдб рдХреЛ рдХреИрдирд╡рд╛рд╕ рдФрд░ рдкреНрд░реАрдлреИрдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред using UnityEngine.UI; рдЙрд╕рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ using UnityEngine.UI; рдЖрд╕рд╛рдиреА рд╕реЗ UnityEngine.UI.Text рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред GetComponentInChildren рд▓реЗрдмрд▓ рдХреЛ рдПрдХ рд╕рд╛рдЭрд╛ рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдХреИрдирд╡рд╛рд╕ GetComponentInChildren рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  public Text cellLabelPrefab; Canvas gridCanvas; void Awake () { gridCanvas = GetComponentInChildren<Canvas>(); тАж } 


рдХрдиреЗрдХреНрд╢рди рдкреНрд░реАрдлреИрдм рдЯреИрдЧред

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

  void CreateCell (int x, int z, int i) { тАж Text label = Instantiate<Text>(cellLabelPrefab); label.rectTransform.SetParent(gridCanvas.transform, false); label.rectTransform.anchoredPosition = new Vector2(position.x, position.z); label.text = x.ToString() + "\n" + z.ToString(); } 


рд╕рдордиреНрд╡рдп рдХрд╛ рдкреНрд░рджрд░реНрд╢рдиред

рд╖рдЯреНрднреБрдЬ рдкрджреЛрдВ


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


рдкрдбрд╝реЛрд╕реА рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ред

  position.x = x * (HexMetrics.innerRadius * 2f); position.y = 0f; position.z = z * (HexMetrics.outerRadius * 1.5f); 


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

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

  position.x = (x + z * 0.5f) * (HexMetrics.innerRadius * 2f); 


рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХрд╛ рдЙрдЪрд┐рдд рд╕реНрдерд╛рди рд╣реАрд░реЗ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдЧреНрд░рд┐рдб рдмрдирд╛рддрд╛ рд╣реИред

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

  position.x = (x + z * 0.5f - z / 2) * (HexMetrics.innerRadius * 2f); 


рдПрдХ рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХрд╛ рд╕реНрдерд╛рдиред

unitypackage

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


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


рдФрд░ рдХреЛрдИ рд╡рд┐рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред

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

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

 using UnityEngine; using System.Collections.Generic; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class HexMesh : MonoBehaviour { Mesh hexMesh; List<Vector3> vertices; List<int> triangles; void Awake () { GetComponent<MeshFilter>().mesh = hexMesh = new Mesh(); hexMesh.name = "Hex Mesh"; vertices = new List<Vector3>(); triangles = new List<int>(); } } 

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



рд╣реЗрдХреНрд╕ рдореЗрд╖ рд╡рд╕реНрддреБред

HexGrid рдЕрдм рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЕрдкрдиреЗ рд╖рдЯреНрднреБрдЬ рдЬрд╛рд▓ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдЙрд╕рдиреЗ рдХреИрдирд╡рд╛рд╕ рдкрд╛рдпрд╛ред

  HexMesh hexMesh; void Awake () { gridCanvas = GetComponentInChildren<Canvas>(); hexMesh = GetComponentInChildren<HexMesh>(); тАж } 

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

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

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

  public void Triangulate (HexCell[] cells) { hexMesh.Clear(); vertices.Clear(); triangles.Clear(); for (int i = 0; i < cells.Length; i++) { Triangulate(cells[i]); } hexMesh.vertices = vertices.ToArray(); hexMesh.triangles = triangles.ToArray(); hexMesh.RecalculateNormals(); } void Triangulate (HexCell cell) { } 

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

  void AddTriangle (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); } 

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

  void Triangulate (HexCell cell) { Vector3 center = cell.transform.localPosition; AddTriangle( center, center + HexMetrics.corners[0], center + HexMetrics.corners[1] ); } 


рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдХрд╛ рдкрд╣рд▓рд╛ рддреНрд░рд┐рдХреЛрдгред

рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЪрд▓реЛ рд╕рднреА рдЫрд╣ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд╛рд╢ред

  Vector3 center = cell.transform.localPosition; for (int i = 0; i < 6; i++) { AddTriangle( center, center + HexMetrics.corners[i], center + HexMetrics.corners[i + 1] ); } 

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

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

  public static Vector3[] corners = { new Vector3(0f, 0f, outerRadius), new Vector3(innerRadius, 0f, 0.5f * outerRadius), new Vector3(innerRadius, 0f, -0.5f * outerRadius), new Vector3(0f, 0f, -outerRadius), new Vector3(-innerRadius, 0f, -0.5f * outerRadius), new Vector3(-innerRadius, 0f, 0.5f * outerRadius), new Vector3(0f, 0f, outerRadius) }; 


рдкреВрд░реА рддрд░рд╣ рд╕реЗ Hexagonsред

unitypackage

рд╖рдЯреНрдХреЛрдгреАрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ


рдЪрд▓реЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВ, рдЕрдм рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреЗ рдЧреНрд░рд┐рдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВред Z рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ X рд╕рдордиреНрд╡рдпрд┐рдд zigzagsред рдпрд╣ рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдСрдлрд╝рд╕реЗрдЯ рдХрд╛ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реИред


рдСрдлрд╕реЗрдЯ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХреА рдЧрдИ рд╢реВрдиреНрдп рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИред

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

 using UnityEngine; [System.Serializable] public struct HexCoordinates { public int X { get; private set; } public int Z { get; private set; } public HexCoordinates (int x, int z) { X = x; Z = z; } } 

рд╕рд╛рдзрд╛рд░рдг рдСрдлрд╕реЗрдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдЗрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдирдХрд▓ рдХрд░реЗрдВрдЧреЗред

  public static HexCoordinates FromOffsetCoordinates (int x, int z) { return new HexCoordinates(x, z); } } 

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

  public override string ToString () { return "(" + X.ToString() + ", " + Z.ToString() + ")"; } public string ToStringOnSeparateLines () { return X.ToString() + "\n" + Z.ToString(); } 

рдЕрдм рд╣рдо рдЕрдкрдиреЗ HexCell рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдХрдИ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 public class HexCell : MonoBehaviour { public HexCoordinates coordinates; } 

HexGrid.CreateCell рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдирдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗред

  HexCell cell = cells[i] = Instantiate<HexCell>(cellPrefab); cell.transform.SetParent(transform, false); cell.transform.localPosition = position; cell.coordinates = HexCoordinates.FromOffsetCoordinates(x, z); 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(); 

рдЕрдм рдЗрди рдПрдХреНрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рдПрдХ рд╕реАрдзреА рдзреБрд░реА рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрдВред рдпрд╣ рдХреНрд╖реИрддрд┐рдЬ рдкрд╛рд░реА рдХреЛ рд░рджреНрдж рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЕрдХреНрд╖реАрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

  public static HexCoordinates FromOffsetCoordinates (int x, int z) { return new HexCoordinates(x - z / 2, z); } 



рдЕрдХреНрд╖реАрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред

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


Y рдорд╛рдк рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

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

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

  public int Y { get { return -X - Z; } } public override string ToString () { return "(" + X.ToString() + ", " + Y.ToString() + ", " + Z.ToString() + ")"; } public string ToStringOnSeparateLines () { return X.ToString() + "\n" + Y.ToString() + "\n" + Z.ToString(); } 


рдШрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред

рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ


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


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

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

  [SerializeField] private int x, z; public int X { get { return x; } } public int Z { get { return z; } } public HexCoordinates (int x, int z) { this.x = x; this.z = z; } 


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

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

рд╡рд░реНрдЧ рдХреЛ UnityEditor.PropertyDrawer рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП UnityEditor.CustomPropertyDrawer рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 using UnityEngine; using UnityEditor; [CustomPropertyDrawer(typeof(HexCoordinates))] public class HexCoordinatesDrawer : PropertyDrawer { } 

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

  public override void OnGUI ( Rect position, SerializedProperty property, GUIContent label ) { } 

рд╣рдо рд╕рдВрдкрддреНрддрд┐ рд╕реЗ x рдФрд░ z рдХреЗ рдорд╛рди рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдорд╛рд░реЗ HexCoordinates.ToString рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ GUI рд▓реЗрдмрд▓ рдХреЛ рдЪрдпрдирд┐рдд рд╕реНрдерд╛рди рдкрд░ рдбреНрд░рд╛ рдХрд░реЗрдВред

  public override void OnGUI ( Rect position, SerializedProperty property, GUIContent label ) { HexCoordinates coordinates = new HexCoordinates( property.FindPropertyRelative("x").intValue, property.FindPropertyRelative("z").intValue ); GUI.Label(position, coordinates.ToString()); } 


рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд▓реЗрдмрд▓ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред

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

  position = EditorGUI.PrefixLabel(position, label); GUI.Label(position, coordinates.ToString()); 


рдПрдХ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред

unitypackage

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


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

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

  void Update () { if (Input.GetMouseButton(0)) { HandleInput(); } } void HandleInput () { Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(inputRay, out hit)) { TouchCell(hit.point); } } void TouchCell (Vector3 position) { position = transform.InverseTransformPoint(position); Debug.Log("touched at " + position); } 

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

  MeshCollider meshCollider; void Awake () { GetComponent<MeshFilter>().mesh = hexMesh = new Mesh(); meshCollider = gameObject.AddComponent<MeshCollider>(); тАж } 

рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреЛрд▓рд╛рдЗрдбрд░ рдХреЛ рдПрдХ рдореЗрд╖ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред

  public void Triangulate (HexCell[] cells) { тАж meshCollider.sharedMesh = hexMesh; } 

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

рдЕрдм рд╣рдо рдЧреНрд░рд┐рдб рдХреЛ рдЫреВ рд╕рдХрддреЗ рд╣реИрдВ! рд▓реЗрдХрд┐рди рд╣рдо рдХрд┐рд╕ рдХреЛрд╢рд┐рдХрд╛ рдХреЛ рд╕реНрдкрд░реНрд╢ рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрдкрд░реНрд╢ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ HexCoordinates рд▓рд┐рдП рдХрд╛рдо HexCoordinates , рдЗрд╕рд▓рд┐рдП рд╣рдо рдШреЛрд╖рд┐рдд HexCoordinates рдХрд┐ рдЗрд╕рдХреА рдПрдХ рд╕реНрдереИрддрд┐рдХ FromPosition рд╡рд┐рдзрд┐ рд╣реИред

  public void TouchCell (Vector3 position) { position = transform.InverseTransformPoint(position); HexCoordinates coordinates = HexCoordinates.FromPosition(position); Debug.Log("touched at " + coordinates.ToString()); } 

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

  public static HexCoordinates FromPosition (Vector3 position) { float x = position.x / (HexMetrics.innerRadius * 2f); float y = -x; } 

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

  float offset = position.z / (HexMetrics.outerRadius * 3f); x -= offset; y -= offset; 

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

  int iX = Mathf.RoundToInt(x); int iY = Mathf.RoundToInt(y); int iZ = Mathf.RoundToInt(-x -y); return new HexCoordinates(iX, iZ); 

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

  if (iX + iY + iZ != 0) { Debug.LogWarning("rounding error!"); } return new HexCoordinates(iX, iZ); 

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

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

  if (iX + iY + iZ != 0) { float dX = Mathf.Abs(x - iX); float dY = Mathf.Abs(y - iY); float dZ = Mathf.Abs(-x -y - iZ); if (dX > dY && dX > dZ) { iX = -iY - iZ; } else if (dZ > dY) { iZ = -iX - iY; } } 

рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рд░рдВрдЧ рдкреЗрдЬ


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

  public Color defaultColor = Color.white; public Color touchedColor = Color.magenta; 


рд╕реЗрд▓ рд░рдВрдЧ рдЪрдпрдиред рд╕рд╛рдорд╛рдиреНрдп рд░рдВрдЧ рдлрд╝реАрд▓реНрдб рдореЗрдВ

рдЬреЛрдбрд╝реЗрдВ HexCellред

 public class HexCell : MonoBehaviour { public HexCoordinates coordinates; public Color color; } 

рдЗрд╕реЗ HexGrid.CreateCellрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рдВрдЧ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ ред

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

рд╣рдореЗрдВ HexMeshрд░рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рднреА рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

  List<Color> colors; void Awake () { тАж vertices = new List<Vector3>(); colors = new List<Color>(); тАж } public void Triangulate (HexCell[] cells) { hexMesh.Clear(); vertices.Clear(); colors.Clear(); тАж hexMesh.vertices = vertices.ToArray(); hexMesh.colors = colors.ToArray(); тАж } 

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

  void Triangulate (HexCell cell) { Vector3 center = cell.transform.localPosition; for (int i = 0; i < 6; i++) { AddTriangle( center, center + HexMetrics.corners[i], center + HexMetrics.corners[i + 1] ); AddTriangleColor(cell.color); } } void AddTriangleColor (Color color) { colors.Add(color); colors.Add(color); colors.Add(color); } 

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

рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реЗ рдЬрд╛рд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
, . . , , . .

  public void TouchCell (Vector3 position) { position = transform.InverseTransformPoint(position); HexCoordinates coordinates = HexCoordinates.FromPosition(position); int index = coordinates.X + coordinates.Z * width + coordinates.Z / 2; HexCell cell = cells[index]; cell.color = touchedColor; hexMesh.Triangulate(cells); } 

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

 Shader "Custom/VertexColors" { 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; float4 color : COLOR; }; half _Glossiness; half _Metallic; fixed4 _Color; 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; } ENDCG } FallBack "Diffuse" } 

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


рд░рдВрдЧреАрди рдХреЛрд╢рд┐рдХрд╛рдПрдБред

рдореБрдЭреЗ рдЕрдЬреАрдм рдЫрд╛рдпрд╛ рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ!
Unity . , , Z-. .

unitypackage

рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрдХ


рдЕрдм рдЬрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд░рдВрдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЗрди-рдЧреЗрдо рдПрдбрд┐рдЯрд░ рдмрдирд╛рдПрдВред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреНрд╖рдорддрд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ HexGrid, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ TouchCellрдЕрддрд┐рд░рд┐рдХреНрдд рд░рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ ред рд╕рд╛рде рд╣реА рдЦреЗрдд рдХреЛ рднреА рд╣рдЯрд╛ рджреЗрдВ touchedColorред

 public void ColorCell (Vector3 position, Color color) { position = transform.InverseTransformPoint(position); HexCoordinates coordinates = HexCoordinates.FromPosition(position); int index = coordinates.X + coordinates.Z * width + coordinates.Z / 2; HexCell cell = cells[index]; cell.color = color; hexMesh.Triangulate(cells); } 

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

 using UnityEngine; public class HexMapEditor : MonoBehaviour { public Color[] colors; public HexGrid hexGrid; private Color activeColor; void Awake () { SelectColor(0); } void Update () { if (Input.GetMouseButton(0)) { HandleInput(); } } void HandleInput () { Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(inputRay, out hit)) { hexGrid.ColorCell(hit.point, activeColor); } } public void SelectColor (int index) { activeColor = colors[index]; } } 

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


рдЪрд╛рд░-рд░рдВрдЧ рд╖рдЯреНрднреБрдЬ рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрдХред

рд░рдВрдЧ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ ( GameObject / UI / рдкреИрдирд▓ ) рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рдПрдХ рдкреИрдирд▓ рдЬреЛрдбрд╝реЗрдВ ред рдЙрд╕реЗ рдЯреЙрдЧрд▓ рд╕рдореВрд╣ ( рдШрдЯрдХ / UI / рдЯреЙрдЧрд▓ рд╕рдореВрд╣ ) рдЬреЛрдбрд╝реЗрдВред рдкреИрдирд▓ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЛрдиреЗ рдореЗрдВ рд░рдЦреЗрдВред


рдЯреЙрдЧрд▓ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рд░рдВрдЧ рдкреИрдирд▓ред

рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдкреИрдирд▓ рднрд░реЗрдВ ( GameObject / UI / Toggle )ред рдЬрдм рддрдХ рд╣рдо рдПрдХ рдЬрдЯрд┐рд▓ UI рдмрдирд╛рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддрдм рддрдХ рд╕рд░рд▓ рдореИрдиреБрдЕрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред



рдкреНрд░рддреНрдпреЗрдХ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд┐рдЪред

рдкрд╣рд▓рд╛ рд╕реНрд╡рд┐рдЪ рдЪрд╛рд▓реВ рдХрд░реЗрдВред рдЯреЙрдЧрд▓ рд╕рдореВрд╣ рдХреЗ рд╕рднреА рд╕реНрд╡рд┐рдЪ рднрд╛рдЧреЛрдВ рдХреЛ рднреА рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЕрдВрдд рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ SelectColorрд╣рдорд╛рд░реЗ рд╕рдВрдкрд╛рджрдХ рдХреА рд╡рд┐рдзрд┐ рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдВ ред рдпрд╣ рдСрди рд╡реИрд▓реНрдпреВ рдЪреЗрдВрдЬреЗрдб рдЗрд╡реЗрдВрдЯ рдХреЗ "+" UI рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдлрд┐рд░ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред


рдкрд╣рд▓рд╛ рд╕реНрд╡рд┐рдЪред

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

рд╕реНрд╡рд┐рдЪ рдЗрд╡реЗрдВрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?
. , , .

, , . , SelectColor . , .


рдХрдИ рд░рдВрдЧреЛрдВ рдореЗрдВ рд░рдВрдЧрдирд╛ред

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

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

 using UnityEngine; using UnityEngine.EventSystems; тАж void Update () { if ( Input.GetMouseButton(0) && !EventSystem.current.IsPointerOverGameObject() ) { HandleInput(); } } 

unitypackage

рднрд╛рдЧ 2: рд╕рдореНрдорд┐рд╢реНрд░рдг рд╕реЗрд▓ рд░рдВрдЧ


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


  • рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред
  • рддреНрд░рд┐рдХреЛрдг рдХреЗ рдмреАрдЪ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдкреЛрд▓ рдХрд░реЗрдВред
  • рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдПрдБред
  • рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВред

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


рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЪрд┐рдХрдиреА рд╕рдВрдХреНрд░рдордгред

рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдПрдВ


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

 public enum HexDirection { NE, E, SE, SW, W, NW } 

рдПрдирдо рдХреНрдпрд╛ рд╣реИ?
enum , . . , . , .

enum . , integer . , - , integer.


рдЫрд╣ рдкрдбрд╝реЛрд╕реА, рдЫрд╣ рджрд┐рд╢рд╛рдПрдВред

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

  [SerializeField] HexCell[] neighbors; 

рдХреНрдпрд╛ рд╣рдореЗрдВ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрдиреЗрдХреНрд╢рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
, . тАФ , .

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


рд╣рдорд╛рд░реЗ рдкреНрд░реАрдлреИрдм рдореЗрдВ рдЫрд╣ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИред

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

  public HexCell GetNeighbor (HexDirection direction) { return neighbors[(int)direction]; } 

рдкрдбрд╝реЛрд╕реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред

  public void SetNeighbor (HexDirection direction, HexCell cell) { neighbors[(int)direction] = cell; } 

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

  public void SetNeighbor (HexDirection direction, HexCell cell) { neighbors[(int)direction] = cell; cell.neighbors[(int)direction.Opposite()] = this; } 


рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдкрдбрд╝реЛрд╕реАред

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

 public enum HexDirection { NE, E, SE, SW, W, NW } public static class HexDirectionExtensions { public static HexDirection Opposite (this HexDirection direction) { return (int)direction < 3 ? (direction + 3) : (direction - 3); } } 

рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рд╣реИ?
тАФ , - . тАФ , , , . this . , .

? , , , . ? тАФ . , , .

рдкрдбрд╝реЛрд╕реА рдХрдиреЗрдХреНрд╢рди


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

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


рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдИ рд╕реЗ рдбрдмреНрд▓реНрдпреВ рд╕реЗ рдХрдиреЗрдХреНрд╢рдиред

  void CreateCell (int x, int z, int i) { тАж cell.color = defaultColor; if (x > 0) { cell.SetNeighbor(HexDirection.W, cells[i - 1]); } Text label = Instantiate<Text>(cellLabelPrefab); тАж } 


рдкреВрд░реНрд╡реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рдкрдбрд╝реЛрд╕реА рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред

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

  if (x > 0) { cell.SetNeighbor(HexDirection.W, cells[i - 1]); } if (z > 0) { } 

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


рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП NW рд╕реЗ SE рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рдиред

  if (z > 0) { if ((z & 1) == 0) { cell.SetNeighbor(HexDirection.SE, cells[i - width]); } } 

Z & 1 рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
&& тАФ , & тАФ . , . 1, 1. , 10101010 & 00001111 00001010 .

. 0 1. 1, 2, 3, 4 1, 10, 11, 100. , 0.

, , . 0, .

рд╣рдо SW рдкрд░ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗрд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИред


рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП NE рд╕реЗ SW рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рдиред

  if (z > 0) { if ((z & 1) == 0) { cell.SetNeighbor(HexDirection.SE, cells[i - width]); if (x > 0) { cell.SetNeighbor(HexDirection.SW, cells[i - width - 1]); } } } 

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

  if (z > 0) { if ((z & 1) == 0) { cell.SetNeighbor(HexDirection.SE, cells[i - width]); if (x > 0) { cell.SetNeighbor(HexDirection.SW, cells[i - width - 1]); } } else { cell.SetNeighbor(HexDirection.SW, cells[i - width]); if (x < width - 1) { cell.SetNeighbor(HexDirection.SE, cells[i - width + 1]); } } } 


рд╕рднреА рдкрдбрд╝реЛрд╕реА рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред

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


рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдкрдбрд╝реЛрд╕реАред

unitypackage

рд░рдВрдЧ рдорд┐рд▓рд╛рдирд╛


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

  void Triangulate (HexCell cell) { for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { Triangulate(d, cell); } } void Triangulate (HexDirection direction, HexCell cell) { Vector3 center = cell.transform.localPosition; AddTriangle( center, center + HexMetrics.corners[(int)direction], center + HexMetrics.corners[(int)direction + 1] ); AddTriangleColor(cell.color); } 

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

  AddTriangle( center, center + HexMetrics.GetFirstCorner(direction), center + HexMetrics.GetSecondCorner(direction) ); 

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

  static Vector3[] corners = { new Vector3(0f, 0f, outerRadius), new Vector3(innerRadius, 0f, 0.5f * outerRadius), new Vector3(innerRadius, 0f, -0.5f * outerRadius), new Vector3(0f, 0f, -outerRadius), new Vector3(-innerRadius, 0f, -0.5f * outerRadius), new Vector3(-innerRadius, 0f, 0.5f * outerRadius), new Vector3(0f, 0f, outerRadius) }; public static Vector3 GetFirstCorner (HexDirection direction) { return corners[(int)direction]; } public static Vector3 GetSecondCorner (HexDirection direction) { return corners[(int)direction + 1]; } 

рдПрдХ рддреНрд░рд┐рдХреЛрдг рдкрд░ рдХрдИ рд░рдВрдЧ


рдЕрдм рддрдХ, рд╡рд┐рдзрд┐ HexMesh.AddTriangleColorрдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд░рдВрдЧ рддрд░реНрдХ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдареЛрд╕ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░рд┐рдХреЛрдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдПрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

  void AddTriangleColor (Color c1, Color c2, Color c3) { colors.Add(c1); colors.Add(c2); colors.Add(c3); } 

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

  void Triangulate (HexDirection direction, HexCell cell) { Vector3 center = cell.transform.localPosition; AddTriangle( center, center + HexMetrics.GetFirstCorner(direction), center + HexMetrics.GetSecondCorner(direction) ); HexCell neighbor = cell.GetNeighbor(direction); AddTriangleColor(cell.color, neighbor.color, neighbor.color); } 

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

  HexCell neighbor = cell.GetNeighbor(direction) ?? cell; 

рдСрдкрд░реЗрдЯрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ ??
null-coalescing operator. , a ?? b тАФ a != null ? a : b .

, - Unity . null . .


рд░рдВрдЧреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдордиреНрд╡рдп рд▓реЗрдмрд▓ рдХрд╣рд╛рдВ рдЧрдП?
, UI.

рд░рдВрдЧ рдФрд╕рдд


рд░рдВрдЧ рдорд┐рд╢реНрд░рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИрдВред рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд░рдВрдЧ рджреЛ рдЖрд╕рдиреНрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдФрд╕рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

  HexCell neighbor = cell.GetNeighbor(direction) ?? cell; Color edgeColor = (cell.color + neighbor.color) * 0.5f; AddTriangleColor(cell.color, edgeColor, edgeColor); 


рдкрд╕рд▓рд┐рдпреЛрдВ рдкрд░ рдорд┐рд╢реНрд░рдгред
рдпрджреНрдпрдкрд┐ рд╣рдо рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдорд┐рд╢реНрд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рд╣рдореЗрдВ рддреЗрдЬ рд░рдВрдЧ рдХреА рд╕реАрдорд╛рдПрдБ рдорд┐рд▓рддреА рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╖рдЯреНрднреБрдЬ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЛ рддреАрди рд╖рдЯреНрдХреЛрдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рддреАрди рдкрдбрд╝реЛрд╕реА, рдЪрд╛рд░ рд░рдВрдЧред

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

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

  public static HexDirection Previous (this HexDirection direction) { return direction == HexDirection.NE ? HexDirection.NW : (direction - 1); } public static HexDirection Next (this HexDirection direction) { return direction == HexDirection.NW ? HexDirection.NE : (direction + 1); } 

рдЕрдм рд╣рдо рд╕рднреА рддреАрди рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддреАрди-рддрд░рдлрд╛ рдорд┐рд╢реНрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  HexCell prevNeighbor = cell.GetNeighbor(direction.Previous()) ?? cell; HexCell neighbor = cell.GetNeighbor(direction) ?? cell; HexCell nextNeighbor = cell.GetNeighbor(direction.Next()) ?? cell; AddTriangleColor( cell.color, (cell.color + prevNeighbor.color + neighbor.color) / 3f, (cell.color + neighbor.color + nextNeighbor.color) / 3f ); 


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

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

unitypackage

рдорд┐рд╢реНрд░рдг рдХрд╛ рдХреНрд╖реЗрддреНрд░


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


рдорд┐рд╢реНрд░рдг рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реЗрдВрдЯ рдХреА рдирд┐рд░рдВрддрд░ рдЫрд╛рдпрд╛рдВрдХрдиред

рдорд┐рд╢реНрд░рдг рдХреНрд╖реЗрддреНрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдареЛрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЖрдХрд╛рд░ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рддрд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрд╛рд╣рд░реА рджрд╛рдпрд░реЗ рдХреЗ рдПрдХ рдЕрдВрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕реЗ 75% рдХреЗ рдмрд░рд╛рдмрд░ рдХрд░реЗрдВред рдпрд╣ рд╣рдореЗрдВ рджреЛ рдирдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдХреБрд▓ 100%ред

  public const float solidFactor = 0.75f; public const float blendFactor = 1f - solidFactor; 

рдЗрд╕ рдирдП рдареЛрд╕ рднрд░рдг рдХрд╛рд░рдХ рдХреЛ рдмрдирд╛рдХрд░, рд╣рдо рдареЛрд╕ рдЖрдВрддрд░рд┐рдХ рд╖рдЯреНрднреБрдЬ рдХреЗ рдХреЛрдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

  public static Vector3 GetFirstSolidCorner (HexDirection direction) { return corners[(int)direction] * solidFactor; } public static Vector3 GetSecondSolidCorner (HexDirection direction) { return corners[(int)direction + 1] * solidFactor; } 

рдЕрдм, HexMesh.TriangulateрдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдореВрд▓ рдХреЛрдгреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрди рдареЛрд╕ рдЫрд╛рдпрд╛рдВрдХрди рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рд░рдВрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред

  AddTriangle( center, center + HexMetrics.GetFirstSolidCorner(direction), center + HexMetrics.GetSecondSolidCorner(direction) ); 


рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдареЛрд╕ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ред

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


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


рдЯреНрд░реЗрдкреЗрдЬрд╝реЙрдЗрдб рд░рд┐рдмред

  void AddQuad (Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4) { int vertexIndex = vertices.Count; vertices.Add(v1); vertices.Add(v2); vertices.Add(v3); vertices.Add(v4); triangles.Add(vertexIndex); triangles.Add(vertexIndex + 2); triangles.Add(vertexIndex + 1); triangles.Add(vertexIndex + 1); triangles.Add(vertexIndex + 2); triangles.Add(vertexIndex + 3); } void AddQuadColor (Color c1, Color c2, Color c3, Color c4) { colors.Add(c1); colors.Add(c2); colors.Add(c3); colors.Add(c4); } 

рд╣рдо HexMesh.TriangulateрдЗрд╕реЗ рд░реАрдореЗрдХ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рддреНрд░рд┐рдХреЛрдг рдПрдХ рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЪрддреБрд░реНрднреБрдЬ рдПрдХ рдареЛрд╕ рд░рдВрдЧ рдФрд░ рджреЛ рдХреЛрдгреЛрдВ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдорд┐рд╢реНрд░рдг рдХрд░рддрд╛ рд╣реИред

  void Triangulate (HexDirection direction, HexCell cell) { Vector3 center = cell.transform.localPosition; Vector3 v1 = center + HexMetrics.GetFirstSolidCorner(direction); Vector3 v2 = center + HexMetrics.GetSecondSolidCorner(direction); AddTriangle(center, v1, v2); AddTriangleColor(cell.color); Vector3 v3 = center + HexMetrics.GetFirstCorner(direction); Vector3 v4 = center + HexMetrics.GetSecondCorner(direction); AddQuad(v1, v2, v3, v4); HexCell prevNeighbor = cell.GetNeighbor(direction.Previous()) ?? cell; HexCell neighbor = cell.GetNeighbor(direction) ?? cell; HexCell nextNeighbor = cell.GetNeighbor(direction.Next()) ?? cell; AddQuadColor( cell.color, cell.color, (cell.color + prevNeighbor.color + neighbor.color) / 3f, (cell.color + neighbor.color + nextNeighbor.color) / 3f ); } 


рдЯреНрд░реЗрдкреЗрдЬрд╝реЙрдЗрдб рдкрд╕рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рдгред

рдкрд╕рд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдкреБрд▓


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


рдкрд╕рд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдкреБрд▓ред

рд╣рдо рдирдП рдкрджреЛрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ v3рдФрд░ v4, рдХреЗ рд╕рд╛рде рд╢реБрд░реВ v1рдФрд░ v2рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реЗрд▓ рдХрд┐рдирд╛рд░реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдкреБрд▓ рдХреЗ рдХрд┐рдирд╛рд░реЗ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ред рдкреБрд▓ рдХрд╛ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рд╣рдо рдЗрд╕реЗ рджреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдгреЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдордзреНрдп рдмрд┐рдВрджреБ рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдореЗрдВ рдорд┐рд╢реНрд░рдг рдЧреБрдгрд╛рдВрдХ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХрд░реЗрдВрдЧреЗ HexMetricsред

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

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

  void AddQuadColor (Color c1, Color c2) { colors.Add(c1); colors.Add(c1); colors.Add(c2); colors.Add(c2); } 

рдЗрд╕реЗ рдмрджрд▓реЗрдВ Triangulateрддрд╛рдХрд┐ рдпрд╣ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдареАрдХ рд╕реЗ рдорд┐рд╢реНрд░рд┐рдд рдкреБрд▓реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗред

  Vector3 bridge = HexMetrics.GetBridge(direction); Vector3 v3 = v1 + bridge; Vector3 v4 = v2 + bridge; AddQuad(v1, v2, v3, v4); HexCell prevNeighbor = cell.GetNeighbor(direction.Previous()) ?? cell; HexCell neighbor = cell.GetNeighbor(direction) ?? cell; HexCell nextNeighbor = cell.GetNeighbor(direction.Next()) ?? cell; AddQuadColor(cell.color, (cell.color + neighbor.color) * 0.5f); 


рдХреЛрдиреЗ рдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдкреБрд▓ред

рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рднрд░рдирд╛


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

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

  Color bridgeColor = (cell.color + neighbor.color) * 0.5f; AddQuadColor(cell.color, bridgeColor); AddTriangle(v1, center + HexMetrics.GetFirstCorner(direction), v3); AddTriangleColor( cell.color, (cell.color + prevNeighbor.color + neighbor.color) / 3f, bridgeColor ); 


рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред

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

  AddTriangle(v2, v4, center + HexMetrics.GetSecondCorner(direction)); AddTriangleColor( cell.color, bridgeColor, (cell.color + neighbor.color + nextNeighbor.color) / 3f ); 


рдкреВрд░реНрдг рд░рдВрдЧред

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

рд▓реЗрдХрд┐рди рд░рдВрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдЕрднреА рднреА рдмрджрд╕реВрд░рдд рд╣реИрдВ
. . .

unitypackage

рд░рд┐рдм рдлреНрдпреВрдЬрди


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


рддреАрди рджреГрд╢реНрдп рд╕рдВрд░рдЪрдирд╛рдПрдБред

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


рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХрдареЛрд░ред

рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рдХреНрдпреЛрдВ рд╣реИ?
, . , , . , , . , , .

рдкреНрд░рддреНрдпрдХреНрд╖ рдмреНрд░рд┐рдЬрд┐рдВрдЧ


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

  public static Vector3 GetBridge (HexDirection direction) { return (corners[(int)direction] + corners[(int)direction + 1]) * blendFactor; } 


рдкреБрд▓реЛрдВ рдиреЗ рдкреВрд░реА рд▓рдВрдмрд╛рдИ рдХреЛ рдлреИрд▓рд╛рдпрд╛ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд┐рдпрд╛ред

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

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

  void Triangulate (HexDirection direction, HexCell cell) { Vector3 center = cell.transform.localPosition; Vector3 v1 = center + HexMetrics.GetFirstSolidCorner(direction); Vector3 v2 = center + HexMetrics.GetSecondSolidCorner(direction); AddTriangle(center, v1, v2); AddTriangleColor(cell.color); TriangulateConnection(direction, cell, v1, v2); } void TriangulateConnection ( HexDirection direction, HexCell cell, Vector3 v1, Vector3 v2 ) { HexCell neighbor = cell.GetNeighbor(direction) ?? cell; Vector3 bridge = HexMetrics.GetBridge(direction); Vector3 v3 = v1 + bridge; Vector3 v4 = v2 + bridge; AddQuad(v1, v2, v3, v4); AddQuadColor(cell.color, neighbor.color); } 

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

  if (direction == HexDirection.NE) { TriangulateConnection(direction, cell, v1, v2); } 


рдмреНрд░рд┐рдЬ рдХреЗрд╡рд▓ рдПрдирдИ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рд╣реИрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдпреМрдЧрд┐рдХреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рддреАрди рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рддреНрд░рд┐рднреБрдЬ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдирдИ, рдИ рдФрд░ рдПрд╕рдИред

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


рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдкреБрд▓реЛрдВ рдФрд░ рд╕реАрдорд╛рдУрдВ рдкрд░ рдкреБрд▓ред

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

  void TriangulateConnection ( HexDirection direction, HexCell cell, Vector3 v1, Vector3 v2 ) { HexCell neighbor = cell.GetNeighbor(direction); if (neighbor == null) { return; } тАж } 


рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдкреБрд▓ред

рддреНрд░рд┐рдХреЛрдгреАрдп рдЬреЛрдбрд╝реЛрдВ


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

  void TriangulateConnection ( HexDirection direction, HexCell cell, Vector3 v1, Vector3 v2 ) { тАж HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (nextNeighbor != null) { AddTriangle(v2, v4, v2); AddTriangleColor(cell.color, neighbor.color, nextNeighbor.color); } } 

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

  AddTriangle(v2, v4, v2 + HexMetrics.GetBridge(direction.Next())); 


рд╣рдо рдлрд┐рд░ рд╕реЗ рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

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

  if (direction <= HexDirection.E && nextNeighbor != null) { AddTriangle(v2, v4, v2 + HexMetrics.GetBridge(direction.Next())); AddTriangleColor(cell.color, neighbor.color, nextNeighbor.color); } 

unitypackage

рднрд╛рдЧ 3: рдКрдБрдЪрд╛рдИ


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


  • рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдКрдБрдЪрд╛рдИ рдЬреЛрдбрд╝реЗрдВред
  • рдврд▓рд╛рдиреЛрдВ рдХреЛ рддреНрд░рд┐рдХреЛрдгрд┐рдд рдХрд░реЗрдВред
  • рд▓реАрдбреНрд╕ рдбрд╛рд▓реЗрдВред
  • рд▓реАрдб рдФрд░ рдХреНрд▓рд┐рдл рдХреЛ рдорд┐рд▓рд╛рдПрдВред

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


рдКрдБрдЪрд╛рдИ рдФрд░ рдЕрдЧреБрд╡рд╛рдИред

рд╕реЗрд▓ рдКрдВрдЪрд╛рдИ


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

  public int elevation; 

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

  public const float elevationStep = 5f; 

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


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

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

  public HexCell GetCell (Vector3 position) { position = transform.InverseTransformPoint(position); HexCoordinates coordinates = HexCoordinates.FromPosition(position); int index = coordinates.X + coordinates.Z * width + coordinates.Z / 2; return cells[index]; } 

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

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

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

  void HandleInput () { Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(inputRay, out hit)) { EditCell(hexGrid.GetCell(hit.point)); } } void EditCell (HexCell cell) { cell.color = activeColor; hexGrid.Refresh(); } 

рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрд▓ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдКрдВрдЪрд╛рдИ рд╕реНрддрд░ рдмрддрд╛рдХрд░ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

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

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

  public void SetElevation (float elevation) { activeElevation = (int)elevation; } 

рдХреИрдирд╡рд╛рд╕ рдкрд░ рдПрдХ рд╕реНрд▓рд╛рдЗрдбрд░ ( GameObject / Create / Slider ) рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдХрд▓рд░ рдмрд╛рд░ рдХреЗ рдиреАрдЪреЗ рд░рдЦреЗрдВред рд╣рдо рдЗрд╕реЗ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ, рддрд╛рдХрд┐ рдиреЗрддреНрд░рд╣реАрди рдпрд╣ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЗ рд╕реНрддрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛред рд╣рдо рдЗрд╕реЗ рдкреВрд░реНрдгрд╛рдВрдХ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЕрдВрддрд░рд╛рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 0 рд╕реЗ 6 рддрдХред рддрдм рд╣рдо рдЗрд╕рдХреА рдСрди рдЪреЗрдВрдЬ рдШрдЯрдирд╛ рдХреЛ рд╣реЗрдХреНрд╕ рдореИрдк рдПрдбрд┐рдЯрд░SetElevation рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ ред рд╡рд┐рдзрд┐ рдХреЛ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╕реВрдЪреА рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЗрд╕реЗ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рдПред



рдКрдБрдЪрд╛рдИ рдХрд╛ рд╕реНрд▓рд╛рдЗрдбрд░ред

рдКрдБрдЪрд╛рдИ рдХрд╛ рджреГрд╢реНрдп


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

рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдКрдВрдЪрд╛рдИ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рд╕реЗрд▓ рдХреА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╡рд┐рдзрд┐ рдХреЛ HexCell.elevationрдирд┐рдЬреА рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ HexCell.Elevationред

  public int Elevation { get { return elevation; } set { elevation = value; } } int elevation; 

рдЕрдм рд╣рдо рдКрдВрдЪрд╛рдИ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕реЗрд▓ рдХреА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

  set { elevation = value; Vector3 position = transform.localPosition; position.y = value * HexMetrics.elevationStep; transform.localPosition = position; } 

рдмреЗрд╢рдХ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ HexMapEditor.EditCellред

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


рд╡рд┐рднрд┐рдиреНрди рдКрдВрдЪрд╛рдЗрдпреЛрдВ рд╡рд╛рд▓реЗ рд╕реЗрд▓ред

рдХреНрдпрд╛ рдирдИ рдКрдВрдЪрд╛рдИ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд╖ рдХреЛрд▓рд╛рдЗрдбрд░ рдмрджрд▓рддрд╛ рд╣реИ?
Unity mesh collider null. , , null . . ( ) .

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

рд╕реЗрд▓ рд▓реЗрдмрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓реЗрдВ


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

  public RectTransform uiRect; 

рдЙрдиреНрд╣реЗрдВ рдЕрдВрдд рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ HexGrid.CreateCellред

  void CreateCell (int x, int z, int i) { тАж cell.uiRect = label.rectTransform; } 

рдЕрдм рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ HexCell.Elevationрддрд╛рдХрд┐ рдпрд╣ рд╕реЗрд▓ рдХреЗ UI рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рднреА рдмрджрд▓ рджреЗред рдЪреВрдВрдХрд┐ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреЗ рдХреИрдирд╡рд╛рд╕ рдЬрд╛рд▓ рдХреЛ рдШреБрдорд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдмрд▓ рдХреЛ Z рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдирдХрд╛рд░рд╛рддреНрдордХ рджрд┐рд╢рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ Y рдЕрдХреНрд╖ рдХреЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдореЗрдВ рдирд╣реАрдВред

  set { elevation = value; Vector3 position = transform.localPosition; position.y = value * HexMetrics.elevationStep; transform.localPosition = position; Vector3 uiPosition = uiRect.localPosition; uiPosition.z = elevation * -HexMetrics.elevationStep; uiRect.localPosition = uiPosition; } 


рдЯреИрдЧ рдКрдВрдЪрд╛рдИ рдХреЗ рд╕рд╛рдеред

рдврд▓рд╛рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рдЕрдм рд╣рдореЗрдВ рдлреНрд▓реИрдЯ рд╕реЗрд▓ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдврд▓рд╛рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ HexMesh.TriangulateConnectionред рдХрд┐рдирд╛рд░реЗ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдкреБрд▓ рдХреЗ рджреВрд╕рд░реЗ рдЫреЛрд░ рдХреА рдКрдВрдЪрд╛рдИ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  Vector3 bridge = HexMetrics.GetBridge(direction); Vector3 v3 = v1 + bridge; Vector3 v4 = v2 + bridge; v3.y = v4.y = neighbor.Elevation * HexMetrics.elevationStep; 

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

  if (direction <= HexDirection.E && nextNeighbor != null) { Vector3 v5 = v2 + HexMetrics.GetBridge(direction.Next()); v5.y = nextNeighbor.Elevation * HexMetrics.elevationStep; AddTriangle(v2, v4, v5); AddTriangleColor(cell.color, neighbor.color, nextNeighbor.color); } 


рдЦрд╛рддрд╛ рдКрдВрдЪрд╛рдИ рдореЗрдВ рд▓реЗ рдЬрд╛ рд░рд╣рд╛ рдХрдиреЗрдХреНрд╢рдиред

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

unitypackage

рдЕрдЧреНрдиреНрдпрд╛рд╢рдп рдХреЗ рд╕рд╛рде рд░рд┐рдм рдЬреЛрдбрд╝реЛрдВ


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

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


рдврд▓рд╛рди рдкрд░ рджреЛ рдЕрдЧреБрд╡рд╛рдИред

рд╣рдо рдврд▓рд╛рди рдХреЗ рд▓рд┐рдП рдЪрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ HexMetricsрдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  public const int terracesPerSlope = 2; public const int terraceSteps = terracesPerSlope * 2 + 1; 

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

  public static Vector3 TerraceLerp (Vector3 a, Vector3 b, int step) { return a; } 

рдХреНрд╖реИрддрд┐рдЬ рдкреНрд░рдХреНрд╖реЗрдк рд╕рд░рд▓ рд╣реИ рдЕрдЧрд░ рд╣рдо рдкреНрд░рдХреНрд╖реЗрдк рдХрджрдо рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВред

  public const float horizontalTerraceStepSize = 1f / terraceSteps; public static Vector3 TerraceLerp (Vector3 a, Vector3 b, int step) { float h = step * HexMetrics.horizontalTerraceStepSize; ax += (bx - ax) * h; az += (bz - az) * h; return a; } 

рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рдХреНрд╖реЗрдк рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
a рдФрд░ b t ред t 0, a ред 1, b ред t - 0 1, a рдФрд░ b . : (1тИТt)a+tb ред

, (1тИТt)a+tb=aтИТta+tb=a+t(bтИТa) ред a b (bтИТa) ред , .

рдХреЗрд╡рд▓ рд╡рд┐рд╖рдо рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд╛рдИ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( s t e p + 1 ) / 2 ред рдпрджрд┐ рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ 1, 2, 3, 4 рдХреЛ 1, 1, 2, 2 рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред

  public const float verticalTerraceStepSize = 1f / (terracesPerSlope + 1); public static Vector3 TerraceLerp (Vector3 a, Vector3 b, int step) { float h = step * HexMetrics.horizontalTerraceStepSize; ax += (bx - ax) * h; az += (bz - az) * h; float v = ((step + 1) / 2) * HexMetrics.verticalTerraceStepSize; ay += (by - ay) * v; return a; } 

рдЖрдЗрдП рд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд░рдВрдЧреЛрдВ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдлреНрд▓реИрдЯ рд╣реИрдВред

  public static Color TerraceLerp (Color a, Color b, int step) { float h = step * HexMetrics.horizontalTerraceStepSize; return Color.Lerp(a, b, h); } 

рдЯреНрд░рд╛рдИрдРрдиреНрдЧреНрдпреБрд▓реЗрд╢рдВрд╕


рдЬреИрд╕реЗ рд╣реА рдХрд┐рдирд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рддреНрд░рд┐рдХреЛрдгреАрдпрдХрд░рдг рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдХреЛ HexMesh.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.Elevation * HexMetrics.elevationStep; TriangulateEdgeTerraces(v1, v2, cell, v3, v4, neighbor); // AddQuad(v1, v2, v3, v4); // AddQuadColor(cell.color, neighbor.color); тАж } void TriangulateEdgeTerraces ( Vector3 beginLeft, Vector3 beginRight, HexCell beginCell, Vector3 endLeft, Vector3 endRight, HexCell endCell ) { AddQuad(beginLeft, beginRight, endLeft, endRight); AddQuadColor(beginCell.color, endCell.color); } 

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

  void TriangulateEdgeTerraces ( Vector3 beginLeft, Vector3 beginRight, HexCell beginCell, Vector3 endLeft, Vector3 endRight, HexCell endCell ) { Vector3 v3 = HexMetrics.TerraceLerp(beginLeft, endLeft, 1); Vector3 v4 = HexMetrics.TerraceLerp(beginRight, endRight, 1); Color c2 = HexMetrics.TerraceLerp(beginCell.color, endCell.color, 1); AddQuad(beginLeft, beginRight, v3, v4); AddQuadColor(beginCell.color, c2); } 


рдПрдХ рдкрд╣рд▓рд╛ рдХрджрдо рдмрдирд╛рдиреЗ рдореЗрдВред

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

  AddQuad(beginLeft, beginRight, v3, v4); AddQuadColor(beginCell.color, c2); AddQuad(v3, v4, endLeft, endRight); AddQuadColor(c2, endCell.color); 


рдПрдХ рдХрдЧрд╛рд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрдВрддрд┐рдо рдЪрд░рдгред

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

  AddQuad(beginLeft, beginRight, v3, v4); AddQuadColor(beginCell.color, c2); for (int i = 2; i < HexMetrics.terraceSteps; i++) { Vector3 v1 = v3; Vector3 v2 = v4; Color c1 = c2; v3 = HexMetrics.TerraceLerp(beginLeft, endLeft, i); v4 = HexMetrics.TerraceLerp(beginRight, endRight, i); c2 = HexMetrics.TerraceLerp(beginCell.color, endCell.color, i); AddQuad(v1, v2, v3, v4); AddQuadColor(c1, c2); } AddQuad(v3, v4, endLeft, endRight); AddQuadColor(c2, endCell.color); 


рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рдЪрд░рдгред

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


рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рднреА рдЬреЛрдбрд╝реЛрдВ рдореЗрдВ рдЕрдЧреБрд╡рд╛рдИ рд╣реЛрддреА рд╣реИред

unitypackage

рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдХрд╛рд░


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

рдЖрдЗрдП рдЗрд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджреЗрдВ рдФрд░ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ: рдПрдХ рд╡рд┐рдорд╛рди, рдПрдХ рдврд▓рд╛рди рдФрд░ рдПрдХ рдЪрдЯреНрдЯрд╛рдиред рдЖрдЗрдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХрд▓реНтАНрдк рдмрдирд╛рдПрдВред

 public enum HexEdgeType { Flat, Slope, Cliff } 

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

  public static HexEdgeType GetEdgeType (int elevation1, int elevation2) { } 

рдпрджрд┐ рдКрдВрдЪрд╛рдЗрдпрд╛рдВ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдкрд╛рдЯ рд░рд┐рдм рд╣реЛрдЧрд╛ред

  public static HexEdgeType GetEdgeType (int elevation1, int elevation2) { if (elevation1 == elevation2) { return HexEdgeType.Flat; } } 

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

  public static HexEdgeType GetEdgeType (int elevation1, int elevation2) { if (elevation1 == elevation2) { return HexEdgeType.Flat; } int delta = elevation2 - elevation1; if (delta == 1 || delta == -1) { return HexEdgeType.Slope; } return HexEdgeType.Cliff; } 

рдЪрд▓реЛ HexCell.GetEdgeTypeрдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рджрд┐рд╢рд╛ рдореЗрдВ рд╕реЗрд▓ рдмрдврд╝рдд рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдзрд┐ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ ред

  public HexEdgeType GetEdgeType (HexDirection direction) { return HexMetrics.GetEdgeType( elevation, neighbors[(int)direction].elevation ); } 

рдЕрдЧрд░ рдкрдбрд╝реЛрд╕реА рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ?
, , . , NullReferenceException . , , - . , . .

, , , . - , NullReferenceException .

рдХреЗрд╡рд▓ рдврд▓рд╛рди рдХреЗ рд▓рд┐рдП ledges рдмрдирд╛рдПрдБ


рдЕрдм рдЬрдм рд╣рдо рдХрдиреЗрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдпрд╣ рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╣реИред рдмрджрд▓реЛ HexMesh.TriangulateConnectionрддрд╛рдХрд┐ рд╡рд╣ рдХреЗрд╡рд▓ рдврд▓рд╛рди рдХреЗ рд▓рд┐рдП ledges рдмрдирд╛рддрд╛ рд╣реИред

  if (cell.GetEdgeType(direction) == HexEdgeType.Slope) { TriangulateEdgeTerraces(v1, v2, cell, v3, v4, neighbor); } // AddQuad(v1, v2, v3, v4); // AddQuadColor(cell.color, neighbor.color); 

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

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


рдХрджрдо рдврд▓рд╛рди рдкрд░ рд╣реА рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

unitypackage

рдиреЗрддреГрддреНрд╡ рдХреЗ рд╕рд╛рде рдиреЗрддреГрддреНрд╡


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

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


рдХреЛрдирд╛ рд╕рдВрдпреБрдХреНрддред

  void TriangulateCorner ( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { AddTriangle(bottom, left, right); AddTriangleColor(bottomCell.color, leftCell.color, rightCell.color); } 

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

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

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

  if (cell.Elevation <= neighbor.Elevation) { if (cell.Elevation <= nextNeighbor.Elevation) { TriangulateCorner(v2, cell, v4, neighbor, v5, nextNeighbor); } else { TriangulateCorner(v5, nextNeighbor, v2, cell, v4, neighbor); } } 

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

  if (cell.Elevation <= neighbor.Elevation) { if (cell.Elevation <= nextNeighbor.Elevation) { TriangulateCorner(v2, cell, v4, neighbor, v5, nextNeighbor); } else { TriangulateCorner(v5, nextNeighbor, v2, cell, v4, neighbor); } } else if (neighbor.Elevation <= nextNeighbor.Elevation) { TriangulateCorner(v4, neighbor, v5, nextNeighbor, v2, cell); } else { TriangulateCorner(v5, nextNeighbor, v2, cell, v4, neighbor); } 


рд╡рд╛рдорд╛рд╡рд░реНрдд рдореБрдбрд╝реЗрдВ, рдХреЛрдИ рдореЛрдбрд╝ рдирд╣реАрдВ, рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рдШреБрдорд╛рд╡ред

рдврд▓рд╛рди рддреНрд░рд┐рдХреЛрдг


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

  public HexEdgeType GetEdgeType (HexCell otherCell) { return HexMetrics.GetEdgeType( elevation, otherCell.elevation ); } 

HexMesh.TriangulateCornerрдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕ рдирдИ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред

  void TriangulateCorner ( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { HexEdgeType leftEdgeType = bottomCell.GetEdgeType(leftCell); HexEdgeType rightEdgeType = bottomCell.GetEdgeType(rightCell); AddTriangle(bottom, left, right); AddTriangleColor(bottomCell.color, leftCell.color, rightCell.color); } 

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


рджреЛ рдврд▓рд╛рди рдФрд░ рдПрдХ рд╡рд┐рдорд╛рди, рдПрд╕рдПрд╕рдкреАред

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

  void TriangulateCorner ( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { HexEdgeType leftEdgeType = bottomCell.GetEdgeType(leftCell); HexEdgeType rightEdgeType = bottomCell.GetEdgeType(rightCell); if (leftEdgeType == HexEdgeType.Slope) { if (rightEdgeType == HexEdgeType.Slope) { TriangulateCornerTerraces( bottom, bottomCell, left, leftCell, right, rightCell ); return; } } AddTriangle(bottom, left, right); AddTriangleColor(bottomCell.color, leftCell.color, rightCell.color); } void TriangulateCornerTerraces ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { } 

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


рдПрдХ рд╢реВрдиреНрдп рд╣реИред

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

  void TriangulateCornerTerraces ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { Vector3 v3 = HexMetrics.TerraceLerp(begin, left, 1); Vector3 v4 = HexMetrics.TerraceLerp(begin, right, 1); Color c3 = HexMetrics.TerraceLerp(beginCell.color, leftCell.color, 1); Color c4 = HexMetrics.TerraceLerp(beginCell.color, rightCell.color, 1); AddTriangle(begin, v3, v4); AddTriangleColor(beginCell.color, c3, c4); } 


рддреНрд░рд┐рднреБрдЬ рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдгред

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

  AddTriangle(begin, v3, v4); AddTriangleColor(beginCell.color, c3, c4); AddQuad(v3, v4, left, right); AddQuadColor(c3, c4, leftCell.color, rightCell.color); 


рдЪрддреБрд╖реНрдХреЛрдг рдХрд╛ рдЕрдВрддрд┐рдо рдЪрд░рдгред

рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рд╕рднреА рдЪрд░рдг рднреА рдЪрддреБрд╖реНрдХреЛрдгреАрдп рд╣реИрдВред

  AddTriangle(begin, v3, v4); AddTriangleColor(beginCell.color, c3, c4); for (int i = 2; i < HexMetrics.terraceSteps; i++) { Vector3 v1 = v3; Vector3 v2 = v4; Color c1 = c3; Color c2 = c4; v3 = HexMetrics.TerraceLerp(begin, left, i); v4 = HexMetrics.TerraceLerp(begin, right, i); c3 = HexMetrics.TerraceLerp(beginCell.color, leftCell.color, i); c4 = HexMetrics.TerraceLerp(beginCell.color, rightCell.color, i); AddQuad(v1, v2, v3, v4); AddQuadColor(c1, c2, c3, c4); } AddQuad(v3, v4, left, right); AddQuadColor(c3, c4, leftCell.color, rightCell.color); 


рд╕рднреА рдЪрд░рдгреЛрдВред

рджреЛ рдврд▓рд╛рди рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдВ


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


рдПрдЯреАрдкреА рдФрд░ рдПрдордПрд╕рдПрд╕ред

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

  if (leftEdgeType == HexEdgeType.Slope) { if (rightEdgeType == HexEdgeType.Slope) { TriangulateCornerTerraces( bottom, bottomCell, left, leftCell, right, rightCell ); return; } if (rightEdgeType == HexEdgeType.Flat) { TriangulateCornerTerraces( left, leftCell, right, rightCell, bottom, bottomCell ); return; } } if (rightEdgeType == HexEdgeType.Slope) { if (leftEdgeType == HexEdgeType.Flat) { TriangulateCornerTerraces( right, rightCell, bottom, bottomCell, left, leftCell ); return; } } 

рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдкреНрд░рдХреЛрд╖реНрда рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реБрдХрд╛рд╡рдЯ рдХреЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдПрдВрдЧреЗ рдЬрдм рддрдХ рд╡реЗ рдЪрдЯреНрдЯрд╛рди рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЕрдВрдд рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗред


рдареЛрд╕ рдЕрдЧреБрд╡рд╛рдИред

unitypackage

рдврд▓рд╛рди рдФрд░ рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдХрд╛ рд╡рд┐рд▓рдп


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




рдПрд╕рдУрдПрд╕ рдФрд░ рд╕реАрдУрдУред

рд╕рднреА рдврд▓рд╛рди-рдХреНрд▓рд┐рдл рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред

  void TriangulateCornerTerracesCliff ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { } 

рдпрд╣ рдЖрдЦрд┐рд░реА рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП TriangulateCornerрдЬрдм рдмрд╛рдПрдВ рдХрд┐рдирд╛рд░реЗ рдПрдХ рдврд▓рд╛рди рд╣реИред

  if (leftEdgeType == HexEdgeType.Slope) { if (rightEdgeType == HexEdgeType.Slope) { TriangulateCornerTerraces( bottom, bottomCell, left, leftCell, right, rightCell ); return; } if (rightEdgeType == HexEdgeType.Flat) { TriangulateCornerTerraces( left, leftCell, right, rightCell, bottom, bottomCell ); return; } TriangulateCornerTerracesCliff( bottom, bottomCell, left, leftCell, right, rightCell ); return; } if (rightEdgeType == HexEdgeType.Slope) { if (leftEdgeType == HexEdgeType.Flat) { TriangulateCornerTerraces( right, rightCell, bottom, bottomCell, left, leftCell ); return; } } 

рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдЯрд╛рдБрдЧреЗрдВрдЧреЗ? рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдирд┐рдЪрд▓рд╛ рдФрд░ рдКрдкрд░реАред

рдирд┐рдЪрд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛


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


рдХрдЧрд╛рд░ рдХрд╛ рд╕рдВрдкреАрдбрд╝рдиред

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


рд╕реАрдорд╛ рдкрд░ рд╕рдВрдкреАрдбрд╝рдиред

рдЖрдЗрдП рдиреАрдЪреЗ рдХреЗ рд╕реЗрд▓ рдХреЗ рдКрдкрд░ рд╕реАрдорд╛ рдмрд┐рдВрджреБ рдХреЛ рдПрдХ рд╕реНрддрд░ рдкрд░ рд░рдЦреЗрдВред рдЖрдк рдЗрд╕реЗ рдКрдВрдЪрд╛рдИ рдЕрдВрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдХреНрд╖реЗрдк рджреНрд╡рд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

  void TriangulateCornerTerracesCliff ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { float b = 1f / (rightCell.Elevation - beginCell.Elevation); Vector3 boundary = Vector3.Lerp(begin, right, b); Color boundaryColor = Color.Lerp(beginCell.color, rightCell.color, b); } 

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

  float b = 1f / (rightCell.Elevation - beginCell.Elevation); Vector3 boundary = Vector3.Lerp(begin, right, b); Color boundaryColor = Color.Lerp(beginCell.color, rightCell.color, b); AddTriangle(begin, left, boundary); AddTriangleColor(beginCell.color, leftCell.color, boundaryColor); 


рдиреАрдЪреЗ рдХрд╛ рддреНрд░рд┐рдХреЛрдгред

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

  float b = 1f / (rightCell.Elevation - beginCell.Elevation); Vector3 boundary = Vector3.Lerp(begin, right, b); Color boundaryColor = Color.Lerp(beginCell.color, rightCell.color, b); Vector3 v2 = HexMetrics.TerraceLerp(begin, left, 1); Color c2 = HexMetrics.TerraceLerp(beginCell.color, leftCell.color, 1); AddTriangle(begin, v2, boundary); AddTriangleColor(beginCell.color, c2, boundaryColor); 


рд╕рдВрдкреАрдбрд╝рди рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдгред

рдЗрд╕ рдмрд╛рд░, рдЕрдВрддрд┐рдо рдЪрд░рдг рднреА рдПрдХ рддреНрд░рд┐рдХреЛрдг рд╣реЛрдЧрд╛ред

  AddTriangle(begin, v2, boundary); AddTriangleColor(beginCell.color, c2, boundaryColor); AddTriangle(v2, left, boundary); AddTriangleColor(c2, leftCell.color, boundaryColor); 


рд╕рдВрдкреАрдбрд╝рди рдХрд╛ рдЕрдВрддрд┐рдо рдЪрд░рдгред

рдФрд░ рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рдЪрд░рдг рднреА рддреНрд░рд┐рдХреЛрдг рд╣реИрдВред

  AddTriangle(begin, 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); AddTriangle(v1, v2, boundary); AddTriangleColor(c1, c2, boundaryColor); } AddTriangle(v2, left, boundary); AddTriangleColor(c2, leftCell.color, boundaryColor); 


рд╕рдВрдХреБрдЪрд┐рдд рдиреЗрддреГрддреНрд╡ред

рдХреНрдпрд╛ рд╣рдо рдХрдЧрд╛рд░ рд╕реНрддрд░ рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ?
, , , . . , . .

рдХреЛрдирд╛ рдкреВрд░рд╛ рд╣реЛрдирд╛


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

  void TriangulateCornerTerracesCliff ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { float b = 1f / (rightCell.Elevation - beginCell.Elevation); Vector3 boundary = Vector3.Lerp(begin, right, b); Color boundaryColor = Color.Lerp(beginCell.color, rightCell.color, b); TriangulateBoundaryTriangle( begin, beginCell, left, leftCell, boundary, boundaryColor ); } 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); AddTriangle(begin, 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); AddTriangle(v1, v2, boundary); AddTriangleColor(c1, c2, boundaryColor); } AddTriangle(v2, left, boundary); AddTriangleColor(c2, leftCell.color, boundaryColor); } 

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

  void TriangulateCornerTerracesCliff ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { float b = 1f / (rightCell.Elevation - beginCell.Elevation); Vector3 boundary = Vector3.Lerp(begin, right, b); Color boundaryColor = Color.Lerp(beginCell.color, rightCell.color, b); TriangulateBoundaryTriangle( begin, beginCell, left, leftCell, boundary, boundaryColor ); if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope) { TriangulateBoundaryTriangle( left, leftCell, right, rightCell, boundary, boundaryColor ); } else { AddTriangle(left, right, boundary); AddTriangleColor(leftCell.color, rightCell.color, boundaryColor); } } 



рджреЛрдиреЛрдВ рднрд╛рдЧреЛрдВ рдХрд╛ рдкреВрд░рд╛ рддреНрд░рд┐рднреБрдЬред

рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдорд╛рдорд▓реЗ


рд╣рдордиреЗ "рдврд▓рд╛рди-рдЪрдЯреНрдЯрд╛рди" рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рджреЛ рджрд░реНрдкрдг рдорд╛рдорд▓реЗ рднреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдЪрдЯреНрдЯрд╛рди рд╣реИред


OSS рдФрд░ CCAред

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

  void TriangulateCornerCliffTerraces ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { float b = 1f / (leftCell.Elevation - beginCell.Elevation); Vector3 boundary = Vector3.Lerp(begin, left, b); Color boundaryColor = Color.Lerp(beginCell.color, leftCell.color, b); TriangulateBoundaryTriangle( right, rightCell, begin, beginCell, boundary, boundaryColor ); if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope) { TriangulateBoundaryTriangle( left, leftCell, right, rightCell, boundary, boundaryColor ); } else { AddTriangle(left, right, boundary); AddTriangleColor(leftCell.color, rightCell.color, boundaryColor); } } 

рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ TriangulateCornerред

  if (leftEdgeType == HexEdgeType.Slope) { тАж } if (rightEdgeType == HexEdgeType.Slope) { if (leftEdgeType == HexEdgeType.Flat) { TriangulateCornerTerraces( right, rightCell, bottom, bottomCell, left, leftCell ); return; } TriangulateCornerCliffTerraces( bottom, bottomCell, left, leftCell, right, rightCell ); return; } 



рддреНрд░рд┐рднреБрдЬ OSS рдФрд░ CCAред

рдбрдмрд▓ рдЪрдЯреНрдЯрд╛рди


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

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




OOSP рдФрд░ OOSLред

рд╣рдо TriangulateCornerрдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ TriangulateCornerCliffTerracesрдФрд░ TriangulateCornerTerracesCliffрд╡рд┐рднрд┐рдиреНрди рд╕реЗрд▓ рдШреБрдорд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

  if (leftEdgeType == HexEdgeType.Slope) { тАж } if (rightEdgeType == HexEdgeType.Slope) { тАж } if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope) { if (leftCell.Elevation < rightCell.Elevation) { TriangulateCornerCliffTerraces( right, rightCell, bottom, bottomCell, left, leftCell ); } else { TriangulateCornerTerracesCliff( left, leftCell, right, rightCell, bottom, bottomCell ); } return; } 

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

  void TriangulateCornerTerracesCliff ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { float b = 1f / (rightCell.Elevation - beginCell.Elevation); if (b < 0) { b = -b; } тАж } void TriangulateCornerCliffTerraces ( Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { float b = 1f / (leftCell.Elevation - beginCell.Elevation); if (b < 0) { b = -b; } тАж } 



рддреНрд░рд┐рднреБрдЬ OOSP рдФрд░ OOSLред

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


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


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

рд╣рдо TriangulateCornerрдСрдкрд░реЗрдЯрд░реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ returnрдФрд░ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдереЛрдбрд╝рд╛ рд╕рд╛рдл рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ elseред

  void TriangulateCorner ( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { HexEdgeType leftEdgeType = bottomCell.GetEdgeType(leftCell); HexEdgeType rightEdgeType = bottomCell.GetEdgeType(rightCell); if (leftEdgeType == HexEdgeType.Slope) { if (rightEdgeType == HexEdgeType.Slope) { TriangulateCornerTerraces( bottom, bottomCell, left, leftCell, right, rightCell ); } else if (rightEdgeType == HexEdgeType.Flat) { TriangulateCornerTerraces( left, leftCell, right, rightCell, bottom, bottomCell ); } else { TriangulateCornerTerracesCliff( bottom, bottomCell, left, leftCell, right, rightCell ); } } else if (rightEdgeType == HexEdgeType.Slope) { if (leftEdgeType == HexEdgeType.Flat) { TriangulateCornerTerraces( right, rightCell, bottom, bottomCell, left, leftCell ); } else { TriangulateCornerCliffTerraces( bottom, bottomCell, left, leftCell, right, rightCell ); } } else if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope) { if (leftCell.Elevation < rightCell.Elevation) { TriangulateCornerCliffTerraces( right, rightCell, bottom, bottomCell, left, leftCell ); } else { TriangulateCornerTerracesCliff( left, leftCell, right, rightCell, bottom, bottomCell ); } } else { AddTriangle(bottom, left, right); AddTriangleColor(bottomCell.color, leftCell.color, rightCell.color); } } 

рдкрд┐рдЫрд▓реЗ рдмреНрд▓реЙрдХ elseрдореЗрдВ рд╢реЗрд╖ рд╕рднреА рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрднреА рддрдХ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЖрд░рдПрдлрдкреА (рдкреНрд▓реЗрди-рдкреНрд▓реЗрди-рдкреНрд▓реЗрди), рдУрдУрдкреА, рдПрд▓рдПрд▓рд╕реА рдФрд░ рдПрд▓рдПрд▓рд╕реАред рд╡реЗ рд╕рднреА рдПрдХ рддреНрд░рд┐рдХреЛрдг рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред


.

unitypackage

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


All Articles