рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдпрд╣ рд▓реЗрдЦ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рд╕реЗ рдирдХреНрд╢реЗ рдмрдирд╛рдиреЗ рдкрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд (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
рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ ред рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреА рдЧреНрд░рд┐рдб, рд░рдВрдЧреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдФрд░ рд╕рдХреНрд░рд┐рдп рд░рдВрдЧ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВред рдЕрдВрдд рдореЗрдВ, рдПрдХ рд░рдВрдЧ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рд╢реБрд░реВ рдореЗрдВ рдкрд╣рд▓реЗ рд░рдВрдЧ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВредUpdate
HandleInput
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);
рдЖрдЗрдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рд╣рдо рдкрд╣рд▓реЗ рдХреНрд╡рд╛рдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХреНрд╖реЗрдк рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЫреЛрдЯреА рдврд▓рд╛рди рдмрдирд╛рдИ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдореВрд▓ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬред 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); }
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдЕрдирд╕реБрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╡рд┐рдорд╛рдиреЛрдВ рдФрд░ рдХрддрд░рдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХреЗред 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