рднрд╛рдЧ 1-3: рдЬрд╛рд▓, рд░рдВрдЧ рдФрд░ рд╕реЗрд▓ рдКрдБрдЪрд╛рдИрднрд╛рдЧ 4-7: рдзрдХреНрдХреЛрдВ, рдирджрд┐рдпреЛрдВ рдФрд░ рд╕рдбрд╝рдХреЛрдВрднрд╛рдЧ 8-11: рдЬрд▓, рднреВ-рднрд╛рдЧ рдФрд░ рдкреНрд░рд╛рдЪреАрд░рднрд╛рдЧ 12-15: рдмрдЪрдд рдФрд░ рд▓реЛрдбрд┐рдВрдЧ, рдмрдирд╛рд╡рдЯ, рджреВрд░рд┐рдпрд╛рдВрднрд╛рдЧ 16-19: рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдирд╛, рдЦрд┐рд▓рд╛рдбрд╝реА рджрд╕реНрддреЗ, рдПрдирд┐рдореЗрд╢рдирднрд╛рдЧ 20-23: рдХреЛрд╣рд░реЗ рдХреЗ рдпреБрджреНрдз, рдорд╛рдирдЪрд┐рддреНрд░ рдЕрдиреБрд╕рдВрдзрд╛рди, рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреАрдврд╝реАрднрд╛рдЧ 24-27: рдЬрд▓ рдЪрдХреНрд░, рдЕрдкрд░рджрди, рдмрд╛рдпреЛрдо, рдмреЗрд▓рдирд╛рдХрд╛рд░ рдирдХреНрд╢рд╛рднрд╛рдЧ 24: рдХреНрд╖реЗрддреНрд░ рдФрд░ рдХреНрд╖рд░рдг
- рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд╛рдиреА рдХреА рд╕реАрдорд╛ рдЬреЛрдбрд╝реЗрдВред
- рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
- рд╣рдо рдХрдЯрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
- рд╣рдо рд░рд╛рд╣рдд рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрдорд┐ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдорд╛рдирдЪрд┐рддреНрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдиреАрдВрд╡ рд░рдЦреАред рдЗрд╕ рдмрд╛рд░ рд╣рдо рднреВрдорд┐ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдирд╛ рдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрд╕ рдкрд░ рдХрдЯрд╛рд╡ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред
рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдПрдХрддрд╛ 2017.1.0 рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рднреВрдорд┐ рдХреЛ рдЕрд▓рдЧ рдФрд░ рдЪрд┐рдХрдирд╛ рдХрд░рдирд╛редрдирдХреНрд╢рд╛ рд╕реАрдорд╛
рдЪреВрдВрдХрд┐ рд╣рдо рднреВрдорд┐ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЕрдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рднреВрдорд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреЛ рдЫреВ рд▓реЗред рдпрд╣ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд╛рдиреА-рд╕реАрдорд┐рдд рдирдХреНрд╢реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЕрд╡рд░реЛрдз рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдЖрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рднреВрдорд┐ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдкрд╛рд╕ рдкрд╛рдиреА рдХреЗ рд╕реНрддрд░ рд╕реЗ рдКрдкрд░ рдЙрдардиреЗ рд╕реЗ рдордирд╛ рдХрд░реЗрдВред
рд╕реАрдорд╛ рдХрд╛ рдЖрдХрд╛рд░
рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рднреВрдорд┐ рдХрд┐рддрдиреА рдирд┐рдХрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдХреЛрдИ рд╕рд╣реА рдЙрддреНрддрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдмрдирд╛рдПрдВрдЧреЗред рд╣рдо
HexMapGenerator
рдШрдЯрдХ рдореЗрдВ рджреЛ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕
HexMapGenerator
, рдПрдХ рдПрдХреНрд╕ рдЕрдХреНрд╖ рдкрд░ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдорд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ Z рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рд╕реАрдорд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЖрдпрд╛рдо рдореЗрдВ рдПрдХ рд╕реАрдорд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред 5 рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде 0 рд╕реЗ 10 рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
[Range(0, 10)] public int mapBorderX = 5; [Range(0, 10)] public int mapBorderZ = 5;
рдирдХреНрд╢рд╛ рд╕реАрдорд╛рдУрдВ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕редрд╣рдо рднреВрдорд┐ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛, рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдорд╛рдиреНрдп рд╣реИрдВред рдЬрдм рд╕реАрдорд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдиреНрдпреВрдирддрдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рдСрдлрд╕реЗрдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдмрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХрддрдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдШрдЯрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдкреНрд▓реЙрдЯреНрд╕ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛, рддреЛ рдЖрдЗрдП рдЗрд╕реЗ рдЪрд╛рд░ рдкреВрд░реНрдгрд╛рдВрдХ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрдХ рдХрд░реЗрдВред
int xMin, xMax, zMin, zMax;
рд╣рдо рд╕реБрд╢реА рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
GenerateMap
рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрди рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ
Random.Range
рдХреЙрд▓ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдЪреНрдЪ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╕рд╛рдзрд╛рд░рдг рд╣реИрдВред рд╕реАрдорд╛ рдХреЗ рдмрд┐рдирд╛, рд╡реЗ рдорд╛рдк рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╢реВрдиреНрдп рд╕реЗ 1 рдирд╣реАрдВред
public void GenerateMap (int x, int z) { тАж for (int i = 0; i < cellCount; i++) { grid.GetCell(i).WaterLevel = waterLevel; } xMin = mapBorderX; xMax = x - mapBorderX; zMin = mapBorderZ; zMax = z - mapBorderZ; CreateLand(); тАж }
рд╣рдо рд╕реАрдорд╛ рдХреА рд╕реАрдорд╛ рд╕реЗ рдкрд░реЗ рднреВрдорд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреЗрдЬреА рд╕реЗ рдХрдЯреЗ рд╣реБрдП рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рднреВрдЦрдВрдбреЛрдВ рдХреА рдкреАрдврд╝реА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдпрд╣реА рд╣реИ, рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рдЕрдиреБрдорд╛рдирд┐рдд рдХреЗрдВрджреНрд░ рд╕реАрдорд┐рдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рд╕реАрдорд╛ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдпрд╣
GetRandomCell
рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЕрдиреБрдореЗрдп рдСрдлрд╕реЗрдЯ рдХреА рд╕реАрдорд╛ рдореЗрдВ рдПрдХ рд╕реЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░реЗред
HexCell GetRandomCell () {
рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рд╕реАрдорд╛рдПрдБ 0 ├Ч 0, 5 ├Ч 5, 10 ├Ч 10 рдФрд░ 0 ├Ч 10 рд╣реИрдВредрдЬрдм рд╕рднреА рдорд╛рдирдЪрд┐рддреНрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдирдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдкрд░ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдХрд╛рд░ 5 рдХреА рд╕реАрдорд╛ рдордЬрд╝рдмреВрддреА рд╕реЗ рдирдХреНрд╢реЗ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреЛ рд╕реНрдкрд░реНрд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реА рднреВрдорд┐ рд╕реЗ рдмрдЪрд╛рдПрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред рднреВрдорд┐ рдХрднреА-рдХрднреА рдХрд┐рдирд╛рд░реЗ рдХреЗ рдХрд░реАрдм рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдЗрд╕реЗ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЫреВ рд╕рдХрддреА рд╣реИред
рдкреВрд░реА рд╕реАрдорд╛ рдкрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реА рднреВрдорд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реАрдорд╛ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕рд╛рдЗрдЯ рдХреЗ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ, рдЦрдВрдб рд╣реЗрдХреНрд╕рд╛рдЧреЛрди рд░рд╣рддреЗ рд╣реИрдВред рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд╖рдЯреНрднреБрдЬ
рдЖ рд░ рдпрд╣ рд╣реЛрддрд╛ рд╣реИ
3 рдЖрд░ 2 + 3 рдЖрд░ + 1 рдХреЛрд╢рд┐рдХрд╛рдУрдВред рдпрджрд┐ рд╕реАрдорд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рд╣реИрдВ, рддреЛ рд╡реЗ рдЗрд╕реЗ рдкрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 5 рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рд╖рдЯреНрднреБрдЬ рдореЗрдВ 91 рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдЪреВрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХрддрдо рдкреНрд░рддрд┐ рдЦрдВрдб 100 рд╕реЗрд▓ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рднреВрдорд┐ 5 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдПрдХ рдкреБрд▓ рдмрд┐рдЫрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧреА, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдХрдВрдкрди рд╣реЛрддреЗ рд╣реИрдВред рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рддреЛ рднреВрдЦрдВрдб рдХреЗ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░реЗрдВ, рдпрд╛ рд╕реАрдорд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрдврд╝рд╛рдПрдВред
рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЗрдХреНрд╕рд╛рдЧреЛрдирд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реВрддреНрд░ рдХреИрд╕реЗ рд╣реИ?0 рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдХ рдПрдХрд▓ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ 1 рд╕реЗ рдЖрдпрд╛ рдерд╛ред рдХреЗрдВрджреНрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ 1 рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде, рдЫрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН 6 + 1 ред рдЗрди рдЫрд╣ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдХреЗрдВрджреНрд░ рдХреЛ рдЫреВрдиреЗ рд╡рд╛рд▓реЗ рдЫрд╣ рддреНрд░рд┐рдХреЛрдгреЛрдВ рдХреЗ рдЫреЛрд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 2 рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде, рдЗрди рддреНрд░рд┐рднреБрдЬреЛрдВ рдореЗрдВ рдПрдХ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рддреНрд░рд┐рдХреЛрдг рдкрд░ рджреЛ рдФрд░ рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдХреБрд▓ рдореЗрдВ 6 ( 1 + 2 ) + 1 ред 3 рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде, рдПрдХ рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдкреНрд░рддрд┐ рддреНрд░рд┐рдХреЛрдг рддреАрди рдФрд░ рдХреЛрд╢рд┐рдХрд╛рдПрдВ, рдФрд░ рдХреБрд▓ рдореЗрдВ 6 ( 1 + 2 + 3 ) + 1 ред рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЕрд░реНрдерд╛рддреН, рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реВрддреНрд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ 6(sum(i=1)ri)+1=6(((r+1))/2)+1=3r(r+1)+1=3r2+3r+1 ред
рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реАрдорд╛ рдЖрдХрд╛рд░ рдХреЛ 200 рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 8 рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рд╖рдЯреНрднреБрдЬ рдореЗрдВ 217 рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рднреВрдорд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреЛ рдЫреВрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдпрджрд┐ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реАрдорд╛ рдЖрдХрд╛рд░ рдорд╛рди (5) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕реАрдорд╛ рдХреЛ 10 рддрдХ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред
рднреВрдорд┐ рдХреЗ рднреВрдЦрдВрдб рдХрд╛ рдЖрдХрд╛рд░ 200 рд╣реИ, рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рд╕реАрдорд╛рдПрдВ 5 рдФрд░ 10 рд╣реИрдВредрдкреИрдВрдЬрд┐рдпрд╛
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдЖрдк рдорд╛рдирдЪрд┐рддреНрд░ рд╕реАрдорд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рднреВрдорд┐ рдХрд╛ рд╕рдорд╛рди рдкреНрд░рддрд┐рд╢рдд рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рднреВрдорд┐ рдХреЛ рдПрдХ рдЫреЛрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдмрдбрд╝рд╛ рдорд╛рдирдЪрд┐рддреНрд░ рднреВрдорд┐ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рджреНрд░рд╡реНрдпрдорд╛рди рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ - рд╕реБрдкрд░рдХреЙрдиреНрдЯрд┐рдиреЗрдВрдЯ рдкреИрдВрдЬрд┐рдпрд╛ - рд╕рдВрднрд╡рддрдГ рдХрдИ рдЫреЛрдЯреЗ рджреНрд╡реАрдкреЛрдВ рдХреЗ рд╕рд╛рдеред рд╕реАрдорд╛ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рдЗрд╕ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╣рдо рдПрдХ рд╕реБрдкрд░ рдХреЙрдиреНрдЯрд┐рдиреЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рднреВрдорд┐ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрд▓рдмреНрдз рдХреНрд╖реЗрддреНрд░ рднрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рдЖрдпрддрд╛рдХрд╛рд░ рднреВрдорд┐ рдорд┐рд▓ рдЬрд╛рддреА рд╣реИред рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рднреВрдорд┐ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

10 рдХреА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде 40% рд╕реБрд╢реАредрдкреИрдВрдЬрд┐рдпрд╛ рдирд╛рдо рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛?рдпрд╣ рдЕрдВрддрд┐рдо рдЬреНрдЮрд╛рдд рд╕реБрдкрд░рдХреЙрдиреНрдЯрд┐рдиреЗрдВрдЯ рдХрд╛ рдирд╛рдо рдерд╛ рдЬреЛ рдХрдИ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдкреГрдереНрд╡реА рдкрд░ рдореМрдЬреВрдж рдерд╛ред рдпрд╣ рдирд╛рдо рдЧреНрд░реАрдХ рд╢рдмреНрджреЛрдВ рдкреИрди рдФрд░ рдЧреИрдпрд╛ рд╕реЗ рдмрдирд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рд╕рднреА рдкреНрд░рдХреГрддрд┐" рдпрд╛ "рд╕рднреА рднреВрдорд┐"ред
рд╣рдо рдЕрд╕рдВрднрд╡ рдХрд╛рд░реНрдб рд╕реЗ рд░рдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ
рдЬрдм рддрдХ рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рднреВрдорд┐ рджреНрд░рд╡реНрдпрдорд╛рди рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪрддреЗ, рддрдм рддрдХ рд╣рдо рдЬрд╝рдореАрди рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЬрдореАрди рдХреА рд╕рд╣реА рдорд╛рддреНрд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рдЬрд▓ рд╕реНрддрд░ рдкрд░ рдмрдврд╝рд╛рдПрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╣рд░ рд╕реЗрд▓ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗред рдЬрдм рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рд╢рдд рднреВрдорд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдЬрдирд░реЗрдЯрд░ рдХреА "рдкреНрд░рдпрд╛рд╕ рдФрд░ рдЕрд╕рдлрд▓рддрд╛" рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рднреВрдорд┐ рдорд┐рд▓ рдЬрд╛рдПрдЧреА, рдФрд░ рдпрд╣ рдПрдХ рдЕрдВрддрд╣реАрди рдЪрдХреНрд░ рдореЗрдВ рдлрдВрд╕ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлреНрд░реАрдЬ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЕрд╕рдВрднрд╡ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рднрд░реЛрд╕реЗрдордВрдж рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЕрдВрддрд╣реАрди рдЪрдХреНрд░реЛрдВ рд╕реЗ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдмрд╕
CreateLand
рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЕрдЯрдХ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд░реБрдХ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдмрдбрд╝реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣рдЬрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИрдВ, рдФрд░ рджрд╕ рд╣рдЬрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрддреБрдХреЗ рд▓рдЧрддреЗ рд╣реИрдВред рддреЛ рдЪрд▓рд┐рдП рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рд╕рдорд╛рдкреНрддрд┐ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
void CreateLand () { int landBudget = Mathf.RoundToInt(cellCount * landPercentage * 0.01f);
рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рдХреНрд╖рддрд┐рдЧреНрд░рд╕реНрдд рдирдХреНрд╢рд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ 10,000 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдЬрд▓реНрджреА рд╕реЗ рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдВрдЧреА, рдЬреЛ рдирдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрдврд╝рдиреЗ рд╕реЗ рд░реЛрдХреЗрдВрдЧреАред
рдкрд╛рд╢ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рднреА, рд╣рдореЗрдВ рдЕрднреА рднреА рд╕рд╣реА рдирдХреНрд╢рд╛ рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╕рд┐рд░реНрдл рд╕реБрд╢реА рдХреА рд╕рд╣реА рдорд╛рддреНрд░рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛ред рдЪрд▓реЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реВрдЪрдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрдЪреА рд╣реБрдИ рдЬрдореАрди рдЦрд░реНрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реЗред
void CreateLand () { тАж if (landBudget > 0) { Debug.LogWarning("Failed to use up " + landBudget + " land budget."); } }
10 рдХреА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде 95% рднреВрдорд┐ рдкреВрд░реА рд░рд╛рд╢рд┐ рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рдереАредрдПрдХ рд╡рд┐рдлрд▓ рдХрд╛рд░реНрдб рдореЗрдВ рдЕрднреА рднреА рднрд┐рдиреНрдирддрд╛ рдХреНрдпреЛрдВ рд╣реИ?рддрдЯрд░реЗрдЦрд╛ рдХреА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рд╕реГрдЬрди рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдВрджрд░ рдХреА рдКрдВрдЪрд╛рдЗрдпрд╛рдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рдирдП рдХреНрд╖реЗрддреНрд░ рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рдХреА рдУрд░ рдмрдврд╝рдиреЗ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рднреВрдЦрдВрдбреЛрдВ рдХреЛ рдЫреЛрдЯреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдмрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднреВрдЦрдВрдбреЛрдВ рдХреЛ рдХрдо рдХрд░рддреЗ рд╕рдордп рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред
unitypackageрдПрдХ рдХрд╛рд░реНрдб рдХрд╛ рд╡рд┐рднрд╛рдЬрди
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реАрдорд╛ рд╣реИ, рддреЛ рд╣рдордиреЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ: рд╕реАрдорд╛ рдХреНрд╖реЗрддреНрд░ рдФрд░ рд╡рд╣ рдХреНрд╖реЗрддреНрд░ рдЬрд╣рд╛рдВ рднреВрдЦрдВрдб рдмрдирд╛рдП рдЧрдП рдереЗред рдЪреВрдВрдХрд┐ рдХреЗрд╡рд▓ рд╕реГрдЬрди рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд╖реЗрддреНрд░ рдХреЗрд╡рд▓ рдкреВрд░реЗ рдирдХреНрд╢реЗ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ, рддреЛ рднреВрдорд┐ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрдИ рдЕрд╕рдВрдмрджреНрдз рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдорд╣рд╛рджреНрд╡реАрдкреЛрдВ рдХреЛ рдирд╛рдорд┐рдд рдХрд░рддреЗ рд╣реБрдП рднреВрдорд┐ рдЬрдирддрд╛ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдорд╛рдирдЪрд┐рддреНрд░ рдХреНрд╖реЗрддреНрд░
рдЪрд▓реЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред рдЖрдЗрдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ
MapRegion
рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдореЗрдВ рдмрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕реАрдорд╛ рдХреНрд╖реЗрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдо
HexMapGenerator
рдмрд╛рд╣рд░ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЗрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирд┐рдЬреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЪрд╛рд░ рдкреВрд░реНрдгрд╛рдВрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдПрдХ
MapRegion
рдлрд╝реАрд▓реНрдб рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
GenerateMap
рдореЗрдВ рдиреНрдпреВрдирддрдо-рдЕрдзрд┐рдХрддрдо рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
region.
ред
region.xMin = mapBorderX; region.xMax = x - mapBorderX; region.zMin = mapBorderZ; region.zMax = z - mapBorderZ;
рдФрд░
GetRandomCell
рдореЗрдВ рднреАред
HexCell GetRandomCell () { return grid.GetCell( Random.Range(region.xMin, region.xMax), Random.Range(region.zMin, region.zMax) ); }
рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ
рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА
MapRegion
рд╕реВрдЪреА рдХреЗ
MapRegion
рдлрд╝реАрд▓реНрдб
MapRegion
рдмрджрд▓реЗрдВред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдЙрд╕реЗ рдЦрд╛рд▓реА рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╡рд╣ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
void CreateRegions () { if (regions == null) { regions = new List<MapRegion>(); } else { regions.Clear(); } MapRegion region; region.xMin = mapBorderX; region.xMax = grid.cellCountX - mapBorderX; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); }
рд╣рдо
GenerateMap
рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдо рд╕реАрдзреЗ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рдмрдирд╛рдПрдВрдЧреЗред
рддрд╛рдХрд┐
GetRandomCell
рдПрдХ рдордирдорд╛рдирд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░
GetRandomCell
, рдЗрд╕реЗ
MapRegion
рдкреИрд░рд╛рдореАрдЯрд░ рджреЗред
HexCell GetRandomCell (MapRegion region) { return grid.GetCell( Random.Range(region.xMin, region.xMax), Random.Range(region.zMin, region.zMax) ); }
рдЕрдм
RaiseTerraion
рдФрд░
SinkTerrain
рд▓рд┐рдП рдЗрд╕реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
int RaiseTerrain (int chunkSize, int budget, MapRegion region) { searchFrontierPhase += 1; HexCell firstCell = GetRandomCell(region); тАж } int SinkTerrain (int chunkSize, int budget, MapRegion region) { searchFrontierPhase += 1; HexCell firstCell = GetRandomCell(region); тАж }
CreateLand
рд╡рд┐рдзрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреА рднреВрдорд┐ рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдЪрдХреНрд░ рдореЗрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдмрд╛рд░-рдмрд╛рд░ рдЬрд╛рдПрдВрдЧреЗред
void CreateLand () { int landBudget = Mathf.RoundToInt(cellCount * landPercentage * 0.01f); for (int guard = 0; landBudget > 0 && guard < 10000; guard++) { for (int i = 0; i < regions.Count; i++) { MapRegion region = regions[i]; int chunkSize = Random.Range(chunkSizeMin, chunkSizeMax - 1); if (Random.value < sinkProbability) { landBudget = SinkTerrain(chunkSize, landBudget, region); } else { landBudget = RaiseTerrain(chunkSize, landBudget, region); } } } if (landBudget > 0) { Debug.LogWarning("Failed to use up " + landBudget + " land budget."); } }
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдЕрднреА рднреА рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рднреВрдЦрдВрдбреЛрдВ рдХреЗ рдирд┐рдЪрд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝рдирд╛ рд╣реИред
for (int guard = 0; landBudget > 0 && guard < 10000; guard++) { bool sink = Random.value < sinkProbability; for (int i = 0; i < regions.Count; i++) { MapRegion region = regions[i]; int chunkSize = Random.Range(chunkSizeMin, chunkSizeMax - 1);
рдЕрдВрдд рдореЗрдВ, рднреВрдорд┐ рдХреА рдкреВрд░реА рдорд╛рддреНрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рд╣реА рд░рд╛рд╢рд┐ рд╢реВрдиреНрдп рддрдХ рдкрд╣реБрдБрдЪрддреА рд╣реИ, рд╣рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЪрдХреНрд░ рдХреЗ рдХрд┐рд╕реА рднреА рдЪрд░рдг рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╢реВрдиреНрдп-рд╕рдо рдЪреЗрдХ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд▓реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЬрдореАрди рдЙрдард╛рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рдЬрд╛рдВрдЪ рдХреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрдо рдХрд░рдиреЗ рдкрд░, рд░рд╛рд╢рд┐ рдХрднреА рднреА рдЦрд░реНрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╣рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рддреБрд░рдВрдд
CreateLand
рд╡рд┐рдзрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рд╣реИ, рдлрд┐рд░ рднреА рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреВрдЫрддреЗ рд╣реИрдВред рдЪрд▓рд┐рдП
CreateRegions
рдХреЛ
CreateRegions
рддрд╛рдХрд┐ рдпрд╣ рдореИрдк рдХреЛ рдЖрдзрд╛ рд╡рд░реНрдЯрд┐рдХрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬреЛрдбрд╝рд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ
xMax
рдорд╛рди рдХреЛ рдЖрдзрд╛ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо
xMin
рд▓рд┐рдП рд╕рдорд╛рди рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ
xMin
рд▓рд┐рдП рдореВрд▓ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
MapRegion region; region.xMin = mapBorderX; region.xMax = grid.cellCountX / 2; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); region.xMin = grid.cellCountX / 2; region.xMax = grid.cellCountX - mapBorderX; regions.Add(region);
рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдХрд╛рд░реНрдб рдмрдирд╛рдиреЗ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред рдпрджреНрдпрдкрд┐ рд╣рдордиреЗ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ, рд╡реЗ рдПрдХ рдкреБрд░рд╛рдиреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рдорд╛рди рдХреНрд╖реЗрддреНрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлреИрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдЦрд╛рд▓реА рдЬрдЧрд╣ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛ рдореЗрдВ рдПрдХ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░, рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЕрдВрддрд░рд╛рд▓ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
[Range(0, 10)] public int regionBorder = 5;
рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛ рд╕реНрд▓рд╛рдЗрдбрд░редрдЪреВрдВрдХрд┐ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреА рдЬрдЧрд╣ рдХреЗ рджреЛрдиреЛрдВ рдУрд░ рднреВрдорд┐ рдХрд╛ рдЧрдарди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рднреВрдорд┐ рдкреБрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рдПрдЧреАред рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд╛рдЬрди рд░реЗрдЦрд╛ рдФрд░ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмреАрдЪ рднреВрдорд┐-рдореБрдХреНрдд рдХреНрд╖реЗрддреНрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рднреВрдЦрдВрдб рд╢реБрд░реВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрдбрд╝реЛрд╕реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рджреЛ рдЕрдзрд┐рдХ рд╣реИред
рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ
xMax
рд╕реЗ
xMax
рдФрд░ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ
xMin
ред
MapRegion region; region.xMin = mapBorderX; region.xMax = grid.cellCountX / 2 - regionBorder; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); region.xMin = grid.cellCountX / 2 + regionBorder; region.xMax = grid.cellCountX - mapBorderX; regions.Add(region);
рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде, рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдПрдХ рдмрдбрд╝реА рдорд╛рдирдЪрд┐рддреНрд░ рд╕реАрдорд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рднреВрдорд┐ рдЬрдирддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдХреНрд╕рд░ рдпрд╣ рджреЛ рдмрдбрд╝реЗ рдорд╣рд╛рджреНрд╡реАрдк рд╣реЛрдВрдЧреЗ, рд╕рдВрднрд╡рддрдГ рдХрдИ рджреНрд╡реАрдкреЛрдВ рдХреЗ рд╕рд╛рдеред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдмрдбрд╝реЗ рджреНрд╡реАрдк рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдХрднреА-рдХрднреА рджреЛ рдорд╣рд╛рджреНрд╡реАрдкреЛрдВ рдХреЛ рдПрдХ рдЗрдердорд╕ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдмреЗрд╢рдХ, рд╣рдо рдПрдХреНрд╕ рдФрд░ рдЬреЗрдб рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рднреА рдирдХреНрд╢рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЪреБрдиреЗрдВред
MapRegion region; if (Random.value < 0.5f) { region.xMin = mapBorderX; region.xMax = grid.cellCountX / 2 - regionBorder; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); region.xMin = grid.cellCountX / 2 + regionBorder; region.xMax = grid.cellCountX - mapBorderX; regions.Add(region); } else { region.xMin = mapBorderX; region.xMax = grid.cellCountX - mapBorderX; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ / 2 - regionBorder; regions.Add(region); region.zMin = grid.cellCountZ / 2 + regionBorder; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); }
рдорд╛рдирдЪрд┐рддреНрд░ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИредрдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреНрд╖реИрддрд┐рдЬ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдкрдХ рдФрд░ рдкрддрд▓реЗ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред рдирддреАрдЬрддрди, рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХрдИ рд╡рд┐рднрд╛рдЬрд┐рдд рднреВрдорд┐ рдЬрдирддрд╛ рдХреЗ рдЧрдарди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░
рдЖрдЗрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдмрдирд╛рдПрдВ, 1 рд╕реЗ 4 рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдмрдирд╛рдПрдВред
[Range(1, 4)] public int regionCount = 1;
рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд▓рд╛рдЗрдбрд░редрд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
switch
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХреЗрд╕ 2 рдХреЗ рд▓рд┐рдП рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред
MapRegion region; switch (regionCount) { default: region.xMin = mapBorderX; region.xMax = grid.cellCountX - mapBorderX; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); break; case 2: if (Random.value < 0.5f) { region.xMin = mapBorderX; region.xMax = grid.cellCountX / 2 - regionBorder; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); region.xMin = grid.cellCountX / 2 + regionBorder; region.xMax = grid.cellCountX - mapBorderX; regions.Add(region); } else { region.xMin = mapBorderX; region.xMax = grid.cellCountX - mapBorderX; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ / 2 - regionBorder; regions.Add(region); region.zMin = grid.cellCountZ / 2 + regionBorder; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); } break; }
рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреНрдпрд╛ рд╣реИ?рдпрд╣ рдЗрдл-рдЗрдл-рдЗрдл-рдЗрдпрд░реНрд╕ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд╕реНрд╡рд┐рдЪ рдХреЛ рдЪрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд▓реЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ
default
рд▓реЗрдмрд▓ рднреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд┐рдо рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЛ
break
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдпрд╛
return
рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
switch
рдмреНрд▓реЙрдХ рдХреЛ рдкрдардиреАрдп рд░рдЦрдиреЗ рдХреЗ
switch
, рдЖрдорддреМрд░ рдкрд░ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдЫреЛрдЯрд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдПрдХ рдмрдпрд╛рди рдпрд╛ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рд╕рд╛рдеред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
switch (regionCount) { default: CreateOneRegion(); break; case 2: CreateTwoRegions(); break; case 3: CreateThreeRegions(); break; case 4: CreateFourRegions(); break; }
рддреАрди рдХреНрд╖реЗрддреНрд░ рджреЛ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рдХреЗрд╡рд▓ рддрд┐рд╣рд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдзреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд╖реИрддрд┐рдЬ рд╡рд┐рднрд╛рдЬрди рдмрд╣реБрдд рд╕рдВрдХреАрд░реНрдг рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдХреЗрд╡рд▓ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдмрдирд╛рдпрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдордиреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕реАрдорд╛ рдХреНрд╖реЗрддреНрд░ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХрд╛ рд╕реНрдерд╛рди рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╣реИред
switch (regionCount) { default: тАж break; case 2: тАж break; case 3: region.xMin = mapBorderX; region.xMax = grid.cellCountX / 3 - regionBorder; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); region.xMin = grid.cellCountX / 3 + regionBorder; region.xMax = grid.cellCountX * 2 / 3 - regionBorder; regions.Add(region); region.xMin = grid.cellCountX * 2 / 3 + regionBorder; region.xMax = grid.cellCountX - mapBorderX; regions.Add(region); break; }
рддреАрди рдХреНрд╖реЗрддреНрд░редрдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рдВрдпреЛрдЬрди рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдиреЗ рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
switch (regionCount) { тАж case 4: region.xMin = mapBorderX; region.xMax = grid.cellCountX / 2 - regionBorder; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ / 2 - regionBorder; regions.Add(region); region.xMin = grid.cellCountX / 2 + regionBorder; region.xMax = grid.cellCountX - mapBorderX; regions.Add(region); region.zMin = grid.cellCountZ / 2 + regionBorder; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); region.xMin = mapBorderX; region.xMax = grid.cellCountX / 2 - regionBorder; regions.Add(region); break; } }
рдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░редрдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рднреВрдорд┐ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рд╕реЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХреНрд╖реЗрддреНрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдкреАрдврд╝реА рдХреЗ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд╛рд░реНрдб рдХреЛ рд╕реАрдзреА рд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдореЗрдВ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрддрдирд╛ рд╣реА рдХрдо рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦреЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдЧреЗрдордкреНрд▓реЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рд╡рд┐рд╡рд┐рдз рдФрд░ рдЕрд╕реАрдорд┐рдд рднреВрдорд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рдорджрдж рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирдХреНрд╢реЗ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╣реИрдВред рд╣рдо рдХреЗрд╡рд▓ рд╕реАрдзреА рд░реЗрдЦрд╛рдУрдВ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд░рд╣ рд╕рдХрддреЗред рд╣рдореЗрдВ рд╕рдорд╛рди рдЖрдХрд╛рд░ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рднреА рдХрд╡рд░ рдХрд░рдирд╛ рд╣реИред рд╣рдо рдЫреЗрдж рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЪреМрд░рд╛рд╣реЛрдВ рдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рднреВрдорд┐ рдХреЗ рд╡рд┐рддрд░рдг рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЬрдирд░реЗрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ), рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдХреНрд╢реЗ рдкрд░ рдПрдХ рдмрдбрд╝рд╛ рдорд╣рд╛рджреНрд╡реАрдк рдФрд░ рдПрдХ рджреНрд╡реАрдкрд╕рдореВрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
unitypackageрдХрдЯрд╛рд╡
рдЕрдм рддрдХ, рд╣рдордиреЗ рдЬреЛ рднреА рдХрд╛рд░реНрдб рдмрдирд╛рдП рд╣реИрдВ, рд╡реЗ рдХрдареЛрд░ рдФрд░ рдЯреВрдЯреЗ рд╣реБрдП рджрд┐рдЦрддреЗ рд╣реИрдВред
рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд╛рд╣рдд рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдордп рдХреЗ рд╕рд╛рде рдпрд╣ рдЪрд┐рдХрдиреА рдФрд░ рдЪрд┐рдХрдиреА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рдХреЗ рддреЗрдЬ рд╣рд┐рд╕реНрд╕реЗ рдХреНрд╖рд░рдг рдХреЗ рдХрд╛рд░рдг рд╕реБрд╕реНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдирдХреНрд╢реЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдЯрд╛рд╡ рдХреА рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдХрд┐рд╕реА рди рдХрд┐рд╕реА рднреВрдорд┐ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрд░реЗрдВрдЧреЗред public void GenerateMap (int x, int z) { тАж CreateRegions(); CreateLand(); ErodeLand(); SetTerrainType(); тАж } тАж void ErodeLand () {}
рдХрдЯрд╛рд╡ рдкреНрд░рддрд┐рд╢рдд
рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╕рдордп рдмреАрддрддрд╛ рд╣реИ, рдЙрддрдирд╛ рдЕрдзрд┐рдХ рдХреНрд╖рд░рдг рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд╖рд░рдг рд╕реНрдерд╛рдпреА рди рд╣реЛ, рд▓реЗрдХрд┐рди рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реЛред рдХрдо рд╕реЗ рдХрдо, рдХрдЯрд╛рд╡ рд╢реВрдиреНрдп рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдирдХреНрд╢реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдЕрдзрд┐рдХрддрдо рдХрдЯрд╛рд╡ рд╡реНрдпрд╛рдкрдХ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдХрдЯрд╛рд╡ рдмрд▓реЛрдВ рдХреЗ рдЖрдЧреЗ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдм рдЗрд▓рд╛рдХреЗ рдХреЛ рдирд╣реАрдВ рдмрджрд▓реЗрдВрдЧреЗред рдпрд╣реА рд╣реИ, рдХрдЯрд╛рд╡ рдкреИрд░рд╛рдореАрдЯрд░ 0 рд╕реЗ 100 рддрдХ рдПрдХ рдкреНрд░рддрд┐рд╢рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣рдо 50 рд▓реЗрдВрдЧреЗред [Range(0, 100)] public int erosionPercentage = 50;
рдХрдЯрд╛рд╡ рд╕реНрд▓рд╛рдЗрдбрд░редрдХреНрд╖рд░рдг рдирд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХрд░реЗрдВ
рдХрдЯрд╛рд╡ рд░рд╛рд╣рдд рдХреЛ рдЪрд┐рдХрдирд╛ рдмрдирд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХрдорд╛рддреНрд░ рддреЗрдЬ рднрд╛рдЧ рдЪрдЯреНрдЯрд╛рди рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╡реЗ рдХреНрд╖рд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд▓рдХреНрд╖реНрдп рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдПрдХ рдЪрдЯреНрдЯрд╛рди рдореМрдЬреВрдж рд╣реИ, рддреЛ рдХреНрд╖рд░рдг рдХреЛ рддрдм рддрдХ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЕрдВрдд рдореЗрдВ рдврд▓рд╛рди рдореЗрдВ рдмрджрд▓ рди рдЬрд╛рдПред рд╣рдо рдврд▓рд╛рдиреЛрдВ рдХреЛ рдЪрд┐рдХрдирд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЙрдмрд╛рдК рдЗрд▓рд╛рдХреЗ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИрдВ, рдФрд░ рдЙрдирдХреА рдКрдВрдЪрд╛рдИ рдХрдо рд╣реИред рдпреЗ рдЕрдкрд░рджрди-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛рдПрдБ рд╣реЛрдВрдЧреАредрдЖрдЗрдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдХреНрд╖рд░рдг рдХрд╛ рдЦрддрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдмрдбрд╝реА рдКрдВрдЪрд╛рдИ рдХрд╛ рдЕрдВрддрд░ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдХреЛ рдКрдВрдЪрд╛рдИ рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдпрд╛ рджреЛ рд╕реНрддрд░реЛрдВ рдХреЗ рдЕрдВрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрдЧрд░ рдХреЛрд╢рд┐рдХрд╛ рдЗрд╕рдХреЗ рдХрдЯрд╛рд╡ рдХреЗ рдЕрдзреАрди рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкрдбрд╝реЛрд╕реА рдЗрд╕рдХреЗ рдиреАрдЪреЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рдЪрд░рдг рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдкрдбрд╝реЛрд╕реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреЛрд╢рд┐рдХрд╛ рдХреНрд╖рд░рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИред bool IsErodible (HexCell cell) { int erodibleElevation = cell.Elevation - 2; for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = cell.GetNeighbor(d); if (neighbor && neighbor.Elevation <= erodibleElevation) { return true; } } return false; }
рд╣рдо ErodeLand
рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдЗрд░реЛрдЬрди-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕реВрдЪреА рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред void ErodeLand () { List<HexCell> erodibleCells = ListPool<HexCell>.Get(); for (int i = 0; i < cellCount; i++) { HexCell cell = grid.GetCell(i); if (IsErodible(cell)) { erodibleCells.Add(cell); } } ListPool<HexCell>.Add(erodibleCells); }
рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдХрдЯрд╛рд╡-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╢реЗрд╖ рдХрдЯрд╛рд╡-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЯрд╛рд╡ рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкреНрд░рддрд┐рд╢рдд 50 рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдХреНрд╖рд░рдг рддрдм рддрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рддрдХ рдХрд┐ рдореВрд▓ рдорд╛рддреНрд░рд╛ рдЖрдзреА рди рд░рд╣ рдЬрд╛рдПред рдпрджрд┐ рдкреНрд░рддрд┐рд╢рдд 100 рд╣реИ, рддреЛ рд╣рдо рддрдм рддрдХ рдирд╣реАрдВ рд░реБрдХреЗрдВрдЧреЗ рдЬрдм рддрдХ рд╣рдо рд╕рднреА рдХреНрд╖рд░рдг-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рджреЗрддреЗред void ErodeLand () { List<HexCell> erodibleCells = ListPool<HexCell>.Get(); for (int i = 0; i < cellCount; i++) { тАж } int targetErodibleCount = (int)(erodibleCells.Count * (100 - erosionPercentage) * 0.01f); ListPool<HexCell>.Add(erodibleCells); }
рдХреНрдпрд╛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рднреВрдорд┐ рдХрдЯрд╛рд╡-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?. , , .
рдХреЛрд╢рд┐рдХрд╛ рдХреА рдХрдореА
рдЖрдЗрдП рдПрдХ рднреЛрд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдХрдЯрд╛рд╡ рдирд╖реНрдЯ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдКрдВрдЪрд╛рдИ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдХрдореА рд╕реЗ рдЕрдм рдХреНрд╖рд░рдг рд╣реЛрдиреЗ рдХрд╛ рдЦрддрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдпрд╣ рд╕рдЪ рдерд╛, рддреЛ рд╣рдо рд╕реВрдЪреА рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реЗрд▓ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХреА рдКрдВрдЪрд╛рдИ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рддрдм рддрдХ рджреЛрд╣рд░рд╛рдПрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреНрд╖рд░рдг рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗред int targetErodibleCount = (int)(erodibleCells.Count * (100 - erosionPercentage) * 0.01f); while (erodibleCells.Count > targetErodibleCount) { int index = Random.Range(0, erodibleCells.Count); HexCell cell = erodibleCells[index]; cell.Elevation -= 1; erodibleCells.Remove(cell); } ListPool<HexCell>.Add(erodibleCells);
рдЖрд╡рд╢реНрдпрдХ рдЦреЛрдЬ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП erodibleCells.Remove
, рд╣рдо рд╕реВрдЪреА рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗред рд╣рдореЗрдВ рдЕрдм рднреА рдЙрдирдХреЗ рдЖрджреЗрд╢ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред
рдХреНрд╖рд░рдг-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ 0% рдФрд░ 100% рдХреА рдХрдореА, рдмреАрдЬ рдорд╛рдирдЪрд┐рддреНрд░ 1957632474редрдХрдЯрд╛рд╡ рдЯреНрд░реИрдХрд┐рдВрдЧ
рд╣рдорд╛рд░рд╛ рднреЛрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрдВ рдХреНрд╖рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╣реА рдбрд┐рдЧреНрд░реА рддрдХ рдирд╣реАрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдКрдВрдЪрд╛рдИ рдореЗрдВ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд╕реЗрд▓ рдЕрднреА рднреА рдХреНрд╖рд░рдг рдХрд╛ рдЦрддрд░рд╛ рдмрдирд╛ рд░рд╣ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реВрдЪреА рд╕реЗ рдПрдХ рд╕реЗрд▓ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рд╣рдЯрд╛рдПрдВрдЧреЗ рдЬрдм рдпрд╣ рдХреНрд╖рд░рдг рдХреЗ рдЕрдзреАрди рдирд╣реАрдВ рд╣реИред if (!IsErodible(cell)) { erodibleCells[index] = erodibleCells[erodibleCells.Count - 1]; erodibleCells.RemoveAt(erodibleCells.Count - 1); }
рд╕реВрдЪреА рдореЗрдВ рдХреНрд╖рд░рдг-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП 100% рдХреНрд╖рд░рдгредрддреЛ рд╣рдо рдмрд╣реБрдд рдордЬрдмреВрдд рдХрдЯрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди 100% рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдо рдЕрднреА рднреА рд╕рднреА рдЪрдЯреНрдЯрд╛рдиреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╕реЗрд▓ рдХреА рдКрдВрдЪрд╛рдИ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреНрд╖рд░рдг рдХрд╛ рд╢рд┐рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдХреНрд╖рд░рдг-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВредрд╕реЗрд▓ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рднреА рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЕрдм рд╡реЗ рдХрдЯрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рддрдХ рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред if (!IsErodible(cell)) { erodibleCells[index] = erodibleCells[erodibleCells.Count - 1]; erodibleCells.RemoveAt(erodibleCells.Count - 1); } for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = cell.GetNeighbor(d); if ( neighbor && IsErodible(neighbor) && !erodibleCells.Contains(neighbor) ) { erodibleCells.Add(neighbor); } }
рд╕рднреА рдирд╖реНрдЯ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрд╣рдо рдмрд╣реБрдд рдЬрдореАрди рдмрдЪрд╛рддреЗ рд╣реИрдВ
рдЕрдм рдХрдЯрд╛рд╡ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдм рддрдХ рдЬрд╛рд░реА рд░рд╣ рд╕рдХрддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдЪрдЯреНрдЯрд╛рди рдЧрд╛рдпрдм рди рд╣реЛ рдЬрд╛рдПрдВред рдпрд╣ рднреВрдорд┐ рдХреЛ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рднреВрдорд┐ рджреНрд░рд╡реНрдпрдорд╛рди рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рдФрд░ рд╣рдореЗрдВ рднреВрдорд┐ рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдорд┐рд▓рд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирдХреНрд╢реЗ рд╕реЗ рдЬрдореАрди рд╣рдЯрд╛ рд░рд╣реЗ рд╣реИрдВредрд╕рдЪреНрдЪрд╛ рдХреНрд╖рд░рдг рдкрджрд╛рд░реНрде рдХреЛ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдЗрд╕реЗ рдПрдХ рдЬрдЧрд╣ рд╕реЗ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдФрд░ рдХрд╣реАрдВ рдФрд░ рд░рдЦ рджреЗрддреА рд╣реИред рд╣рдо рднреА рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╕реЗрд▓ рдореЗрдВ рдХрдореА рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЙрд╕рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдКрдВрдЪрд╛рдИ рдХрд╛ рдПрдХ рд╕реНрддрд░ рдХрдо рд╕реЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореИрдк рд╣рд╛рдЗрдЯреНрд╕ рдХреА рдХреБрд▓ рд░рд╛рд╢рд┐ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмрд╕ рдЗрд╕реЗ рд╕реНрдореВрде рдХрд░рддрд╛ рд╣реИредрдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрдЯрд╛рд╡ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдХрд╣рд╛рдБ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рд╣рдорд╛рд░рд╛ рдХреНрд╖рд░рдг рд▓рдХреНрд╖реНрдп рд╣реЛрдЧрд╛ред рдЖрдЗрдП рд╕реЗрд▓ рдХреЗ рд▓рдХреНрд╖реНрдп рдмрд┐рдВрджреБ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВред рдЪреВрдВрдХрд┐ рдЗрд╕ рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдмреНрд░реЗрдХ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмреНрд░реЗрдХ рдХреЗ рддрд╣рдд рд╕реНрдерд┐рдд рд╕реЗрд▓ рдХреЛ рд▓рдХреНрд╖реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдХрдЯрд╛рд╡-рдкреНрд░рд╡рдг рдХреЛрд╢рд┐рдХрд╛ рдореЗрдВ рдХрдИ рд╡рд┐рд░рд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рднреА рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рднреА рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕реВрдЪреА рдореЗрдВ рдбрд╛рд▓ рджреЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдиреЗрдВрдЧреЗред HexCell GetErosionTarget (HexCell cell) { List<HexCell> candidates = ListPool<HexCell>.Get(); int erodibleElevation = cell.Elevation - 2; for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = cell.GetNeighbor(d); if (neighbor && neighbor.Elevation <= erodibleElevation) { candidates.Add(neighbor); } } HexCell target = candidates[Random.Range(0, candidates.Count)]; ListPool<HexCell>.Add(candidates); return target; }
рдЬреИрд╕рд╛ рдХрд┐ ErodeLand
рд╣рдо рд▓рдХреНрд╖реНрдп рд╕реЗрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрд╛ рдЪрдпрди рд╕реЗрд▓ рдШрд┐рд╕ред рдлрд┐рд░ рд╣рдо рд╕реЗрд▓ рд╣рд╛рдЗрдЯреНрд╕ рдХреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рддреБрд░рдВрдд рдШрдЯрд╛рддреЗ рдФрд░ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓рдХреНрд╖реНрдп рд╕реЗрд▓ рд╕реНрд╡рдпрдВ рдХрдЯрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдерд┐рддрд┐ рддрдм рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬрдм рд╣рдо рдирдП рдирд╖реНрдЯ рд╕реЗрд▓ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред HexCell cell = erodibleCells[index]; HexCell targetCell = GetErosionTarget(cell); cell.Elevation -= 1; targetCell.Elevation += 1; if (!IsErodible(cell)) { erodibleCells[index] = erodibleCells[erodibleCells.Count - 1]; erodibleCells.RemoveAt(erodibleCells.Count - 1); }
рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рд▓рдХреНрд╖реНрдп рд╕реЗрд▓ рдХреЛ рдЙрдард╛рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕реЗрд▓ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдм рдХреНрд╖рд░рдг рдХреЗ рдЕрдзреАрди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдирд╛ рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдХрдЯрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдг рд╣реИрдВред рдпрджрд┐ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕реВрдЪреА рдореЗрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = cell.GetNeighbor(d); тАж } for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = targetCell.GetNeighbor(d); if ( neighbor && !IsErodible(neighbor) && erodibleCells.Contains(neighbor) ) { erodibleCells.Remove(neighbor); } }
рднреВрдорд┐ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП 100% рдХреНрд╖рд░рдгредрдХрдЯрд╛рд╡ рдЕрдм рдЗрд▓рд╛рдХреЗ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕реБрдЪрд╛рд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рднреВрдорд┐ рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди рдмрдврд╝ рдФрд░ рд╕рдВрдХреАрд░реНрдг рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рджрд┐рд╢рд╛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдВ рднреВрдорд┐ рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдХреЛ рдХрдИ рдкреНрд░рддрд┐рд╢рдд рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрдВрднреАрд░ рд╡рд┐рдЪрд▓рди рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рд╣рдо рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдХреНрд╖рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЙрддрдиреЗ рд╣реА рдХрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднреВрдорд┐ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдХрдо рд╣реЛрдЧрд╛редрддреНрд╡рд░рд┐рдд рдХрдЯрд╛рд╡
рдпрджреНрдпрдкрд┐ рд╣рдореЗрдВ рдХрдЯрд╛рд╡ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЗрд╕рдореЗрдВ рд╕рд░рд▓ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЬреЛ рд╕реЗрд▓ рдорд┐рдЯрд╛ рдЪреБрдХреЗ рд╣реИрдВ рд╡рд╣ рдорд┐рдЯ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣рдо рдЗрд╕реЗ рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдк рд▓рдХреНрд╖реНрдп рд╕реЗрд▓ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рд╕реЗрд▓ рдХреЛ рдЪреЗрдХ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = targetCell.GetNeighbor(d); if ( neighbor && neighbor != cell && !IsErodible(neighbor) && erodibleCells.Contains(neighbor) ) { erodibleCells.Remove(neighbor); } }
рджреВрд╕рд░реЗ, рд╣рдореЗрдВ рд▓рдХреНрд╖реНрдп рд╕реЗрд▓ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬрдм рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдмреНрд░реЗрдХ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдкрдбрд╝реЛрд╕реА рдЕрдм рд▓рдХреНрд╖реНрдп рд╕реЗрд▓ рд╕реЗ рдПрдХ рдХрджрдо рдЕрдзрд┐рдХ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдкрдбрд╝реЛрд╕реА рдХреЛ рд╕реВрдЪреА рдореЗрдВ рд░рд╣рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╣рдо рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЦреЛрдЬ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред HexCell neighbor = targetCell.GetNeighbor(d); if ( neighbor && neighbor != cell && neighbor.Elevation == targetCell.Elevation + 1 && !IsErodible(neighbor)
рддреАрд╕рд░рд╛, рд╣рдо рдПрдХ рд╕рдорд╛рди рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдПрдХ рдХреНрд╖рд░рдг-рдкреНрд░рд╡рдг рд╕реЗрд▓ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЕрдм рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдЪрдЯреНрдЯрд╛рди рд╣реИ, рддреЛ рдкрдбрд╝реЛрд╕реА рдХреЛ рдХрдЯрд╛рд╡ рд╣реЛрдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ IsErodible
ред HexCell neighbor = cell.GetNeighbor(d); if ( neighbor && neighbor.Elevation == cell.Elevation + 2 &&
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдЕрднреА рднреА рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓рдХреНрд╖реНрдп рд╕реЗрд▓ рдХреНрд╖рд░рдг рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдЪрдХреНрд░ рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд▓рдХреНрд╖реНрдп рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред if (!IsErodible(cell)) { erodibleCells[index] = erodibleCells[erodibleCells.Count - 1]; erodibleCells.RemoveAt(erodibleCells.Count - 1); } for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { тАж } if (IsErodible(targetCell) && !erodibleCells.Contains(targetCell)) { erodibleCells.Add(targetCell); } for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { тАж }
рдЕрдм рд╣рдо рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рддрд┐рд╢рдд рддрдХ рдХреНрд╖рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдордиреЗ рдЙрд╕ рд╕реНрдерд╛рди рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╣рд╛рдВ рд▓рдХреНрд╖реНрдп рд╕реЗрд▓ рдХреЛ рдХрдЯрд╛рд╡ рдкреНрд░рд╡рдг рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдЕрдиреБрдХреВрд▓рди рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред25%, 50%, 75% рдФрд░ 100% рдХреНрд╖рд░рдгредрдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рддрдЯ рдХреЗ рдмрджрд▓реЗ рд╣реБрдП рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЯреЛрдкреЛрд▓реЙрдЬреА рдореВрд▓ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрджрд▓реА рд╣реИред рднреВрдорд┐ рдЬрдирддрд╛ рдЖрдорддреМрд░ рдкрд░ рдпрд╛ рддреЛ рдЬреБрдбрд╝реА рд░рд╣рддреА рд╣реИ рдпрд╛ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдХреЗрд╡рд▓ рдЫреЛрдЯреЗ рджреНрд╡реАрдк рд╣реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреВрдм рд╕рдХрддреЗ рд╣реИрдВред рд░рд╛рд╣рдд рд╡рд┐рд╡рд░рдг рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реИрдВред рдПрдХ рд╕рдВрдХреАрд░реНрдг рд╕рдВрдпреБрдХреНрдд рдЧрд╛рдпрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдереЛрдбрд╝рд╛ рдмрдврд╝ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЫреЛрдЯрд╛ рдЕрдВрддрд░ рднрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрдЯрд╛рд╡ рд╡рд┐рднрд╛рдЬрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рд╕реЗ рдЪрд┐рдкрдХ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ред
рдЪрд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд┐рдЯ рдХреНрд╖реЗрддреНрд░ рдЕрднреА рднреА рдЕрд▓рдЧ рд░рд╣рддреЗ рд╣реИрдВредunitypackageрднрд╛рдЧ 25: рдЬрд▓ рдЪрдХреНрд░
- рдХрдЪреНрдЪреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
- рд╣рдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред
- рдкрд╛рдиреА рдХреЗ рдЪрдХреНрд░ рдХрд╛ рдПрдХ рдЖрдВрд╢рд┐рдХ рд╕рд┐рдореБрд▓реЗрд╢рди рдмрдирд╛рдПрдВред
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо рднреВрдорд┐ рдкрд░ рдЖрд░реНрджреНрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВрдЧреЗредрдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдПрдХрддрд╛ 2017.3.0 рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛редрд╣рдо рдмрд╛рдпреЛрдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдиреА рдХреЗ рдЪрдХреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВредрдмрд╛рджрд▓
рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ, рдирдХреНрд╢рд╛ рдкреАрдврд╝реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдиреЗ рдХреЗрд╡рд▓ рд╕реЗрд▓ рдКрдВрдЪрд╛рдИ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рдпрд╣ рдерд╛ рдХрд┐ рд╡реЗ рдкрд╛рдиреА рдХреЗ рдКрдкрд░ рдпрд╛ рдиреАрдЪреЗ рдереЗред рдпрджреНрдпрдкрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрд▓рд╛рдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдКрдВрдЪрд╛рдИ рдХрд╛ рдПрдХ рд╕рд░рд▓ рджреГрд╢реНрдп рд╣реИред рд╕реНрдерд╛рдиреАрдп рдЬрд▓рд╡рд╛рдпреБ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд░рд╛рд╣рдд рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛редрдкреГрдереНрд╡реА рдХреА рдЬрд▓рд╡рд╛рдпреБ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓реА рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдореЗрдВ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЬрд▓рд╡рд╛рдпреБ рд╕рд┐рдореБрд▓реЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдРрд╕реА рдЪреАрдЬрд╝ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрдЧреА рдЬреЛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛред рдЬрд▓рд╡рд╛рдпреБ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдкрд╛рдиреА рдХрд╛ рдЪрдХреНрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рдирд╕реНрдкрддрд┐рдпреЛрдВ рдФрд░ рдЬреАрд╡реЛрдВ рдХреЛ рдЬреАрд╡рд┐рдд рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░рд▓ рдкрд╛рдиреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рддрд╛рдкрдорд╛рди рднреА рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рдиреА рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рддрд╛рдкрдорд╛рди рдХреЛ рд╕реНрдерд┐рд░ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЖрд░реНрджреНрд░рддрд╛ рдмрджрд▓рддреЗ рд╣реИрдВредрдЬрд▓ рдЪрдХреНрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдкрд╛рдиреА рдХреА рдЧрддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рддрд╛рд▓рд╛рдм рд╡рд╛рд╖реНрдкрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╛рд░рд┐рд╢ рдХреЗ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдлрд┐рд░ рд╕реЗ рддрд╛рд▓рд╛рдмреЛрдВ рдореЗрдВ рдмрд╣ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрдИ рдФрд░ рдкрд╣рд▓реВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрди рдХрджрдореЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдкрд╛рдиреА рдХреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рдг рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрдбреЗрдЯрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рд┐рдореБрд▓реЗрд╢рди рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЯреЗрд░реЗрди рд╢реЗрдбрд░ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ ред рд╣рдо рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрд╡реИрдЪреЗрдмрд▓ рдЧреБрдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдбреЗрдЯрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░рд╛рд╣рдд рдмрдирд╛рд╡рдЯ рдХреЗ рдмрдЬрд╛рдп рдХрдЪреНрдЪреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рддреИрд░рдиреЗ рдпреЛрдЧреНрдп рдЧреБрдг рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реНрд╡рд┐рдЪреЗрдмрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдХреАрд╡рд░реНрдб рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдирд┐рд░реАрдХреНрд╖рдХ рдореЗрдВ рдПрдХ рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдЬреЛ рдПрдХ рдХреАрд╡рд░реНрдб рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдХреАрд╡рд░реНрдб рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╣рдо SHOW_MAP_DATA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ред Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Terrain Texture Array", 2DArray) = "white" {} _GridTex ("Grid Texture", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Specular ("Specular", Color) = (0.2, 0.2, 0.2) _BackgroundColor ("Background Color", Color) = (0,0,0) [Toggle(SHOW_MAP_DATA)] _ShowMapData ("Show Map Data", Float) = 0 }
рдорд╛рдирдЪрд┐рддреНрд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВредрдХреАрд╡рд░реНрдб рд╕рдорд░реНрдерди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ shader рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВред #pragma multi_compile _ GRID_ON #pragma multi_compile _ HEX_MAP_EDIT_MODE #pragma shader_feature SHOW_MAP_DATA
рд╣рдо рдЗрд╕реЗ рдПрдХ рдПрдХрд▓ рдлреНрд▓реЛрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдХреА рд░рд╛рд╣рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреАрд╡рд░реНрдб рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ Input
рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ mapData
ред struct Input { float4 color : COLOR; float3 worldPos; float3 terrain; float4 visibility;
рд╢реАрд░реНрд╖ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ, рд╣рдо рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ Z рдЪреИрдирд▓ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ mapData
, рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╣рдореЗрд╢рд╛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рд╣реЛрддрд╛ рд╣реИред void vert (inout appdata_full v, out Input data) { тАж #if defined(SHOW_MAP_DATA) data.mapData = cell0.z * v.color.x + cell1.z * v.color.y + cell2.z * v.color.z; #endif }
рдЬрдм рдЖрдкрдХреЛ рд╕реЗрд▓ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ рдПрд▓реНрдмрд┐рдбреЛ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЧреНрд░рд┐рдб рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╕рдордп рдЧреНрд░рд┐рдб рдЕрднреА рднреА рдЪрд╛рд▓реВ рд╣реЛред void surf (Input IN, inout SurfaceOutputStandardSpecular o) { тАж o.Albedo = c.rgb * grid * _Color * explored; #if defined(SHOW_MAP_DATA) o.Albedo = IN.mapData * grid; #endif тАж }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ shader рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдореЗрдВ рдЙрд╕ HexCellShaderData
рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдиреАрд▓реА рдмрдирд╛рд╡рдЯ рдбреЗрдЯрд╛ рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд┐рдЦрддреА рд╣реИред рдбреЗрдЯрд╛ 0тАУ1 рддрдХ рд╕реАрдорд┐рдд рдПрдХ рдПрдХрд▓ рдлреНрд▓реЛрдЯ рдореВрд▓реНрдп рд╣реИред public void SetMapData (HexCell cell, float data) { cellTextureData[cell.Index].b = data < 0f ? (byte)0 : (data < 1f ? (byte)(data * 255f) : (byte)255); enabled = true; }
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдирд┐рд░реНрдгрдп рдЕрдиреБрд╕рдВрдзрд╛рди рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реЗрд▓ рдЪреИрдирд▓ рджреГрд╢реНрдпрддрд╛ рд╕рдВрдХреНрд░рдордг рдореЗрдВ рд╣реИ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд▓реВ рдЪреИрдирд▓ рдбреЗрдЯрд╛ рд╡реИрд▓реНрдпреВ 255 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд╛рдЗрдЯ рдорд╛рди 254 рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЯреБрдХрдбрд╝реА рдХреА рдЧрддрд┐ рд╕рднреА рдХрд╛рд░реНрдб рдбреЗрдЯрд╛ рдХреЛ рдорд┐рдЯрд╛ рджреЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░реНрдб рдЬрдирд░реЗрд╢рди рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред cellTextureData[cell.Index].b = data < 0f ? (byte)0 : (data < 1f ? (byte)(data * 254f) : (byte)254);
рдПрдХ рд╣реА рдирд╛рдо рдФрд░ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ HexCell
ред рдпрд╣ рдЕрдиреБрд░реЛрдз рдХреЛ рдЙрд╕рдХреЗ shader рдбреЗрдЯрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрдЧрд╛ред public void SetMapData (float data) { ShaderData.SetMapData(this, data); }
рдХреЛрдб рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдмрджрд▓реЗрдВ HexMapGenerator.SetTerrainType
рддрд╛рдХрд┐ рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХрд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░реЗред рдЖрдЗрдП 0-1 рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реЗ рдлреНрд▓реЛрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдКрдВрдЪрд╛рдИ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдпрд╣ рд╕реЗрд▓ рдХреА рдКрдБрдЪрд╛рдИ рд╕реЗ рдиреНрдпреВрдирддрдо рдКрдБрдЪрд╛рдИ рдШрдЯрд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдиреНрдпреВрдирддрдо рдКрдБрдЪрд╛рдИ рдШрдЯрд╛рдХрд░ рдиреНрдпреВрдирддрдо рдШрдЯрд╛рдХрд░ред рдЪрд▓реЛ рд╡рд┐рднрд╛рдЬрди рдХреЛ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рдмрдирд╛рддреЗ рд╣реИрдВред void SetTerrainType () { for (int i = 0; i < cellCount; i++) { тАж cell.SetMapData( (cell.Elevation - elevationMinimum) / (float)(elevationMaximum - elevationMinimum) ); } }
рдЕрдм рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░рд╛рд╣рдд рдФрд░ рдЪреЗрдХ рдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдбреЗрдЯрд╛ рдХреЗ рджреГрд╢реНрдп рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рдЬрд╛рдПрдЧрд╛ рджрд┐рдЦрд╛рдПрдБ рдорд╛рдирдЪрд┐рддреНрд░ рдбрд╛рдЯрд╛ рдПрд╕реЗрдЯ рд╕рд╛рдордЧреНрд░реА рднреВ-рднрд╛рдЧ редрдорд╛рдирдЪрд┐рддреНрд░ 1208905299, рд╕рд╛рдорд╛рдиреНрдп рднреВрднрд╛рдЧ рдФрд░ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХрд╛ рджреГрд╢реНрдпредрдЬрд▓рд╡рд╛рдпреБ рдирд┐рд░реНрдорд╛рдг
рдЬрд▓рд╡рд╛рдпреБ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдирдХреНрд╢реЗ рдореЗрдВ рдЕрд╕рддрдд рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдп рдЬрд▓рд╡рд╛рдпреБ рд╣реЛрддреА рд╣реИред ClimateData
рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ ред рдмреЗрд╢рдХ, рдЖрдк рд╕реНрд╡рдпрдВ рдХрдХреНрд╖реЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рддреЗ рд╕рдордп рд╣реА рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рдмрдЪрд╛рдПрдВрдЧреЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ HexMapGenerator
, рдЬреИрд╕реЗ MapRegion
ред рд╣рдо рдХреЗрд╡рд▓ рдЯреНрд░реИрдХрд┐рдВрдЧ рдмрд╛рджрд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рдПрдХ рдлреНрд▓реЛрдЯ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред struct ClimateData { public float clouds; }
рд╕рднреА рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪреА рдЬреЛрдбрд╝реЗрдВред List<ClimateData> climate = new List<ClimateData>();
рдЕрдм рд╣рдореЗрдВ рдЬрд▓рд╡рд╛рдпреБ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЬрд▓рд╡рд╛рдпреБ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдмрд╕ рд╢реВрдиреНрдп рд╣реИ, рдпрд╣ рдПрдХ рдорд╛рдирдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ClimateData
ред void CreateClimate () { climate.Clear(); ClimateData initialData = new ClimateData(); for (int i = 0; i < cellCount; i++) { climate.Add(initialData); } }
рд░рд╛рд╣рдд рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рднреВрдорд┐ рдХрдЯрд╛рд╡ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рдЬрд▓рд╡рд╛рдпреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрд╖рд░рдг рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╣рд╡рд╛ рдФрд░ рдкрд╛рдиреА рдХреА рдЖрд╡рд╛рдЬрд╛рд╣реА рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЬрд▓рд╡рд╛рдпреБ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХрд╛ рдЕрдиреБрдХрд░рдг рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред public void GenerateMap (int x, int z) { тАж CreateRegions(); CreateLand(); ErodeLand(); CreateClimate(); SetTerrainType(); тАж }
рдмрджрд▓реЗрдВ SetTerrainType
рддрд╛рдХрд┐ рд╣рдо рд╕реЗрд▓ рдКрдВрдЪрд╛рдИ рдХреЗ рдмрдЬрд╛рдп рдХреНрд▓рд╛рдЙрдб рдбреЗрдЯрд╛ рджреЗрдЦ рд╕рдХреЗрдВред рд╢реБрд░реВ рдореЗрдВ, рдпрд╣ рдПрдХ рдХрд╛рд▓реЗ рдХрд╛рд░реНрдб рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ред void SetTerrainType () { for (int i = 0; i < cellCount; i++) { тАж cell.SetMapData(climate[i].clouds); } }
рдЬрд▓рд╡рд╛рдпреБ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди
рдЬрд▓рд╡рд╛рдпреБ рдЕрдиреБрдХрд░рдг рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рд╡рд╛рд╖реНрдкреАрдХрд░рдг рд╣реИред рдХрд┐рддрдирд╛ рдкрд╛рдиреА рд╡рд╛рд╖реНрдкрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЖрдЗрдП рд╕реНрд▓рд╛рдЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдорд╛рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВред 0 рдХреЗ рдорд╛рди рдХрд╛ рдЕрд░реНрде рд╣реИ рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдирд╣реАрдВ, 1 - рдЕрдзрд┐рдХрддрдо рд╡рд╛рд╖реНрдкреАрдХрд░рдгред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдо 0.5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред [Range(0f, 1f)] public float evaporation = 0.5f;
рд╡рд╛рд╖реНрдкреАрдХрд░рдг рд╕реНрд▓рд╛рдЗрдбрд░редрдЪрд▓реЛ рдПрдХ рд╕реЗрд▓ рдХреА рдЬрд▓рд╡рд╛рдпреБ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрд▓ рдЗрдВрдбреЗрдХреНрд╕ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрд▓ рдФрд░ рдЗрд╕рдХреЗ рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕реЗрд▓ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдЬрд▓рд╛рд╢рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╖реНрдкрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рддреБрд░рдВрдд рд╡рд╛рд╖реНрдк рдХреЛ рдмрд╛рджрд▓реЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ (рдУрд╕ рдмрд┐рдВрджреБрдУрдВ рдФрд░ рд╕рдВрдХреНрд╖реЗрдкрдг рдХреА рдЕрдирджреЗрдЦреА), рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реАрдзреЗ рд╕реЗрд▓ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реЛ рдЬрд╛рдПрдВ, рддреЛ рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдХреЛ рд╕реВрдЪреА рдореЗрдВ рд╡рд╛рдкрд╕ рдХреЙрдкреА рдХрд░реЗрдВред void EvolveClimate (int cellIndex) { HexCell cell = grid.GetCell(cellIndex); ClimateData cellClimate = climate[cellIndex]; if (cell.IsUnderwater) { cellClimate.clouds += evaporation; } climate[cellIndex] = cellClimate; }
рдкреНрд░рддреНрдпреЗрдХ рдХрдХреНрд╖ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ CreateClimate
ред void CreateClimate () { тАж for (int i = 0; i < cellCount; i++) { EvolveClimate(i); } }
рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдЬрдЯрд┐рд▓ рд╕рд┐рдореБрд▓реЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдИ рдмрд╛рд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЬрд▓рд╡рд╛рдпреБ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ, рдкрд░рд┐рдгрд╛рдо рдЙрддрдирд╛ рд╣реА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЪрд▓реЛ рдмрд╕ рдПрдХ рд╕реНрдерд┐рд░ рдореВрд▓реНрдп рдЪреБрдиреЗрдВред рдореИрдВ 40 рдЪрдХреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред for (int cycle = 0; cycle < 40; cycle++) { for (int i = 0; i < cellCount; i++) { EvolveClimate(i); } }
рдЪреВрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдкрд╛рдиреА рд╕реЗ рдШрд┐рд░реЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдКрдкрд░ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдХрд╛рд▓реА рднреВрдорд┐ рдФрд░ рд╕рдлреЗрдж рдЬрд▓рд╛рд╢рдп рдорд┐рд▓рддреЗ рд╣реИрдВредрдкрд╛рдиреА рдкрд░ рд╡рд╛рд╖реНрдкреАрдХрд░рдгредрдмрд╛рджрд▓ рдЫрдВрдЯрдирд╛
рдмрд╛рджрд▓ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрд╛рдиреА рд╡рд╛рд╖реНрдкрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рджрдмрд╛рд╡ рдЕрдВрддрд░ рд╣рд╡рд╛ рдХреЛ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╣рд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреБрдж рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрд╛рджрд▓реЛрдВ рдХреЛ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИредрдпрджрд┐ рдХреЛрдИ рдкреНрд░рдореБрдЦ рд╣рд╡рд╛ рдХреА рджрд┐рд╢рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдФрд╕рддрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмрд╛рджрд▓ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдлреИрд▓ рдЬрд╛рдПрдВрдЧреЗ, рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рдЕрдЧрд▓реЗ рдЪрдХреНрд░ рдореЗрдВ рдирдП рдмрд╛рджрд▓ рдмрдирд╛рддреЗ рд╕рдордп, рд╕реЗрд▓ рдХреЗ рд╕рднреА рдмрд╛рджрд▓реЛрдВ рдХреЛ рдЙрд╕рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкрдбрд╝реЛрд╕реА рд╕реЗрд▓ рдмрд╛рджрд▓реЛрдВ рд╕реЗ рдПрдХ рдЫрдард╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╢реВрдиреНрдп рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдХрдореА рд╣реЛрддреА рд╣реИред if (cell.IsUnderwater) { cellClimate.clouds += evaporation; } float cloudDispersal = cellClimate.clouds * (1f / 6f); cellClimate.clouds = 0f; climate[cellIndex] = cellClimate;
рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рджрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдирдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд▓реВрдк рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрдирдХрд╛ рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдмрд╛рджрд▓реЛрдВ рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рдореЗрдВ рд╡рд╛рдкрд╕ рдХреЙрдкреА рдХрд░реЗрдВред float cloudDispersal = cellClimate.clouds * (1f / 6f); for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = cell.GetNeighbor(d); if (!neighbor) { continue; } ClimateData neighborClimate = climate[neighbor.Index]; neighborClimate.clouds += cloudDispersal; climate[neighbor.Index] = neighborClimate; } cellClimate.clouds = 0f;
рдмрд┐рдЦрд░реЗ рд╣реБрдП рдмрд╛рджрд▓редрдпрд╣ рд▓рдЧрднрдЧ рд╕рдлреЗрдж рдирдХреНрд╢рд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдкрд░, рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдЬрд▓рд╡рд╛рдпреБ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рджрд▓ рдЬреЛрдбрд╝рддреА рд╣реИрдВред рдкрд╣рд▓реЗ рдЪрдХреНрд░ рдХреЗ рдмрд╛рдж, рдкрд╛рдиреА рдХреЗ рдмрдЧрд▓ рдХреА рднреВрдорд┐ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рднреА рдмрд╛рджрд▓ рд╣реЛрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ рдлреИрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдм рддрдХ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдирдЪрд┐рддреНрд░ рдмрд╛рджрд▓реЛрдВ рдореЗрдВ рдХрд╡рд░ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рдирдЪрд┐рддреНрд░ 1208905299 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреВрд░реНрд╡реЛрддреНрддрд░ рдореЗрдВ рднреВрдорд┐ рдХреЗ рдмрдбрд╝реЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХрд╛ рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреБрд▓рд╛ рд░рд╣ рдЧрдпрд╛редрдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рддрд╛рд▓рд╛рдм рдЕрдирдВрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╛рджрд▓ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд▓ рд╕реНрддрд░ рдЬрд▓рд╡рд╛рдпреБ рдЕрдиреБрдХрд░рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрд▓рд╛рд╢рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдХреА рджрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╛рдиреА рдЙрдирдореЗрдВ рд╡рд╛рдкрд╕ рдмрд╣рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдЖрдВрд╢рд┐рдХ рдЬрд▓ рдЪрдХреНрд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рд┐рдореБрд▓реЗрд╢рди рдореЗрдВ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рдкрд╛рдиреА рдЬрд▓рд╡рд╛рдпреБ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рддрдХ, рдкрд╛рдиреА рдХрд╛ рдиреБрдХрд╕рд╛рди рдХреЗрд╡рд▓ рдирдХреНрд╢реЗ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдмрд┐рдЦрд░реЗ рд╣реБрдП рдмрд╛рджрд▓ рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВредрдЖрдк рдкрд╛рдиреА рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢реАрд░реНрд╖ рджрд╛рдИрдВ рдУрд░ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВред рдЕрдВрддрд┐рдо рд╕реЗрд▓ рдореЗрдВ рдмрд╛рджрд▓ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдЦрд┐рд░реА рд░рд╣рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЬрд▓рд╡рд╛рдпреБ рдмрдирддреА рд╣реИред рдЙрд╕реЗ рдЕрднреА рддрдХ рдХрд┐рд╕реА рдкрдбрд╝реЛрд╕реА рд╕реЗ рдмрд╛рджрд▓ рдирд╣реАрдВ рдорд┐рд▓реЗ рд╣реИрдВредрдХреНрдпрд╛ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЬрд▓рд╡рд╛рдпреБ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?, . - , . 40 . - , .
рддреЗрдЬрд╝реА
рдкрд╛рдиреА рд╣рдореЗрд╢рд╛ рдардВрдбрд╛ рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЬрдореАрди рдкрд░ рдЧрд┐рд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдмрд╛рд░рд┐рд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдмрд░реНрдл, рдУрд▓реЗ рдпрд╛ рдЧреАрд▓реА рдмрд░реНрдл рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдЖрдорддреМрд░ рдкрд░ рд╡рд░реНрд╖рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЙрдб рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреА рдорд╛рддреНрд░рд╛ рдФрд░ рджрд░ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдХрд╕реНрдЯрдо рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд░реНрд╖рд╛ рджрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред 0 рдХреЗ рдорд╛рди рдХрд╛ рдЕрд░реНрде рд╣реИ рдХреЛрдИ рд╡рд░реНрд╖рд╛ рдирд╣реАрдВ, 1 рдХреЗ рдорд╛рди рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рднреА рдмрд╛рджрд▓ рддреБрд░рдВрдд рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 0.25 рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдореЗрдВ рдПрдХ рдЪреМрдерд╛рдИ рдмрд╛рджрд▓ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред [Range(0f, 1f)] public float precipitationFactor = 0.25f;
рдЧреБрдгрд╛рдВрдХ рд╕реНрд▓рд╛рдЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредрд╣рдо рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдФрд░ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдмрд┐рдЦрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд░реНрд╖рд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЬрд▓рд╛рд╢рдпреЛрдВ рд╕реЗ рд╡рд╛рд╖реНрдкрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд╛рдиреА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рддреБрд░рдВрдд рдЙрдкрдЬреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлреИрд▓рдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рджрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рднреВрдорд┐ рдкрд░, рдмрд╛рджрд▓реЛрдВ рдХреЗ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╡рд░реНрд╖рд╛ рд╣реЛрдЧреАред if (cell.IsUnderwater) { cellClimate.clouds += evaporation; } float precipitation = cellClimate.clouds * precipitationFactor; cellClimate.clouds -= precipitation; float cloudDispersal = cellClimate.clouds * (1f / 6f);
рдЧрд╛рдпрдм рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рджрд▓редрдЕрдм, рдЬрдм рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдореЗрдВ 25% рдмрд╛рджрд▓ рдирд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреВрдорд┐ рдлрд┐рд░ рд╕реЗ рд▓рдЧрднрдЧ рдХрд╛рд▓реА рд╣реЛ рдЬрд╛рддреА рд╣реИред рдмрд╛рджрд▓ рдХреЗрд╡рд▓ рдХреБрдЫ рдХрджрдореЛрдВ рдХреЗ рднреАрддрд░ рдЕрдВрддрд░реНрджреЗрд╢реАрдп рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡реЗ рдЕрджреГрд╢реНрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВредunitypackageрдирдореА
рдпрджреНрдпрдкрд┐ рд╡рд░реНрд╖рд╛ рдмрд╛рджрд▓реЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЬрд▓рд╡рд╛рдпреБ рд╕реЗ рдкрд╛рдиреА рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдореАрди рдкрд░ рдЧрд┐рд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд╛рдиреА рдмрдЪ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВред рдпрд╣ рдХрдИ рд░реВрдкреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдирдореА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗредрдЖрд░реНрджреНрд░рддрд╛ рдЯреНрд░реИрдХрд┐рдВрдЧ
рд╣рдо рджреЛ рдЬрд▓ рд╕реНрдерд┐рддрд┐рдпреЛрдВ: рдмрд╛рджрд▓реЛрдВ рдФрд░ рдЖрд░реНрджреНрд░рддрд╛ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдХрд░ рдЬрд▓рд╡рд╛рдпреБ рдореЙрдбрд▓ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ClimateData
рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ moisture
ред struct ClimateData { public float clouds, moisture; }
рдЗрд╕рдХреЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░реВрдк рдореЗрдВ, рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдирдореА рдХреЛ рдмрд╛рджрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╣рдорд╛рд░реЗ рд╕рд░рд▓ рдЬрд▓рд╡рд╛рдпреБ рдореЙрдбрд▓ рдореЗрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдПрдХ рд╕реНрдерд┐рд░ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреНрдп рдХрд╛рд░рдХред рдЗрд╕рд▓рд┐рдП, refactor- рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ evaporation
рдореЗрдВ evaporationFactor
ред [Range(0f, 1f)] public float evaporationFactor = 0.5f;
рдЬрдм рд╕реЗрд▓ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдмрд╕ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрд░реНрджреНрд░рддрд╛ рдХрд╛ рд╕реНрддрд░ 1. рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд╛рд╖реНрдкреАрдХрд░рдг рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдЧреБрдгрд╛рдВрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рд╕реБрд╢реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рд╡рд╛рд╖реНрдкреАрдХрд░рдг рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ, рдЗрд╕реЗ рдирдореА рд╕реЗ рдШрдЯрд╛рдирд╛ рдФрд░ рдмрд╛рджрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрд░реНрджреНрд░рддрд╛ рдореЗрдВ рд╡рд░реНрд╖рд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред if (cell.IsUnderwater) { cellClimate.moisture = 1f; cellClimate.clouds += evaporationFactor; } else { float evaporation = cellClimate.moisture * evaporationFactor; cellClimate.moisture -= evaporation; cellClimate.clouds += evaporation; } float precipitation = cellClimate.clouds * precipitationFactor; cellClimate.clouds -= precipitation; cellClimate.moisture += precipitation;
рдЪреВрдБрдХрд┐ рдмрд╛рджрд▓реЛрдВ рдХреЛ рдЕрдм рдЬрдореАрди рдХреЗ рдКрдкрд░ рд╕реЗ рд╡рд╛рд╖реНрдкреАрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЖрдЧреЗ рдЕрдВрддрд░реНрджреЗрд╢реАрдп рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдЬрдореАрди рдХрд╛ рдереЛрдХ рднреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИредрдЖрд░реНрджреНрд░рддрд╛ рдХреЗ рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдмрд╛рджрд▓редрдЖрдЗрдП рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ SetTerrainType
рддрд╛рдХрд┐ рдпрд╣ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЖрд░реНрджреНрд░рддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд╛рд╣рдд рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред cell.SetMapData(climate[i].moisture);
рдЖрд░реНрджреНрд░рддрд╛ рдкреНрд░рджрд░реНрд╢рдиредрдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрд░реНрджреНрд░рддрд╛ рдмрд╛рджрд▓реЛрдВ рдХреЗ рд╕рдорд╛рди рд╕реБрдВрджрд░ рджрд┐рдЦрддреА рд╣реИ (рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕рднреА рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╕рдлреЗрдж рд╣реИрдВ), рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд▓реНрдж рд╣реА рдмрджрд▓ рдЬрд╛рдПрдЧрд╛редрд╡рд░реНрд╖рд╛ рдЕрдкрд╡рд╛рд╣
рд╡рд╛рд╖реНрдкреАрдХрд░рдг рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирдореА рдХреЛрд╢рд┐рдХрд╛ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреА рд╣реИред рдкрд╛рдиреА рдХрд╛ рдЪрдХреНрд░ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рднреВрдорд┐ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдирдореА рдХрд╛ рдереЛрдХ рдкрд╛рдиреА рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХреЗ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рднреВрдорд┐ рдкрд░ рдкрд╛рдиреА рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╣реИред рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирджрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдПрдХ рдХрд╕реНрдЯрдо рд╡рд░реНрд╖рд╛ рдЕрдкрд╡рд╛рд╣ рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдирд┐рдЪрд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдкрд╛рдиреА рдХреА рдирд┐рдХрд╛рд╕реА рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред рдЪрд▓реЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдЯреЙрдХ 25% рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред [Range(0f, 1f)] public float runoffFactor = 0.25f;
рдирд╛рд▓реА рдХрд╛ рд╕реНрд▓рд╛рдЗрдбрд░редрд╣рдо рдирджрд┐рдпрд╛рдВ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ?.
рдЬрд▓ рдЕрдкрд╡рд╛рд╣ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдкреНрд░рдХреАрд░реНрдгрди рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреАрди рдЕрдВрддрд░реЛрдВ рдХреЗ рд╕рд╛рдеред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реЗрд▓ рд╕реЗ рд╕рднреА рдирдореА рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдпрд╣ рдирдореА рдХреЛ рд╡рд╣рди рдХрд░рддрд╛ рд╣реИ, рдмрд╛рджрд▓реЛрдВ рдХреЛ рдирд╣реАрдВред рддреАрд╕рд░рд╛, рдпрд╣ рдиреАрдЪреЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдХреЗрд╡рд▓ рдХрдо рдКрдВрдЪрд╛рдИ рд╡рд╛рд▓реЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдПред рдЕрдкрд╡рд╛рд╣ рдЧреБрдгрд╛рдВрдХ рдирдореА рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реЗрд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдЧрд╛ рдпрджрд┐ рд╕рднреА рдкрдбрд╝реЛрд╕реА рдХрдо рдереЗ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рд╡реЗ рдХрдо рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рд╕реЗрд▓ рдЖрд░реНрджреНрд░рддрд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрдВрдЧреЗ рдЬрдм рд╣рдо рдиреАрдЪреЗ рдПрдХ рдкрдбрд╝реЛрд╕реА рдХреЛ рдвреВрдВрдвреЗрдВрдЧреЗред float cloudDispersal = cellClimate.clouds * (1f / 6f); float runoff = cellClimate.moisture * runoffFactor * (1f / 6f); for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = cell.GetNeighbor(d); if (!neighbor) { continue; } ClimateData neighborClimate = climate[neighbor.Index]; neighborClimate.clouds += cloudDispersal; int elevationDelta = neighbor.Elevation - cell.Elevation; if (elevationDelta < 0) { cellClimate.moisture -= runoff; neighborClimate.moisture += runoff; } climate[neighbor.Index] = neighborClimate; }
рдХрдо рдКрдВрдЪрд╛рдИ рддрдХ рдкрд╛рдиреА рдХреА рдирд┐рдХрд╛рд╕реАредрдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирдореА рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд┐рдз рд╡рд┐рддрд░рдг рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдЪреНрдЪ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдЕрдкрдиреА рдирдореА рдХреЛ рдирд┐рдЪрд▓реЗ рддрдХ рдкрд╣реБрдВрдЪрд╛рддреА рд╣реИрдВред рд╣рдо рддрдЯреАрдп рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдирдореА рджреЗрдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдирдореА рдХреЛ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдмрд╣рд╛ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрдордЬреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рднреА рдкрд╛рдиреА рдХреЗ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕реЗрд▓ рдХрдо рд╣реИ, рдпрд╛рдиреА рд╕реНрдкрд╖реНрдЯ рдКрдВрдЪрд╛рдИ рд▓реЗрдВред int elevationDelta = neighbor.ViewElevation - cell.ViewElevation;
рджреГрд╢реНрдпрдорд╛рди рдКрдВрдЪрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредрдЯрдкрдХрд╛
рдкрд╛рдиреА рди рдХреЗрд╡рд▓ рдиреАрдЪреЗ рдмрд╣рддрд╛ рд╣реИ, рдпрд╣ рдлреИрд▓рддрд╛ рд╣реИ, рд╕реНрддрд░ рд╕реНрдерд▓рд╛рдХреГрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рд╕рддрд╛ рд╣реИ, рдФрд░ рдЬрд▓ рдирд┐рдХрд╛рдпреЛрдВ рд╕реЗ рд╕рдЯреЗ рднреВрдорд┐ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд╢реЛрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдереЛрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирдореА рдХреЗ рд╡рд┐рддрд░рдг рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рд┐рдореБрд▓реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЖрдЗрдП, рдЙрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 0.125 рд╕реЗ рдХрд╕реНрдЯрдо рдЧреБрдгрд╛рдВрдХ рдмрдирд╛рдПрдВред [Range(0f, 1f)] public float seepageFactor = 0.125f;
рд░рд┐рд╕рд╛рд╡ рд╕реНрд▓рд╛рдЗрдбрд░редрд╕реАрдкреЗрдЬ рдПрдХ рдирд╛рд▓реА рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкрдбрд╝реЛрд╕реА рдХреА рд╕реЗрд▓ рдХреЗ рд╕рдорд╛рди рд╣реА рджреГрд╢реНрдпрдорд╛рди рдКрдВрдЪрд╛рдИ рд╣реЛрддреА рд╣реИред float runoff = cellClimate.moisture * runoffFactor * (1f / 6f); float seepage = cellClimate.moisture * seepageFactor * (1f / 6f); for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { тАж int elevationDelta = neighbor.ViewElevation - cell.ViewElevation; if (elevationDelta < 0) { cellClimate.moisture -= runoff; neighborClimate.moisture += runoff; } else if (elevationDelta == 0) { cellClimate.moisture -= seepage; neighborClimate.moisture += seepage; } climate[neighbor.Index] = neighborClimate; }
рдереЛрдбрд╝рд╛ рд░рд┐рд╕рд╛рд╡ рдЬреЛрдбрд╝рд╛редunitypackageрдмрд╛рд░рд┐рд╢ рдХрд╛ рд╕рд╛рдпрд╛
рдпрджреНрдпрдкрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЬрд▓ рдЪрдХреНрд░ рдХрд╛ рдПрдХ рдпреЛрдЧреНрдп рдЕрдиреБрдХрд░рдг рдмрдирд╛ рд▓рд┐рдпрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд░реНрд╖рд╛ рдЫрд╛рдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд▓рд╡рд╛рдпреБ рдЕрдВрддрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрд╖рд╛ рдЫрд╛рдпрд╛ рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдкрдбрд╝реЛрд╕реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд░реНрд╖рд╛ рдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрднрд╛рд╡ рд╣реИред рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░ рдореМрдЬреВрдж рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд╛рдбрд╝ рдмрд╛рджрд▓реЛрдВ рдХреЛ рдЙрди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдкрд╣рд╛рдбрд╝реЛрдВ рдФрд░ рдПрдХ рдкреНрд░рдореБрдЦ рд╣рд╡рд╛ рдХреА рджрд┐рд╢рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИредрд╣рд╡рд╛
рдЖрдЗрдП рдЕрдиреБрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдореБрдЦ рд╣рд╡рд╛ рдХреА рджрд┐рд╢рд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреГрдереНрд╡реА рдХреА рд╕рддрд╣ рдкрд░ рд╣рд╡рд╛ рдХреА рджрд┐рд╢рд╛рдПрдБ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реИрдВ, рд╣рдо рдПрдХ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╡реИрд╢реНрд╡рд┐рдХ рд╣рд╡рд╛ рджрд┐рд╢рд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВрдЧреЗред рдЪрд▓реЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрддрд░ рдкрд╢реНрдЪрд┐рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд▓реЛ 4 рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде 1 рд╕реЗ 10 рддрдХ рдкрд╡рди рдмрд▓ рдХреЛ рд╕рдорд╛рдпреЛрдЬреНрдп рдмрдирд╛рддреЗ рд╣реИрдВред public HexDirection windDirection = HexDirection.NW; [Range(1f, 10f)] public float windStrength = 4f;
рд╣рд╡рд╛ рдХреА рджрд┐рд╢рд╛ рдФрд░ рд╢рдХреНрддрд┐редрдмрд╛рджрд▓реЛрдВ рдХреЗ рдХреБрд▓ рдлреИрд▓рд╛рд╡ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рдореБрдЦ рд╣рд╡рд╛ рдХреА рддрд╛рдХрдд рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╣рд╡рд╛ рдХрд╛ рдмрд▓ 1 рд╣реИ, рддреЛ рдмрд┐рдЦрд░рдирд╛ рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реИред рдЬрдм рдпрд╣ 2 рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдмрд┐рдЦрд░рдирд╛ рд╣рд╡рд╛ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЕрдиреНрдп рджрд┐рд╢рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛ рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рд╣рдо рдХреНрд▓рд╛рдЙрдб рд╕реНрдХреИрдЯрд░ рдлреЙрд░реНрдореВрд▓реЗ рдореЗрдВ рд╡рд┐рднрд╛рдЬрдХ рдХреЛ рдмрджрд▓рдХрд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЫрд╣ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдкрд╛рдВрдЪ рдкреНрд▓рд╕ рдкрд╡рди рдКрд░реНрдЬрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред float cloudDispersal = cellClimate.clouds * (1f / (5f + windStrength));
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд╡рд╛ рдХреА рджрд┐рд╢рд╛ рдЙрд╕ рджрд┐рд╢рд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рд╡рд╛ рдЪрд▓рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд┐рдЦрд░рдиреЗ рдХреА рдореБрдЦреНрдп рджрд┐рд╢рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред HexDirection mainDispersalDirection = windDirection.Opposite(); float cloudDispersal = cellClimate.clouds * (1f / (5f + windStrength));
рдЕрдм рд╣рдо рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрдбрд╝реЛрд╕реА рдмрд┐рдЦрд░рдиреЗ рдХреА рдореБрдЦреНрдп рджрд┐рд╢рд╛ рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╣рд╡рд╛ рдХреЗ рдмрд▓ рд╕реЗ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдкреНрд░рдХреАрд░реНрдгрди рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред ClimateData neighborClimate = climate[neighbor.Index]; if (d == mainDispersalDirection) { neighborClimate.clouds += cloudDispersal * windStrength; } else { neighborClimate.clouds += cloudDispersal; }
рдЙрддреНрддрд░рдкрд╢реНрдЪрд┐рдо рдХреА рд╣рд╡рд╛, рдмрд▓ 4.рднреВрдорд┐ рдХреЗ рдКрдкрд░ рдирдореА рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рд╣рд╡рд╛ рджрд┐рд╢рд╛рддреНрдордХрддрд╛ рдЬреЛрдбрд╝рддреА рд╣реИред рд╣рд╡рд╛ рдЬрд┐рддрдиреА рдордЬрдмреВрдд рд╣реЛрдЧреА, рдЙрддрдирд╛ рд╣реА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рднрд╛рд╡ рдмрдиреЗрдЧрд╛редрдкреВрд░реНрдг рдКрдВрдЪрд╛рдИ
рд╡рд░реНрд╖рд╛ рдЫрд╛рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рджреВрд╕рд░рд╛ рдШрдЯрдХ рдкрд╣рд╛рдбрд╝ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдЦреНрдд рд╡рд░реНрдЧреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд╣рд╛рдбрд╝ рдХреНрдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдкреНрд░рдХреГрддрд┐ рдХреЗ рдкрд╛рд╕ рднреА рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рдкреВрд░реНрдг рдКрдВрдЪрд╛рдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрдм рд╣рд╡рд╛ рдкрд╣рд╛рдбрд╝ рдкрд░ рдЪрд▓рддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдКрдкрд░ рдЙрдардиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдардВрдбрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдо рдкрд╛рдиреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкрд╣рд╛рдбрд╝ рдкрд░ рд╣рд╡рд╛ рдЧреБрдЬрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд░реНрд╖рд╛ рд╣реЛрддреА рд╣реИред рдирддреАрдЬрддрди, рджреВрд╕рд░реА рддрд░рдл рд╣рдореЗрдВ рд╢реБрд╖реНрдХ рд╣рд╡рд╛ рдорд┐рд▓рддреА рд╣реИ, рдпрд╛рдиреА рдмрд╛рд░рд┐рд╢ рдХреА рдЫрд╛рдпрд╛редрд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рд╡рд╛ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рдмрдврд╝реЗрдЧреА, рдЙрддрдирд╛ рд╣реА рдХрдо рдкрд╛рдиреА рдЙрд╕рдореЗрдВ рд╕рдорд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд╕рд┐рдореБрд▓реЗрд╢рди рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдХреНрд▓рд╛рдЙрдб рдорд╛рди рдХреЗ рдПрдХ рдордЬрдмреВрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╕реЗрд▓ рдХреА рдКрдБрдЪрд╛рдИ, рдпрд╣ рдЕрдзрд┐рдХрддрдо рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдЕрдзрд┐рдХрддрдо 1 рд╢реВрдиреНрдп рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдКрдВрдЪрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЪрд▓реЛ рдЕрдзрд┐рдХрддрдо рдорд╛рдЗрдирд╕ 1 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЕрднреА рднреА рдЙрдЪреНрдЪрддрдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╣рдо рд╡рд░реНрд╖рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рдмрд┐рдЦрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдЕрдзрд┐рдХрддрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред float precipitation = cellClimate.clouds * precipitationFactor; cellClimate.clouds -= precipitation; cellClimate.moisture += precipitation; float cloudMaximum = 1f - cell.ViewElevation / (elevationMaximum + 1f); HexDirection mainDispersalDirection = windDirection.Opposite();
рдпрджрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рджрд▓ рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рджрд▓реЛрдВ рдХреЛ рдЖрд░реНрджреНрд░рддрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрд╖рд╛ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд╣рд╛рдбрд╝реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред float cloudMaximum = 1f - cell.ViewElevation / (elevationMaximum + 1f); if (cellClimate.clouds > cloudMaximum) { cellClimate.moisture += cellClimate.clouds - cloudMaximum; cellClimate.clouds = cloudMaximum; }
рдЕрдзрд┐рдХ рдКрдБрдЪрд╛рдИ рдХреЗ рдХрд╛рд░рдг рд╡рд░реНрд╖рд╛ рдЫрд╛рдпрд╛редunitypackageрд╣рдо рдЕрдиреБрдХрд░рдг рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд▓ рдЪрдХреНрд░ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓рд╛ рдЖрдВрд╢рд┐рдХ рд╕рд┐рдореБрд▓реЗрд╢рди рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХреНрд░рдо рдореЗрдВ рд░рдЦреЗрдВ, рдФрд░ рдлрд┐рд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд░рд╛рд╣рдд рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВредрд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ
рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдмрдирддреА рд╣реИрдВ, рд╡рд╣ рд╕рд┐рдореБрд▓реЗрд╢рди рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╣рдо рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЧрдарди рдХреА рд╡рд░реНрддрдорд╛рди рдЕрд╡рд╕реНрдерд╛ рдХреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЬрд▓рд╡рд╛рдпреБ рдХреА рджреВрд╕рд░реА рд╕реВрдЪреА рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ nextClimate
ред List<ClimateData> climate = new List<ClimateData>(); List<ClimateData> nextClimate = new List<ClimateData>();
рдЗрд╕ рд╕реВрдЪреА рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ рдФрд░ рдЖрд░рдВрдн рдХрд░реЗрдВ, рдЬреИрд╕реЗ рд╣рд░ рдХреЛрдИред рдлрд┐рд░ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдкрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд┐рдореБрд▓реЗрд╢рди рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдФрд░ рдЕрдЧрд▓реЗ рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред void CreateClimate () { climate.Clear(); nextClimate.Clear(); ClimateData initialData = new ClimateData(); for (int i = 0; i < cellCount; i++) { climate.Add(initialData); nextClimate.Add(initialData); } for (int cycle = 0; cycle < 40; cycle++) { for (int i = 0; i < cellCount; i++) { EvolveClimate(i); } List<ClimateData> swap = climate; climate = nextClimate; nextClimate = swap; } }
рдЬрдм рдХреЛрдИ рд╕реЗрд▓ рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕реА рдХреА рдЬрд▓рд╡рд╛рдпреБ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рди рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХреЛред for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = cell.GetNeighbor(d); if (!neighbor) { continue; } ClimateData neighborClimate = nextClimate[neighbor.Index]; тАж nextClimate[neighbor.Index] = neighborClimate; }
рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЬрд▓рд╡рд╛рдпреБ рд╕реВрдЪреА рдореЗрдВ рд╡рд╛рдкрд╕ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд▓рд╡рд╛рдпреБ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд░реНрддрдорд╛рди рдЖрд░реНрджреНрд░рддрд╛ рдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдЧрд▓реА рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╡рд░реНрддрдорд╛рди рд╕реВрдЪреА рдореЗрдВ рдбреЗрдЯрд╛ рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдЕрдЧрд▓реЗ рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рд╣реЛред
рдЬрдм рд╣рдо рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдирдореА рдХрд╛ рд╕реНрддрд░ рдЕрдзрд┐рдХрддрдо 1 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рднреВрдорд┐ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдЧреАрд▓реА рди рд╣реЛ рд╕рдХреЗрдВред nextCellClimate.moisture += cellClimate.moisture; if (nextCellClimate.moisture > 1f) { nextCellClimate.moisture = 1f; } nextClimate[cellIndex] = nextCellClimate;
рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧредрдореВрд▓ рдЖрд░реНрджреНрд░рддрд╛
рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рд╕рд┐рдореБрд▓реЗрд╢рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢реБрд╖реНрдХ рднреВрдорд┐ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛, рдЦрд╛рд╕рдХрд░ рднреВрдорд┐ рдХреЗ рдЙрдЪреНрдЪ рдкреНрд░рддрд┐рд╢рдд рдХреЗ рд╕рд╛рдеред рддрд╕реНрд╡реАрд░ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо 0.1 рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд░реНрджреНрд░рддрд╛ рд╕реНрддрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред [Range(0f, 1f)] public float startingMoisture = 0.1f;
рдКрдкрд░ рдореВрд▓ рдЖрд░реНрджреНрд░рддрд╛ рдХрд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рд╣реИредрд╣рдо рдЗрд╕ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЬрд▓рд╡рд╛рдпреБ рд╕реВрдЪреА рдХреА рдЖрд░реНрджреНрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред ClimateData initialData = new ClimateData(); initialData.moisture = startingMoisture; ClimateData clearData = new ClimateData(); for (int i = 0; i < cellCount; i++) { climate.Add(initialData); nextClimate.Add(clearData); }
рдореВрд▓ рдЖрд░реНрджреНрд░рддрд╛ рдХреЗ рд╕рд╛рдередрдмрд╛рдпреЛрдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛
рд╣рдо рд╕реЗрд▓ рд░рд╛рд╣рдд рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдВрдЪрд╛рдИ рдХреЗ рдмрдЬрд╛рдп рдЖрд░реНрджреНрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╢реБрд╖реНрдХ рднреВрдорд┐ рдХреЗ рд▓рд┐рдП рдмрд░реНрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд╢реБрд╖реНрдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдмрд░реНрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкрд░реНрдпрд╛рдкреНрдд рдирдореА рдХреЗ рд▓рд┐рдП рдкрддреНрдерд░, рдШрд╛рд╕ рдФрд░ рдкрд╛рдиреА-рд╕рдВрддреГрдкреНрдд рдФрд░ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреВрдорд┐ рд╣реИред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ 0.2 рдХреЗ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдореЗрдВ рдкрд╛рдВрдЪ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред void SetTerrainType () { for (int i = 0; i < cellCount; i++) { HexCell cell = grid.GetCell(i); float moisture = climate[i].moisture; if (!cell.IsUnderwater) { if (moisture < 0.2f) { cell.TerrainTypeIndex = 4; } else if (moisture < 0.4f) { cell.TerrainTypeIndex = 0; } else if (moisture < 0.6f) { cell.TerrainTypeIndex = 3; } else if (moisture < 0.8f) { cell.TerrainTypeIndex = 1; } else { cell.TerrainTypeIndex = 2; } } else { cell.TerrainTypeIndex = 2; } cell.SetMapData(moisture); } }
рдмрд╛рдпреЛрдоредрд╕рдорд╛рди рд╡рд┐рддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рджрд┐рдЦрддрд╛ рд╣реИред рдЕрдиреНрдп рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 0.05, 0.12, 0.28 рдФрд░ 0.85ред if (moisture < 0.05f) { cell.TerrainTypeIndex = 4; } else if (moisture < 0.12f) { cell.TerrainTypeIndex = 0; } else if (moisture < 0.28f) { cell.TerrainTypeIndex = 3; } else if (moisture < 0.85f) { cell.TerrainTypeIndex = 1; }
рд╕рдВрд╢реЛрдзрд┐рдд рдмрд╛рдпреЛрдоредunitypackageрднрд╛рдЧ 26: рдмрд╛рдпреЛрдо рдФрд░ рдирджрд┐рдпрд╛рдБ
- рд╣рдо рдирдореА рдХреЗ рд╕рд╛рде рдЙрдЪреНрдЪ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдирджрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред
- рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддрд╛рдкрдорд╛рди рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
- рд╣рдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдпреЛрдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВред
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдирджрд┐рдпреЛрдВ рдФрд░ рддрд╛рдкрдорд╛рди рдХреЗ рд╕рд╛рде рдЬрд▓ рдЪрдХреНрд░ рдХреЛ рдкреВрд░рдХ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдпреЛрдо рднреА рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВрдЧреЗредрдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдПрдХрддрд╛ 2017.3.0p3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛редрдЧрд░реНрдореА рдФрд░ рдкрд╛рдиреА рдиреЗ рдирдХреНрд╢реЗ рдХреЛ рдЬреАрд╡рдВрдд рдХрд░ рджрд┐рдпрд╛редрдирджреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг
рдирджрд┐рдпрд╛рдБ рдЬрд▓ рдЪрдХреНрд░ рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ рдЪреИрдирд▓ рдХрдЯрд╛рд╡ рдХреА рдорджрдж рд╕реЗ рдЕрдкрд╡рд╛рд╣ рдлрд╛рдбрд╝рдХрд░ рдмрдирддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдЖрдк рд╕реЗрд▓ рдирд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирджрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирджрд┐рдпреЛрдВ рдХреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рдорд┐рд▓реЗрдЧрд╛ред рдЬрдм рд╣рдо рдирджреА рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдХрдИ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдВрднрд╡ рд╣реЛ, рдмрд╣рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдкрд╛рдиреА рдХреЗ рдЪрдХреНрд░ рдХреЗ рд╣рдорд╛рд░реЗ рдЕрдиреБрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдирдХреНрд╢реЗ рдкрд░ рдирджрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рдЖрдорддреМрд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИредрдЪреВрдВрдХрд┐ рдирджрд┐рдпрд╛рдВ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗред рд╣рдо рдирджрд┐рдпреЛрдВ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓ рдЪрдХреНрд░ рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирджрд┐рдпреЛрдВ, рдмрджрд▓реЗ рдореЗрдВ, рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗредрдирджреА рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рдХрднреА-рдХрднреА рдЧрд▓рдд рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ?TriangulateWaterShore
, . , . , , . , . , , . (┬л┬╗).
void TriangulateWaterShore ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { тАж if (cell.HasRiverThroughEdge(direction)) { TriangulateEstuary( e1, e2, cell.HasIncomingRiver && cell.IncomingRiver == direction, indices ); } тАж }
рдЙрдЪреНрдЪ рдЖрд░реНрджреНрд░рддрд╛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ
рд╣рдорд╛рд░реЗ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдкрд░, рдПрдХ рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдирджреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рд╢рд╛рдЦрд╛ рдпрд╛ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирджрд┐рдпрд╛рдБ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реА рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд╕рд╛рде рдЪрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХреЗрд╡рд▓ рдмрдбрд╝реА рдирджрд┐рдпрд╛рдБ рдмрдирд╛рддреА рд╣реИрдВред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╣рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдирджреА рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИредрдЪреВрдВрдХрд┐ рдирджрд┐рдпреЛрдВ рдХреЛ рдкрд╛рдиреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирджреА рдХрд╛ рд╕реНрд░реЛрдд рдЙрдЪреНрдЪ рдЖрд░реНрджреНрд░рддрд╛ рд╡рд╛рд▓реЗ рд╕реЗрд▓ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдирджрд┐рдпрд╛рдБ рдврд▓рд╛рди рд╕реЗ рдиреАрдЪреЗ рдмрд╣рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╕реНрд░реЛрдд рдХреА рдКрдБрдЪрд╛рдИ рдХрдо рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЬрд▓ рд╕реНрддрд░ рд╕реЗ рдКрдкрд░ рд╕реЗрд▓ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИ, рдЙрддрдирд╛ рд╣реА рдмреЗрд╣рддрд░ рдЙрдореНрдореАрджрд╡рд╛рд░ рдирджреА рдХреЗ рд╕реНрд░реЛрдд рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИ рд╕реЗ рд╕реЗрд▓ рдКрдВрдЪрд╛рдИ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рд╣рдо рдЗрд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЬрд▓ рд╕реНрддрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рд╣реЛ, рд╣рдо рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛрдиреЛрдВ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рд╕реЗ рдШрдЯрд╛рдПрдВрдЧреЗред void SetTerrainType () { for (int i = 0; i < cellCount; i++) { тАж float data = (float)(cell.Elevation - waterLevel) / (elevationMaximum - waterLevel); cell.SetMapData(data); } }
рдЖрд░реНрджреНрд░рддрд╛ рдФрд░ рдКрдВрдЪрд╛рдИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдмрдбрд╝рд╛ рдирдХреНрд╢рд╛ рд╕рдВрдЦреНрдпрд╛ 1208905299редрд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╡реЗ рдХреЛрд╢рд┐рдХрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЙрдЪреНрдЪ рдЖрд░реНрджреНрд░рддрд╛ рдФрд░ рдКрдБрдЪрд╛рдИ рджреЛрдиреЛрдВ рд╣реЛрддреА рд╣реИрдВред рд╣рдо рдЗрди рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рдирджрд┐рдпреЛрдВ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд┐рдЯрдиреЗрд╕ рдпрд╛ рд╡рдЬрди рдХрд╛ рдореВрд▓реНрдп рд╣реЛрдЧрд╛ред float data = moisture * (cell.Elevation - waterLevel) / (elevationMaximum - waterLevel); cell.SetMapData(data);
рдирджрд┐рдпреЛрдВ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рдЬрдиредрдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд╣рдо рд╕реНрд░реЛрдд рд╕реЗрд▓ рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрдпрди рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рднрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрджреНрдпрдкрд┐ рд╣рдо рд╕рд╣реА рд╡рдЬрд╝рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ рд╕реЗ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдФрд░ рдпрд╣ рдкреАрдврд╝реА рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЪрд╛рд░ рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдорд╣рддреНрд╡ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╡рд░реНрдЧреАрдХрд░рдг рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдкрд╣рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░ 0.75 рд╕реЗ рдКрдкрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡реЗрдЯ рдХрд░реЗрдВрдЧреЗред рдЕрдЪреНрдЫреЗ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рд╡рдЬрди 0.5 рд╕реЗ рд╣реИред рдпреЛрдЧреНрдп рдЙрдореНрдореАрджрд╡рд╛рд░ 0.25 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВред рдЕрдиреНрдп рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд░реЗрдЦрд╛рдВрдХрди рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред float data = moisture * (cell.Elevation - waterLevel) / (elevationMaximum - waterLevel); if (data > 0.75f) { cell.SetMapData(1f); } else if (data > 0.5f) { cell.SetMapData(0.5f); } else if (data > 0.25f) { cell.SetMapData(0.25f); }
рдирджреА рд╕реНрд░реЛрддреЛрдВ рдХреЗ рднрд╛рд░ рдХреА рд╢реНрд░реЗрдгрд┐рдпрд╛рдБредрдЗрд╕ рд╡рд░реНрдЧреАрдХрд░рдг рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдирдХреНрд╢реЗ рдХреЗ рдЙрдЪреНрдЪрддрдо рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рднрд╛рдЧ рд╡рд╛рд▓реЗ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдирджрд┐рдпрд╛рдБ рдорд┐рд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╢реБрд╖реНрдХ рдпрд╛ рдирд┐рдореНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдирджрд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдиреА рд╣реБрдИ рд╣реИ, рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХреЛ рдмрдврд╝рд╛рддреА рд╣реИред рдЗрди рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рднрд░рдиреЗ рд╡рд╛рд▓реАрдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ CreateRivers
ред рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдмрд╛рд░ рдпреЛрдЧреНрдп рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреЛ рдмрд╛рд░ рдЕрдЪреНрдЫреЗ рдФрд░ рдЪрд╛рд░ рдмрд╛рд░ рдореБрдЦреНрдп рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛред рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред void CreateRivers () { List<HexCell> riverOrigins = ListPool<HexCell>.Get(); for (int i = 0; i < cellCount; i++) { HexCell cell = grid.GetCell(i); if (cell.IsUnderwater) { continue; } ClimateData data = climate[i]; float weight = data.moisture * (cell.Elevation - waterLevel) / (elevationMaximum - waterLevel); if (weight > 0.75f) { riverOrigins.Add(cell); riverOrigins.Add(cell); } if (weight > 0.5f) { riverOrigins.Add(cell); } if (weight > 0.25f) { riverOrigins.Add(cell); } } ListPool<HexCell>.Add(riverOrigins); }
рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП CreateClimate
рддрд╛рдХрд┐ рдирдореА рдбреЗрдЯрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛред public void GenerateMap (int x, int z) { тАж CreateRegions(); CreateLand(); ErodeLand(); CreateClimate(); CreateRivers(); SetTerrainType(); тАж }
рд╡рд░реНрдЧреАрдХрд░рдг рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдЗрд╕рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рджреГрд╢реНрдп рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред void SetTerrainType () { for (int i = 0; i < cellCount; i++) { тАж
рдирджреА рдХреЗ рдмрд┐рдВрджреБ
рд╣рдореЗрдВ рдХрд┐рддрдиреА рдирджрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдирджрд┐рдпреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдмрджрд▓рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирджреА рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреА рдорджрдж рд╕реЗ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рдЬреЛ рдЙрди рднреВрдорд┐ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдирджрд┐рдпреЛрдВ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХрддрдо 20% рдФрд░ 10% рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╢рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░реЗрдВред рд╕реБрд╢реА рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдХреА рддрд░рд╣, рдпрд╣ рдПрдХ рд▓рдХреНрд╖рд┐рдд рдореВрд▓реНрдп рд╣реИ, рдЧрд╛рд░рдВрдЯреАрдХреГрдд рдирд╣реАрдВ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдХрдо рдЙрдореНрдореАрджрд╡рд╛рд░ рдпрд╛ рдирджрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рддреНрд░рд╛ рдореЗрдВ рднреВрдорд┐ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╣реИрдВред рдЗрд╕реАрд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдкреНрд░рддрд┐рд╢рдд рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред [Range(0, 20)] public int riverPercentage = 10;
рд╕реНрд▓рд╛рдЗрдбрд░ рдкреНрд░рддрд┐рд╢рдд рдирджрд┐рдпреЛрдВредрдирджреА рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рднреВрдорд┐ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рдереА CreateLand
ред int cellCount, landCells; тАж void CreateLand () { int landBudget = Mathf.RoundToInt(cellCount * landPercentage * 0.01f); landCells = landBudget; for (int guard = 0; guard < 10000; guard++) { тАж } if (landBudget > 0) { Debug.LogWarning("Failed to use up " + landBudget + " land budget."); landCells -= landBudget; } }
рдЕрдВрджрд░, CreateRivers
рдирджреА рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдЕрдм рдЙрд╕реА рддрд░рд╣ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕реЗ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ CreateLand
ред void CreateRivers () { List<HexCell> riverOrigins = ListPool<HexCell>.Get(); for (int i = 0; i < cellCount; i++) { тАж } int riverBudget = Mathf.RoundToInt(landCells * riverPercentage * 0.01f); ListPool<HexCell>.Add(riverOrigins); }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдореВрд▓ рд╕реВрдЪреА рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд▓реЗрдирд╛ рдФрд░ рдирд┐рдХрд╛рд▓рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЕрдВрдХ рдФрд░ рд╕реНрд░реЛрдд рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВред рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред int riverBudget = Mathf.RoundToInt(landCells * riverPercentage * 0.01f); while (riverBudget > 0 && riverOrigins.Count > 0) { int index = Random.Range(0, riverOrigins.Count); int lastIndex = riverOrigins.Count - 1; HexCell origin = riverOrigins[index]; riverOrigins[index] = riverOrigins[lastIndex]; riverOrigins.RemoveAt(lastIndex); } if (riverBudget > 0) { Debug.LogWarning("Failed to use up river budget."); }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдирджрд┐рдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрд╕реЗ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕реЗ рдирджреА рдХреА рд▓рдВрдмрд╛рдИ рд╡рд╛рдкрд╕ рдХрд░рдиреА рд╣реЛрдЧреАред рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рдЬрдорд╛ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╢реВрдиреНрдп рд▓рдВрдмрд╛рдИ рджреЗрддрд╛ рд╣реИред int CreateRiver (HexCell origin) { int length = 0; return length; }
рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдЙрд╕ рдЪрдХреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд╣реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрднреА рдЬреЛрдбрд╝рд╛ рд╣реИ CreateRivers
, рд╢реЗрд╖ рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдирдИ рдирджреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рддрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЪрдпрдирд┐рдд рд╕реЗрд▓ рдХреЗ рдкрд╛рд╕ рд╕реЗ рд╣реЛрдХрд░ рдмрд╣рдиреЗ рд╡рд╛рд▓реА рдирджреА рди рд╣реЛред while (riverBudget > 0 && riverOrigins.Count > 0) { тАж if (!origin.HasRiver) { riverBudget -= CreateRiver(origin); } }
рд╡рд░реНрддрдорд╛рди рдирджрд┐рдпрд╛рдБ
рд╕рдореБрджреНрд░ рдпрд╛ рдЕрдиреНрдп рдЬрд▓ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рд╡рд╛рд▓реА рдирджрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдЬрдм рд╣рдо рд╕реНрд░реЛрдд рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рддреБрд░рдВрдд рд▓рдВрдмрд╛рдИ рдорд┐рд▓рддреА рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрдбрд╝реЛрд╕реА рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓рдВрдмрд╛рдИ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдЬрдм рддрдХ рд╣рдо рдЕрдВрдбрд░рд╡рд╛рдЯрд░ рд╕реЗрд▓ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рдЬрд╛рддреЗ, рддрдм рддрдХ рд╣рдо рдЪрд▓рддреЗ рд░рд╣рддреЗ рд╣реИрдВред int CreateRiver (HexCell origin) { int length = 1; HexCell cell = origin; while (!cell.IsUnderwater) { HexDirection direction = (HexDirection)Random.Range(0, 6); cell.SetOutgoingRiver(direction); length += 1; cell = cell.GetNeighbor(direction); } return length; }
рдмреЗрддрд░рддреАрдм рдирджрд┐рдпрд╛рдБредрдЗрд╕ рддрд░рд╣ рдХреЗ рднреЛрд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдмрд┐рдЦрд░реЗ рд╣реБрдП рдирджреА рдХреЗ рдЯреБрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рдирджрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдХрд╛рд░рдгред рдЗрд╕рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкрдбрд╝реЛрд╕реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╣рдореЗрдВ рд▓реВрдк рдореЗрдВ рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдХреЛрдИ рдкрдбрд╝реЛрд╕реА рд╣реИред рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рджрд┐рд╢рд╛ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рд╡рд╛рд╣ рджрд┐рд╢рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдЧрд░ рдирджреА рдЗрд╕ рдкрдбрд╝реЛрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрднреА рддрдХ рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдлрд┐рд░ рдЗрд╕ рд╕реВрдЪреА рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди рдЪреБрдиреЗрдВред List<HexDirection> flowDirections = new List<HexDirection>(); тАж int CreateRiver (HexCell origin) { int length = 1; HexCell cell = origin; while (!cell.IsUnderwater) { flowDirections.Clear(); for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = cell.GetNeighbor(d); if (!neighbor || neighbor.HasRiver) { continue; } flowDirections.Add(d); } HexDirection direction =
рдЗрд╕ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢реВрдиреНрдп рдЙрдкрд▓рдмреНрдз рдкреНрд░рд╡рд╛рд╣ рджрд┐рд╢рд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирджреА рдЕрдм рдЖрдЧреЗ рдирд╣реАрдВ рдмрд╣ рд╕рдХрддреА рд╣реИ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЗрд╕ рд╕рдордп рд▓рдВрдмрд╛рдИ 1 рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдореВрд▓ рд╕реЗрд▓ рд╕реЗ рд▓реАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ, рдЕрд░реНрдерд╛рддреН, рдХреЛрдИ рднреА рдирджреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирджреА рдХреА рд▓рдВрдмрд╛рдИ рд╢реВрдиреНрдп рд╣реИред flowDirections.Clear(); for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { тАж } if (flowDirections.Count == 0) { return length > 1 ? length : 0; }
рд╕рдВрд░рдХреНрд╖рд┐рдд рдирджрд┐рдпрд╛рдБредрдиреАрдЪреЗ рднрд╛рдЧ рдЬрд╛рдУ
рдЕрдм рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрдорд┐рдд рдирджрд┐рдпреЛрдВ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдирджрд┐рдпреЛрдВ рдХреЗ рдкреГрдердХ рдЯреБрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рд╣рдо рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рддреЗ рд╣реИрдВред рд╣рд░ рдмрд╛рд░ рд╣рдордиреЗ рдирджреА рдХреЛ рдЕрдзрд┐рдХ рдКрдВрдЪрд╛рдИ рддрдХ рдкреНрд░рд╡рд╛рд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛, HexCell.SetOutgoingRiver
рдЗрд╕ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдирджрд┐рдпреЛрдВ рдореЗрдВ рджрд░рд╛рд░реЗрдВ рдЖ рдЧрдИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрди рджрд┐рд╢рд╛рдУрдВ рдХреЛ рднреА рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдирдХреЗ рдХрд╛рд░рдг рдирджрд┐рдпрд╛рдБ рдмрд╣рддреА рд╣реИрдВред if (!neighbor || neighbor.HasRiver) { continue; } int delta = neighbor.Elevation - cell.Elevation; if (delta > 0) { continue; } flowDirections.Add(d);
рдиреАрдЪреЗ рдмрд╣рддреА рдирджрд┐рдпрд╛рдБредрдЗрд╕рд▓рд┐рдП рд╣рдо рдирджрд┐рдпреЛрдВ рдХреЗ рдХрдИ рдЯреБрдХрдбрд╝реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрднреА рднреА рдмрдиреЗ рд╣реБрдП рд╣реИрдВред рдЗрд╕ рдХреНрд╖рдг рд╕реЗ, рд╕рдмрд╕реЗ рдмрджрд╕реВрд░рдд рдирджрд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╢реЛрдзрди рдХрд╛ рд╡рд┐рд╖рдп рдмрди рдЬрд╛рддрд╛ рд╣реИред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирджрд┐рдпрд╛рдБ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдиреАрдЪреЗ рдмрд╣рдирд╛ рдкрд╕рдВрдж рдХрд░рддреА рд╣реИрдВред рд╡реЗ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдХрдо рд╕реЗ рдХрдо рд╕рдВрднрд╡ рдорд╛рд░реНрдЧ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдорд╣рд╛рди рд╣реИред рдЗрд╕реЗ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реВрдЪреА рдореЗрдВ рддреАрди рдмрд╛рд░ рджрд┐рд╢рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗред if (delta > 0) { continue; } if (delta < 0) { flowDirections.Add(d); flowDirections.Add(d); flowDirections.Add(d); } flowDirections.Add(d);
рддреАрдЦреЗ рдореЛрдбрд╝ рд╕реЗ рдмрдЪреЗрдВ
рдиреАрдЪреЗ рдмрд╣рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рдиреА рдореЗрдВ рдЬрдбрд╝рддрд╛ рднреА рд╣реИред рдПрдХ рдирджреА рдХреЗ рд╕реАрдзреЗ рдмрд╣рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдпрд╛ рдЕрдЪрд╛рдирдХ рддреЗрдЬ рдореЛрдбрд╝ рдмрдирд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЭреБрдХрдирд╛ред рдирджреА рдХреА рдЕрдВрддрд┐рдо рджрд┐рд╢рд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдХреЗ рд╣рдо рдЗрд╕ рд╡рд┐рдХреГрддрд┐ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рджрд┐рд╢рд╛ рдЗрд╕ рджрд┐рд╢рд╛ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдЪрд▓рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝реЗрдВрдЧреЗред int CreateRiver (HexCell origin) { int length = 1; HexCell cell = origin; HexDirection direction = HexDirection.NE; while (!cell.IsUnderwater) { flowDirections.Clear(); for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { тАж if (delta < 0) { flowDirections.Add(d); flowDirections.Add(d); flowDirections.Add(d); } if ( length == 1 || (d != direction.Next2() && d != direction.Previous2()) ) { flowDirections.Add(d); } flowDirections.Add(d); } if (flowDirections.Count == 0) { return length > 1 ? length : 0; }
рдпрд╣ рдЙрди рдЭреАрд▓реЛрдВ рдирджрд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдмрджрд╕реВрд░рдд рджрд┐рдЦрддреА рд╣реИрдВредрдХрдо рддреАрдЦреЗредрдирджреА рдХрд╛ рд╕рдВрдЧрдо
рдХрднреА-рдХрднреА рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдирджреА рдкрд╣рд▓реЗ рдмрдиреА рдирджреА рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рдареАрдХ рдмрдЧрд▓ рдореЗрдВ рдмрд╣рддреА рд╣реИред рдпрджрд┐ рдЗрд╕ рдирджреА рдХрд╛ рд╕реНрд░реЛрдд рдЕрдзрд┐рдХ рдКрдВрдЪрд╛рдИ рдкрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирдИ рдирджреА рдкреБрд░рд╛рдиреЗ рдореЗрдВ рдмрд╣рддреА рд╣реИред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рд▓рдВрдмреА рдирджреА рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рджреЛ рдкрдбрд╝реЛрд╕реА рдирд╣реАрдВредрдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрдбрд╝реЛрд╕реА рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдЧреБрдЬрд░рдиреЗ рджреЗрдВрдЧреЗ рдЬрдм рдЙрд╕рдореЗрдВ рдХреЛрдИ рдЖрдиреЗ рд╡рд╛рд▓реА рдирджреА рд╣реЛ, рдпрд╛ рдЕрдЧрд░ рд╡рд╣ рд╡рд░реНрддрдорд╛рди рдирджреА рдХрд╛ рд╕реНрд░реЛрдд рд╣реИред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдпрд╣ рджрд┐рд╢рд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдмрд╣рдиреЗ рд╡рд╛рд▓реА рдирджреА рд╣реИред рдЕрдЧрд░ рд╣реИ, рддреЛ рд╣рдордиреЗ рдлрд┐рд░ рд╕реЗ рдкреБрд░рд╛рдиреА рдирджреА рдХреЛ рдвреВрдВрдв рд▓рд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдХрдо рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдиреНрдп рдкрдбрд╝реЛрд╕реА рд╕реНрд░реЛрддреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдФрд░ рдирджрд┐рдпреЛрдВ рдХреЛ рддреБрд░рдВрдд рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред HexCell neighbor = cell.GetNeighbor(d);
рдкреВрд▓рд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдирджрд┐рдпрд╛рдБредрджреВрд░реА рдмрдирд╛рдП рд░рдЦреЗрдВ
рдЪреВрдВрдХрд┐ рд╕реНрд░реЛрдд рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдирджреА рдХреЗ рд╕рдореВрд╣ рдорд┐рд▓реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реЗ рдирджрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рд╕реНрд░реЛрдд рдХреЛ рдЬрд▓рд╛рд╢рдп рдХреЗ рдареАрдХ рдмрдЧрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд▓рдВрдмрд╛рдИ 1 рдХреА рдирджрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╣рдо рдЙрди рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдирджреА рдпрд╛ рдЬрд▓рд╛рд╢рдп рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реИрдВред рд╣рдо рдЪрдпрдирд┐рдд рд╕реНрд░реЛрдд рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдПрдХ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рд╕реЗ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реИрдВ CreateRivers
ред рдпрджрд┐ рд╣рдореЗрдВ рдХреЛрдИ рдкрдбрд╝реЛрд╕реА рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕реНрд░реЛрдд рд╣рдореЗрдВ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред while (riverBudget > 0 && riverOrigins.Count > 0) { int index = Random.Range(0, riverOrigins.Count); int lastIndex = riverOrigins.Count - 1; HexCell origin = riverOrigins[index]; riverOrigins[index] = riverOrigins[lastIndex]; riverOrigins.RemoveAt(lastIndex); if (!origin.HasRiver) { bool isValidOrigin = true; for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = origin.GetNeighbor(d); if (neighbor && (neighbor.HasRiver || neighbor.IsUnderwater)) { isValidOrigin = false; break; } } if (isValidOrigin) { riverBudget -= CreateRiver(origin); } }
рдФрд░ рдпрджреНрдпрдкрд┐ рдирджрд┐рдпрд╛рдБ рдЕрднреА рднреА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдмрд╣рддреА рд╣реИрдВ, рд╡реЗ рдПрдХ рдмрдбрд╝реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВредрдмрд┐рдирд╛ рджреВрд░реА рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рдередрд╣рдо рдПрдХ рдЭреАрд▓ рдХреЗ рд╕рд╛рде рдирджреА рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ
рд╕рднреА рдирджрд┐рдпрд╛рдБ рдЬрд▓рд╛рд╢рдп рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪрддреА рд╣реИрдВ, рдХреБрдЫ рдШрд╛рдЯрд┐рдпреЛрдВ рдореЗрдВ рдлрдВрд╕ рдЬрд╛рддреА рд╣реИрдВ рдпрд╛ рдЕрдиреНрдп рдирджрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдХреНрд╕рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирджрд┐рдпрд╛рдБ рднреА рд▓реБрдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡реЗ рднреВрдорд┐рдЧрдд рдкреНрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рджрд▓рджрд▓реА рднреВрдорд┐ рдореЗрдВ рдлреИрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рд╕реВрдЦ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рдирджрд┐рдпрд╛рдБ рдЗрд╕рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдмрд╕ рдЦрддреНрдо рд╣реЛ рдЬрд╛рддреА рд╣реИрдВредрд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджреНрдпрдкрд┐ рд╣рдо рдирджрд┐рдпреЛрдВ рдХреЛ рдПрдХрдЬреБрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╡рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЭреАрд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдХреНрд╕рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдПCreateRiver
рдпрджрд┐ рдпрд╣ рдЕрдЯрдХ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╕реЗрд▓ рдореЗрдВ рдЬрд▓ рд╕реНрддрд░ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЗрд╕ рд╕реЗрд▓ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдиреНрдпреВрдирддрдо рдКрдВрдЪрд╛рдИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред while (!cell.IsUnderwater) { int minNeighborElevation = int.MaxValue; flowDirections.Clear(); for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { HexCell neighbor = cell.GetNeighbor(d);
рдпрджрд┐ рд╣рдо рдлрдВрд╕ рдЧрдП рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЕрднреА рднреА рд╕реНрд░реЛрдд рдкрд░ рд╣реИрдВред рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдмрд╕ рдирджреА рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрдВред рдЕрдиреНрдпрдерд╛, рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рднреА рдкрдбрд╝реЛрд╕реА рдХрдо рд╕реЗ рдХрдо рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЪреНрдЪ рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рд╕реНрддрд░ рддрдХ рдкрд╛рдиреА рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕реЗрд▓ рд╕реЗ рдПрдХ рдЭреАрд▓ рдмрдирд╛рдПрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рд╕реЗрд▓ рдХреА рдКрдВрдЪрд╛рдИ рд╕рдорд╛рди рд╕реНрддрд░ рдкрд░ рди рд╣реЛред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдмрд╕ рдКрдВрдЪрд╛рдИ рдХреЛ рдЬрд▓ рд╕реНрддрд░ рд╕реЗ рдПрдХ рд╕реНрддрд░ рдиреАрдЪреЗ рд░рдЦреЗрдВред if (flowDirections.Count == 0) {
рдЭреАрд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдЭреАрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдирджрд┐рдпреЛрдВ рдХреЗ рдЫреЛрд░ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирджрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд 20 рд╣реИредрдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рдиреА рдХреЗ рд╕реНрддрд░ рд╕реЗ рдКрдкрд░ рдХрд╛ рдкрд╛рдиреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рд╕рдореБрджреНрд░ рддрд▓ рд╕реЗ рдЭреАрд▓реЛрдВ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░реЗрдВрдЧреЗредрдЕрддрд┐рд░рд┐рдХреНрдд рдЭреАрд▓реЗрдВ
рд╣рдо рдЭреАрд▓реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╣рдо рдЕрдЯрдХреЗ рди рд╣реЛрдВред рдЗрд╕рд╕реЗ рдЭреАрд▓ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдПрдХ рдирджреА рдмрд╣ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рд╣рдо рдЕрдЯрдХ рдирд╣реАрдВ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЭреАрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЬрд▓ рд╕реНрддрд░ рдФрд░ рдлрд┐рд░ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдКрдВрдЪрд╛рдИ рдХреЛ рдмрдврд╝рд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реЗрд▓ рдХреА рдКрдВрдЪрд╛рдИ рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдкрдбрд╝реЛрд╕реА рдХреА рдиреНрдпреВрдирддрдо рдКрдВрдЪрд╛рдИ рдХрдо рд╕реЗ рдХрдо рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛред рд╣рдо рдирджреА рдХреЗ рдЪрдХреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдФрд░ рдЕрдЧрд▓реЗ рд╕реЗрд▓ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред while (!cell.IsUnderwater) { тАж if (minNeighborElevation >= cell.Elevation) { cell.WaterLevel = cell.Elevation; cell.Elevation -= 1; } cell = cell.GetNeighbor(direction); }
рдмрд┐рдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЭреАрд▓реЛрдВ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рдередрдХрдИ рдЭреАрд▓реЗрдВ рд╕реБрдВрджрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реАрдорд╛ рдХреЗ рдмрд┐рдирд╛ рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реА рдЭреАрд▓реЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, 0.25 рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде, рдЕрддрд┐рд░рд┐рдХреНрдд рдЭреАрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд╕рдВрднрд╛рд╡рдирд╛ рдЬреЛрдбрд╝реЗрдВред [Range(0f, 1f)] public float extraLakeProbability = 0.25f;
рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╡рд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЭреАрд▓ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред if ( minNeighborElevation >= cell.Elevation && Random.value < extraLakeProbability ) { cell.WaterLevel = cell.Elevation; cell.Elevation -= 1; }
рдЕрддрд┐рд░рд┐рдХреНрдд рдЭреАрд▓реЗрдВредрдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдЭреАрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?, , , . . : . , . , , , .
unitypackageрддрд╛рдкрдорд╛рди
рдкрд╛рдиреА рд╕рд┐рд░реНрдл рдЙрди рдХрд╛рд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдПрдХ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдмрд╛рдпреЛрдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рддрд╛рдкрдорд╛рди рд╣реИред рдпрджреНрдпрдкрд┐ рд╣рдо рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЬрд▓рд╡рд╛рдпреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдиреА рдХреЗ рдЕрдиреБрдХрд░рдг рдЬреИрд╕реЗ рддрд╛рдкрдорд╛рди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдкреНрд░рд╕рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рддрд╛рдкрдорд╛рди рдХреЛ рд╕рд░рд▓ рд░рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВредрддрд╛рдкрдорд╛рди рдФрд░ рдЕрдХреНрд╖рд╛рдВрд╢
рддрд╛рдкрдорд╛рди рдкрд░ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдЕрдХреНрд╖рд╛рдВрд╢ рд╣реИред рдпрд╣ рднреВрдордзреНрдп рд░реЗрдЦрд╛ рдкрд░ рдЧрд░реНрдо рд╣реИ, рдзреНрд░реБрд╡реЛрдВ рдкрд░ рдардВрдбрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдЪрд┐рдХрдиреА рд╕рдВрдХреНрд░рдордг рд╣реИред рдЖрдЗрдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ рдЬреЛ DetermineTemperature
рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕реЗрд▓ рдХрд╛ рддрд╛рдкрдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдЖрдпрд╛рдо Z рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХреЛрд╢рд┐рдХрд╛ рдХреЗ Z рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╖рд╛рдВрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд╛рдкрдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред float DetermineTemperature (HexCell cell) { float latitude = (float)cell.coordinates.Z / grid.cellCountZ; return latitude; }
рд╣рдо рддрд╛рдкрдорд╛рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ SetTerrainType
рдФрд░ рдЗрд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред void SetTerrainType () { for (int i = 0; i < cellCount; i++) { HexCell cell = grid.GetCell(i); float temperature = DetermineTemperature(cell); cell.SetMapData(temperature); float moisture = climate[i].moisture; тАж } }
рддрд╛рдкрдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдХреНрд╖рд╛рдВрд╢, рджрдХреНрд╖рд┐рдгреА рдЧреЛрд▓рд╛рд░реНрдзредрд╣рдо рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рдПрдХ рд░реИрдЦрд┐рдХ рддрд╛рдкрдорд╛рди рдврд╛рд▓ рдмрдврд╝рд╛рддреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджрдХреНрд╖рд┐рдгреА рдЧреЛрд▓рд╛рд░реНрдз рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдПрдХ рдзреНрд░реБрд╡ рдФрд░ рдПрдХ рднреВрдордзреНрдп рд░реЗрдЦрд╛ред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкреВрд░реЗ рдЧреЛрд▓рд╛рд░реНрдз рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдЫреЛрдЯреЗ рддрд╛рдкрдорд╛рди рдЕрдВрддрд░ рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╕реЗ, рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрди рдФрд░ рдЙрдЪреНрдЪ рддрд╛рдкрдорд╛рди рдХреЛ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдмрдирд╛рдПрдВрдЧреЗред рд╣рдо рдЗрди рддрд╛рдкрдорд╛рдиреЛрдВ рдХреЛ 0тАУ1 рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд░рдо рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред [Range(0f, 1f)] public float lowTemperature = 0f; [Range(0f, 1f)] public float highTemperature = 1f;
рддрд╛рдкрдорд╛рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯредрд╣рдо рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рдкрдорд╛рди рд░реЗрдВрдЬ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рдХреНрд╖реЗрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдХреНрд╖рд╛рдВрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдо рдЕрдХреНрд╖рд╛рдВрд╢ рдХреЛ 0 рд╕реЗ 1 рдХреЗ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ Mathf.LerpUnclamped
ред float DetermineTemperature (HexCell cell) { float latitude = (float)cell.coordinates.Z / grid.cellCountZ; float temperature = Mathf.LerpUnclamped(lowTemperature, highTemperature, latitude); return temperature; }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрдо рддрд╛рдкрдорд╛рди рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкрд▓рдЯ рд╕рдХрддреЗ рд╣реИрдВредрдЧреЛрд▓рд╛рд░реНрджреНрдз
рдЕрдм рд╣рдо рджрдХреНрд╖рд┐рдгреА рдЧреЛрд▓рд╛рд░реНрдз рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрднрд╡рддрдГ рдЙрддреНрддрд░реА рдПрдХ, рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рддрд╛рдкрдорд╛рди рд▓реЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЧреЛрд▓рд╛рд░реНрдз рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЖрдЗрдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдФрд░ рдПрдХ рдлреАрд▓реНрдб рдмрдирд╛рдПрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рджреЛрдиреЛрдВ рдЧреЛрд▓рд╛рд░реНрджреНрдзреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рднреА рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред public enum HemisphereMode { Both, North, South } public HemisphereMode hemisphere;
рдЧреЛрд▓рд╛рд░реНрдз рдХреА рдкрд╕рдВрджредрдпрджрд┐ рд╣рдореЗрдВ рдЙрддреНрддрд░реА рдЧреЛрд▓рд╛рд░реНрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдЕрдХреНрд╖рд╛рдВрд╢ рдХреЛ рдлреНрд▓рд┐рдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ 1 рд╕реЗ рдШрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдЧреЛрд▓рд╛рд░реНрджреНрдзреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдзреНрд░реБрд╡ рдирдХреНрд╢реЗ рдХреЗ рдиреАрдЪреЗ рдФрд░ рдКрдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рднреВрдордзреНрдп рд░реЗрдЦрд╛ рдордзреНрдп рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЕрдХреНрд╖рд╛рдВрд╢ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдирд┐рдЪрд▓реЗ рдЧреЛрд▓рд╛рд░реНрдз рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ 1 рд╕реЗ 2 рдХрд╛ рдЕрдХреНрд╖рд╛рдВрд╢ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдХреНрд╖рд╛рдВрд╢ рдХреЛ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдкрд░ 2 рд╕реЗ рдШрдЯрд╛рддреЗ рд╣реИрдВред float DetermineTemperature (HexCell cell) { float latitude = (float)cell.coordinates.Z / grid.cellCountZ; if (hemisphere == HemisphereMode.Both) { latitude *= 2f; if (latitude > 1f) { latitude = 2f - latitude; } } else if (hemisphere == HemisphereMode.North) { latitude = 1f - latitude; } float temperature = Mathf.LerpUnclamped(lowTemperature, highTemperature, latitude); return temperature; }
рджреЛрдиреЛрдВ рдЧреЛрд▓рд╛рд░реНрдзредрдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдПрдХ рд╡рд┐рджреЗрд╢реА рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рднреВрдордзреНрдп рд░реЗрдЦрд╛ рдардВрдбреА рд╣реЛрддреА рд╣реИ рдФрд░ рдзреНрд░реБрд╡ рдЧрд░реНрдо рд╣реЛрддреЗ рд╣реИрдВредрдЕрдзрд┐рдХ рдардВрдб
рдЕрдХреНрд╖рд╛рдВрд╢ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрд╛рдкрдорд╛рди рднреА рдКрдВрдЪрд╛рдИ рд╕реЗ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдФрд╕рддрди, рд╣рдо рдЬрд┐рддрдирд╛ рдКрдВрдЪрд╛ рдЪрдврд╝рддреЗ рд╣реИрдВ, рдЙрддрдирд╛ рдардВрдбрд╛ рд╣реЛрддрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдПрдХ рдХрд╛рд░рдХ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдирджреА рдХреЗ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕реЗрд▓ рдКрдВрдЪрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реВрдЪрдХ рдКрдВрдЪрд╛рдИ рдХреЗ рд╕рд╛рде рдШрдЯрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЬрд▓ рд╕реНрддрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЕрдзрд┐рдХрддрдо рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд 1 рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рддрд╛рдХрд┐ рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдкрд░ рд╕рдВрдХреЗрддрдХ рд╢реВрдиреНрдп рддрдХ рди рдЧрд┐рд░ рдЬрд╛рдП, рд╣рдо рднрд╛рдЬрдХ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдлрд┐рд░ рддрд╛рдкрдорд╛рди рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред float temperature = Mathf.LerpUnclamped(lowTemperature, highTemperature, latitude); temperature *= 1f - (cell.ViewElevation - waterLevel) / (elevationMaximum - waterLevel + 1f); return temperature;
рдКрдВрдЪрд╛рдИ рддрд╛рдкрдорд╛рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИредрддрд╛рдкрдорд╛рди рдореЗрдВ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡
рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрд╛рдкрдорд╛рди рдореЗрдВ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдЬреЛрдбрд╝рдХрд░ рддрд╛рдкрдорд╛рди рдврд╛рд▓ рдХреА рд╕рд╛рджрдЧреА рдХреЛ рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдореМрдХрд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдХреЗ рд╕рд╛рде, рд╡реЗ рдордирдорд╛рдиреА рджреЗрдЦреЗрдВрдЧреЗред рдЪрд▓реЛ рддрд╛рдкрдорд╛рди рдореЗрдВ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ 0.1 рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрддрдо рддрд╛рдкрдорд╛рди рд╡рд┐рдЪрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред [Range(0f, 1f)] public float temperatureJitter = 0.1f;
рддрд╛рдкрдорд╛рди рдореЗрдВ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рд╕реНрд▓рд╛рдЗрдбрд░редрдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдХреЛ рдереЛрдбрд╝реЗ рд╕реНрдерд╛рдиреАрдп рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо HexMetrics.SampleNoise
рдПрдХ рддрд░реНрдХ рдФрд░ рд╕реЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ 0.1 рд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд▓реЛ рдЪреИрдирд▓ рдбрдмреНрд▓реНрдпреВ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХреЗрдВрджреНрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджреЛрд▓рди рдХреЗ рдЧреБрдгрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреЗрд▓ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЗрд╕ рдорд╛рди рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рдХрд▓рд┐рдд рддрд╛рдкрдорд╛рди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред temperature *= 1f - (cell.ViewElevation - waterLevel) / (elevationMaximum - waterLevel + 1f); temperature += (HexMetrics.SampleNoise(cell.Position * 0.1f).w * 2f - 1f) * temperatureJitter; return temperature;
0.1 рдФрд░ 1. рдХреЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рдкрдорд╛рди рдореЗрдВ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡редрд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╢реЛрд░ рдкрд░ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд╛рд░ рд╢реЛрд░ рдЪреИрдирд▓реЛрдВ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред рдЪреИрдирд▓ рдХреЛ рдПрдХ рдмрд╛рд░ рд╕реЗрдЯ рдХрд░реЗрдВ SetTerrainType
, рдФрд░ рдлрд┐рд░ рд░рдВрдЧ рдЪреИрдирд▓реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░реЗрдВ DetermineTemperature
ред int temperatureJitterChannel; тАж void SetTerrainType () { temperatureJitterChannel = Random.Range(0, 4); for (int i = 0; i < cellCount; i++) { тАж } } float DetermineTemperature (HexCell cell) { тАж float jitter = HexMetrics.SampleNoise(cell.Position * 0.1f)[temperatureJitterChannel]; temperature += (jitter * 2f - 1f) * temperatureJitter; return temperature; }
рдЕрдзрд┐рдХрддрдо рдмрд▓ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рддрд╛рдкрдорд╛рди рдореЗрдВ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡редunitypackageрдмрд╛рдпреЛрдо
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд░реНрджреНрд░рддрд╛ рдФрд░ рддрд╛рдкрдорд╛рди рдкрд░ рдбреЗрдЯрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдмрд╛рдпреЛрдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдХреЗ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдЯрд╛ рдЖрдпрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдмрдирд╛рддреЗ рд╣реБрдП, рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрд╛рдпреЛрдо рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдмрд╛рдпреЛрдо рдореИрдЯреНрд░рд┐рдХреНрд╕
рдХрдИ рдЬрд▓рд╡рд╛рдпреБ рдореЙрдбрд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛ рджреЗрдВрдЧреЗ, рд╣рдо рдХреЗрд╡рд▓ рддрд░реНрдХ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╢реБрд╖реНрдХ рдХрд╛ рдорддрд▓рдм рд░реЗрдЧрд┐рд╕реНрддрд╛рди (рдардВрдбрд╛ рдпрд╛ рдЧрд░реНрдо) рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд░реЗрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдардВрдбрд╛ рдФрд░ рдЧреАрд▓рд╛ рдХрд╛ рдорддрд▓рдм рд╣реИ рдмрд░реНрдлред рдЧрд░реНрдо рдФрд░ рдЖрд░реНрджреНрд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдмрд╣реБрдд рд╕рд╛рд░реА рд╡рдирд╕реНрдкрддрд┐рдпрд╛рдБ, рдпрд╛рдиреА рдШрд╛рд╕ред рдЙрдирдХреЗ рдмреАрдЪ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЯреИрдЧрд╛ рдпрд╛ рдЯреБрдВрдбреНрд░рд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдкреГрдереНрд╡реА рдХреА рдПрдХ рдЧреНрд░реЗ рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрди рдмрд╛рдпреЛрдо рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ 4 ├Ч 4 рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛редрдкрд╣рд▓реЗ, рд╣рдордиреЗ рдкрд╛рдБрдЪ рдирдореА рдЕрдВрддрд░рд╛рд▓реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдКрдВрдЪрд╛рдИ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реМрдВрдкреЗред рд╣рдо рдХреЗрд╡рд▓ рд╕реВрдЦреА рдкрдЯреНрдЯреА рдХреЛ 0.05 рд╕реЗ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред рддрд╛рдкрдорд╛рди рдмреИрдВрдб рдХреЗ рд▓рд┐рдП рд╣рдо 0.1, 0.3, 0.6 рдФрд░ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред static float[] temperatureBands = { 0.1f, 0.3f, 0.6f }; static float[] moistureBands = { 0.12f, 0.28f, 0.85f };
рдпрджреНрдпрдкрд┐ рд╣рдо рдмрд╛рдпреЛрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЗрд╡рд▓ рд░рд╛рд╣рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ HexMapGenerator
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд Biome
рдХрд░реЗрдВ рдЬреЛ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмрд╛рдпреЛрдо рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЕрдм рддрдХ, рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдмрдореНрдк рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рдЗрд╕реА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИред struct Biome { public int terrain; public Biome (int terrain) { this.terrain = terrain; } }
рд╣рдо рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рдПрдХ рд╕реНрдерд┐рд░ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдПрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд░реНрджреНрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рддрд╛рдкрдорд╛рдиред рд╣рдо рдмрд░реНрдл рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдХрдо рддрд╛рдкрдорд╛рди рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЛ рднрд░рддреЗ рд╣реИрдВ, рдЯреБрдВрдбреНрд░рд╛ рдХреЗ рд╕рд╛рде рджреВрд╕рд░реА рд▓рд╛рдЗрди, рдФрд░ рдШрд╛рд╕ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рджреЛред рддрдм рд╣рдо рд░реЗрдЧрд┐рд╕реНрддрд╛рди рдХреЗ рд╕рд╛рде рд╢реБрд╖реНрдХ рдХреЙрд▓рдо рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддрд╛рдкрдорд╛рди рдХреА рдкрд╕рдВрдж рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред static Biome[] biomes = { new Biome(0), new Biome(4), new Biome(4), new Biome(4), new Biome(0), new Biome(2), new Biome(2), new Biome(2), new Biome(0), new Biome(1), new Biome(1), new Biome(1), new Biome(0), new Biome(1), new Biome(1), new Biome(1) };
рдПрдХ рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рдпреЛрдо рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕редрдмрд╛рдпреЛрдо рдкрд░рд┐рднрд╛рд╖рд╛
SetTerrainType
рдмрд╛рдпреЛрдо рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рд╣рдо рдЖрд╡рд╖реНрдпрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрдХреНрд░ рдореЗрдВ рддрд╛рдкрдорд╛рди рдФрд░ рдЖрд░реНрджреНрд░рддрд╛ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдПрдВрдЧреЗред рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдмрд╛рдпреЛрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕реЗрд▓ рдЯреЛрдкреЛрдЧреНрд░рд╛рдлреА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред void SetTerrainType () { temperatureJitterChannel = Random.Range(0, 4); for (int i = 0; i < cellCount; i++) { HexCell cell = grid.GetCell(i); float temperature = DetermineTemperature(cell);
рдПрдХ рдмрд╛рдпреЛрдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд░рд╛рд╣рддредрдмрд╛рдпреЛрдо рд╕реЗрдЯрдЕрдк
рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдмрд╛рдпреЛрдо рд╕реЗ рдкрд░реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ, рд╕рднреА рд╕реВрдЦреЗ рдмрд╛рдпреЛрдо рдХреЛ рд░реЗрдд рд░реЗрдЧрд┐рд╕реНрддрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рд╕реВрдЦреЗ рд░реЗрдЧрд┐рд╕реНрддрд╛рди рд░реЗрдд рд╕реЗ рднрд░реЗ рдирд╣реАрдВ рд╣реИрдВред рдХрдИ рдЪрдЯреНрдЯрд╛рдиреА рд░реЗрдЧрд┐рд╕реНрддрд╛рди рд╣реИрдВ рдЬреЛ рдмрд╣реБрдд рдЕрд▓рдЧ рджрд┐рдЦрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЪрд▓реЛ рд░реЗрдЧрд┐рд╕реНрддрд╛рди рдХреА рдХреБрдЫ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрддреНрдерд░реЛрдВ рд╕реЗ рдмрджрд▓ рджреЗрдВред рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдКрдВрдЪрд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд░реЗрдВрдЧреЗ: рд░реЗрдд рдХрдо рдКрдВрдЪрд╛рдИ рдкрд░ рд╣реИ, рдФрд░ рдирдВрдЧреЗ рдЪрдЯреНрдЯрд╛рди рдЖрдорддреМрд░ рдкрд░ рдКрдкрд░ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВредрдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЬрдм рд╕реЗрд▓ рдХреА рдКрдВрдЪрд╛рдИ рдЬрд▓ рд╕реНрддрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИ рдХреЗ рдХрд░реАрдм рд╣реЛрддреА рд╣реИ, рддреЛ рдкрддреНрдерд░ рдкрддреНрдерд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЪрдЯреНрдЯрд╛рдиреА рд░реЗрдЧрд┐рд╕реНрддрд╛рди рдХреА рдКрдВрдЪрд╛рдИ рдХреА рд░реЗрдЦрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ SetTerrainType
ред рдЬрдм рд╣рдо рд░реЗрдд рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд▓ рд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИ, рддреЛ рд╣рдо рдмрд╛рдпреЛрдо рдХреА рд░рд╛рд╣рдд рдХреЛ рдкрддреНрдерд░ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред void SetTerrainType () { temperatureJitterChannel = Random.Range(0, 4); int rockDesertElevation = elevationMaximum - (elevationMaximum - waterLevel) / 2; for (int i = 0; i < cellCount; i++) { тАж if (!cell.IsUnderwater) { тАж Biome cellBiome = biomes[t * 4 + m]; if (cellBiome.terrain == 0) { if (cell.Elevation >= rockDesertElevation) { cellBiome.terrain = 3; } } cell.TerrainTypeIndex = cellBiome.terrain; } else { cell.TerrainTypeIndex = 2; } } }
рд╕реИрдВрдбреА рдФрд░ рдЪрдЯреНрдЯрд╛рдиреА рд░реЗрдЧрд┐рд╕реНрддрд╛рдиредрдКрдВрдЪрд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдФрд░ рдмрджрд▓рд╛рд╡ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрд░реНрдл рдХреА рдЪреЛрдЯрд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рддрд╛рдкрдорд╛рди рдкрд░ рдордЬрдмреВрд░ рдХрд░рдирд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдЙрдирдХрд╛ рддрд╛рдкрдорд╛рди рдХрд┐рддрдирд╛ рднреА рд╕реВрдЦрд╛ рдХреНрдпреЛрдВ рди рд╣реЛред рдЗрд╕рд╕реЗ рдЧрд░реНрдо рдФрд░ рдЖрд░реНрджреНрд░ рднреВрдордзреНрдп рд░реЗрдЦрд╛ рдХреЗ рдкрд╛рд╕ рдмрд░реНрдл рдХреА рдЪреЛрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рдПрдЧреАред if (cellBiome.terrain == 0) { if (cell.Elevation >= rockDesertElevation) { cellBiome.terrain = 3; } } else if (cell.Elevation == elevationMaximum) { cellBiome.terrain = 4; }
рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИ рдкрд░ рд╣рд┐рдордкрд╛рддредрдкреМрдзреЛрдВ
рдЕрдм рдЪрд▓реЛ рдмрд╛рдпреЛрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдкреМрдзреЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕реНрддрд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Biome
рдкреМрдзреЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред struct Biome { public int terrain, plant; public Biome (int terrain, int plant) { this.terrain = terrain; this.plant = plant; } }
рд╕рдмрд╕реЗ рдардВрдбреЗ рдФрд░ рд╕реВрдЦреЗ рдмрд╛рдпреЛрдо рдореЗрдВ рдкреМрдзреЗ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЧрд░реНрдо рдФрд░ рдЬрд▓рд╡рд╛рдпреБ рдХреЛ рдЧреАрд▓рд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рдкреМрдзреЗред рдЖрд░реНрджреНрд░рддрд╛ рдХрд╛ рджреВрд╕рд░рд╛ рд╕реНрддрдВрдн рд╕рдмрд╕реЗ рдЧрд░реНрдо рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкреМрдзреЛрдВ рдХрд╛ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рд╕реНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП [0, 0, 0, 1]ред рддреАрд╕рд░рд╛ рд╕реНрддрдВрдн рдмрд░реНрдл рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрддрд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, [0, 1, 1, 2]ред рдФрд░ wettest рдХреЙрд▓рдо рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рдирд┐рдХрд▓рд╛ [0, 2, 2, 3]ред biomes
рдкреНрд▓рд╛рдВрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рд╕рд░рдгреА рдмрджрд▓реЗрдВ ред static Biome[] biomes = { new Biome(0, 0), new Biome(4, 0), new Biome(4, 0), new Biome(4, 0), new Biome(0, 0), new Biome(2, 0), new Biome(2, 1), new Biome(2, 2), new Biome(0, 0), new Biome(1, 0), new Biome(1, 1), new Biome(1, 2), new Biome(0, 0), new Biome(1, 1), new Biome(1, 2), new Biome(1, 3) };
рдкреМрдзреЛрдВ рдХреЗ рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рдмрд╛рдпреЛрдо рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕редрдЕрдм рд╣рдо рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдкреМрдзреЛрдВ рдХрд╛ рд╕реНрддрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред cell.TerrainTypeIndex = cellBiome.terrain; cell.PlantLevel = cellBiome.plant;
рдкреМрдзреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рдпреЛрдоредрдХреНрдпрд╛ рдЕрдм рдкреМрдзреЗ рдЕрд▓рдЧ рджрд┐рдЦрддреЗ рд╣реИрдВ?, . (1, 2, 1) (0.75, 1, 0.75). (1.5, 3, 1.5) (2, 1.5, 2). тАФ (2, 4.5, 2) (2.5, 3, 2.5).
, : (13, 114, 0).
рд╣рдо рдмрд╛рдпреЛрдо рдХреЗ рд▓рд┐рдП рдкреМрдзреЛрдВ рдХреЗ рд╕реНрддрд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмрд░реНрдлреАрд▓реЗ рдЗрд▓рд╛рдХреЗ рдореЗрдВ рджрд┐рдЦрд╛рдИ рди рджреЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рдереЗред рджреВрд╕рд░реЗ, рдЪрд▓реЛ рдирджрд┐рдпреЛрдВ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкреМрдзреЛрдВ рдХрд╛ рд╕реНрддрд░ рдмрдврд╝рд╛рдПрдВ, рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХрддрдо рдирд╣реАрдВ рд╣реИред if (cellBiome.terrain == 4) { cellBiome.plant = 0; } else if (cellBiome.plant < 3 && cell.HasRiver) { cellBiome.plant += 1; } cell.TerrainTypeIndex = cellBiome.terrain; cell.PlantLevel = cellBiome.plant;
рд╕рдВрд╢реЛрдзрд┐рдд рдкреМрдзреЗредрдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдмрд╛рдпреЛрдо
рдЙрд╕ рдХреНрд╖рдг рддрдХ, рд╣рдордиреЗ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ред рдЖрдЗрдП рдЙрдирдореЗрдВ рдереЛрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд▓рд╛рдПрдВ, рдФрд░ рд╣рдо рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдкреГрдереНрд╡реА рдХреА рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдКрдВрдЪрд╛рдИ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд╕реНрд╡реАрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдЬрд▓ рд╕реНрддрд░ рд╕реЗ рдПрдХ рдХрджрдо рдиреАрдЪреЗ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдШрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЖрдЗрдП, рдирджрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдЭреАрд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЬрд▓ рд╕реНрддрд░ рд╕реЗ рдКрдкрд░ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдШрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдирдХрд╛рд░рд╛рддреНрдордХ рдКрдВрдЪрд╛рдИ рд╡рд╛рд▓реЗ рд╕реЗрд▓ рдЧрд╣рд░реЗ рд╕рдореБрджреНрд░ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдкрддреНрдерд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдп рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдЬрдореАрдиреА рд░рд╣рддреА рд╣реИрдВред void SetTerrainType () { тАж if (!cell.IsUnderwater) { тАж } else { int terrain; if (cell.Elevation == waterLevel - 1) { terrain = 1; } else if (cell.Elevation >= waterLevel) { terrain = 1; } else if (cell.Elevation < 0) { terrain = 3; } else { terrain = 2; } cell.TerrainTypeIndex = terrain; } } }
рдкрд╛рдиреА рдХреЗ рднреАрддрд░ рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛редрдЖрдЗрдП рддрдЯ рдХреЗ рд╕рд╛рде рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпреЗ рдкрд╛рдиреА рдХреЗ рдКрдкрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкрдбрд╝реЛрд╕реА рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВред рдпрджрд┐ рдРрд╕реА рд╕реЗрд▓ рдЙрдерд▓реА рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд╕рдореБрджреНрд░ рддрдЯ рдмрдирд╛рдПрдВрдЧреЗред рдФрд░ рдЕрдЧрд░ рдпрд╣ рдЪрдЯреНрдЯрд╛рди рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рдореБрдЦ рджреГрд╢реНрдп рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдЧрд╛, рдФрд░ рд╣рдо рдкрддреНрдерд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВредрдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рдиреА рдХреЗ рд╕реНрддрд░ рд╕реЗ рдПрдХ рдХрджрдо рдиреАрдЪреЗ рд╕реНрдерд┐рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рд╣рдо рдкрдбрд╝реЛрд╕реА рднреВрдорд┐ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдФрд░ рдврд▓рд╛рдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред if (cell.Elevation == waterLevel - 1) { int cliffs = 0, slopes = 0; for ( HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++ ) { HexCell neighbor = cell.GetNeighbor(d); if (!neighbor) { continue; } int delta = neighbor.Elevation - cell.WaterLevel; if (delta == 0) { slopes += 1; } else if (delta > 0) { cliffs += 1; } } terrain = 1; }
рдЕрдм рд╣рдо рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрджрд┐ рдЖрдзреЗ рд╕реЗ рдЕрдзрд┐рдХ рдкрдбрд╝реЛрд╕реА рднреВрдорд┐ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдЭреАрд▓ рдпрд╛ рдПрдХ рдЦрд╛рдбрд╝реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдШрд╛рд╕ рдХреА рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪрдЯреНрдЯрд╛рдиреЗрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдкрддреНрдерд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдврд▓рд╛рди рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдореБрджреНрд░ рддрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рд╢реЗрд╖ рд╡рд┐рдХрд▓реНрдк рддрдЯ рд╕реЗ рджреВрд░ рдПрдХ рдЙрдерд▓рд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрднреА рднреА рдШрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред if (cell.Elevation == waterLevel - 1) { int cliffs = 0, slopes = 0; for ( HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++ ) { тАж } if (cliffs + slopes > 3) { terrain = 1; } else if (cliffs > 0) { terrain = 3; } else if (slopes > 0) { terrain = 0; } else { terrain = 1; } }
рддрдЯ рдХреА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛редрдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рдардВрдбреЗ рддрд╛рдкрдорд╛рди рд╕реАрдорд╛ рдореЗрдВ рд╣рд░реЗ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВред рдРрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдкреГрдереНрд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред if (terrain == 1 && temperature < temperatureBands[0]) { terrain = 2; } cell.TerrainTypeIndex = terrain;
рд╣рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХрд╛рд░реНрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ рдЬреЛ рдХрд┐ рдХрдИ рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде, рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рджрд┐рдЦрддреЗ рд╣реИрдВредunitypackageрднрд╛рдЧ 27: рдПрдХ рдХрд╛рд░реНрдб рдХреЛ рдлреЛрд▓реНрдб рдХрд░рдирд╛
- рд╣рдо рдХрд╛рд░реНрдб рдХреЛ рдЙрди рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдХреИрдорд░реЗ рдореЗрдВ рдХрд╛рд░реНрдб рдХреЛ рдХреЗрдиреНрджреНрд░рд┐рдд рдХрд░реЗрдВред
- рд╣рдо рд╕рдм рдХреБрдЫ рдзреНрд╡рд╕реНрдд рдХрд░ рджреЗрддреЗ рд╣реИрдВред
рдЗрд╕ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдкреВрд░реНрд╡реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗредрдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдПрдХрддрд╛ 2017.3.0p3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛редрдлреЛрд▓реНрдбрд┐рдВрдЧ рд╕реЗ рджреБрдирд┐рдпрд╛ рдЧреЛрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИредрддрд╣ рдХрд╛рд░реНрдб
рд╣рдорд╛рд░реЗ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╣рдореЗрд╢рд╛ рдПрдХ рдЖрдпрддрд╛рдХрд╛рд░ рдЖрдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рджреНрд╡реАрдк рдпрд╛ рдПрдХ рдкреВрд░реЗ рдорд╣рд╛рджреНрд╡реАрдк рдХрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреВрд░реЗ рдЧреНрд░рд╣ рдХрд╛ рдирд╣реАрдВред рдЧреНрд░рд╣ рдЧреЛрд▓рд╛рдХрд╛рд░ рд╣реИрдВ, рдЙрдирдХреА рдХреЛрдИ рдХрдареЛрд░ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЙрдирдХреА рд╕рддрд╣ рдкрд░ рдЧрддрд┐ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЖрдк рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдкрд░ рд▓реМрдЯ рдЖрдПрдВрдЧреЗредрд╣рдо рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиреНрд╕ рдХреА рдПрдХ рдЧреНрд░рд┐рдб рд▓рдкреЗрдЯ рдирд╣реАрдВ рд╕рдХрддреЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдУрд╡рд░рд▓реИрдк рдЕрд╕рдВрднрд╡ рд╣реИред рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ, рдЖрдЗрдХреЛрд╕рд╛рд╣реЗрдбреНрд░рд▓ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрд╛рд░рд╣ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдкреЗрдВрдЯрд╛рдЧрди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд┐рд╕реА рднреА рд╡рд┐рд░реВрдкрдг рдпрд╛ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд┐рдирд╛, рдореЗрд╖ рд╕рд┐рд▓реЗрдВрдбрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдирдХреНрд╢реЗ рдХреЗ рдкреВрд░реНрд╡реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рд░реИрдкрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИредрдПрдХ рд╕рд┐рд▓реЗрдВрдбрд░ рдПрдХ рдЧреЛрд▓реЗ рдХрд╛ рдПрдХ рдЦрд░рд╛рдм рдЕрдиреБрдорд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдбрдВрдбреЗ рдХрд╛ рдореЙрдбрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдХрдИ рдЧреЗрдо рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреВрд░реНрд╡ рд╕реЗ рдкрд╢реНрдЪрд┐рдо рдХреА рдУрд░ рдореЙрдбрд▓ рдЧреНрд░рд╣ рдХреЗ рдирдХреНрд╢реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИред рдзреНрд░реБрд╡реАрдп рдХреНрд╖реЗрддреНрд░ рдмрд╕ рдЦреЗрд▓ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВредрдЙрддреНрддрд░ рдФрд░ рджрдХреНрд╖рд┐рдг рдХреА рдУрд░ рдХреИрд╕реЗ рдореБрдбрд╝реЗрдВ?, . , , . -, -. .
рдмреЗрд▓рдирд╛рдХрд╛рд░ рддрд╣ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рд╕рддрд╣ рдФрд░ рдЗрд╕ рдкрд░ рд╣рд░ рдЪреАрдЬ рдХреЛ рдЭреБрдХрд╛рдХрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдмреЗрд▓рдирд╛рдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдкреВрд░реНрд╡реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рдХрд┐рдирд╛рд░реЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд╣реЛрдВред рдЕрдм рдЖрдк рдПрдХ рд╕рдкрд╛рдЯ рд╕рддрд╣ рдкрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рд▓реЗрдВрдбрд░ рдкрд░ рдЦреЗрд▓реЗрдВрдЧреЗред рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рд╕рдкрд╛рдЯ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдкрддрди рдХреЗ рд▓рд┐рдП рдЯреЗрд▓реАрдкреЛрд░реНрдЯреЗрд╢рди рдпрд╛ рджреЛрд╣рд░рд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЗрдо рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд▓реЗрдВрдЧреЗредрд╡реИрдХрд▓реНрдкрд┐рдХ рддрд╣
рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЧрд┐рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЗрд╕рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ - рд╕реНрдерд╛рдиреАрдп рдпрд╛ рдЧреНрд░рд╣ред рд╣рдо рдлреЛрд▓реНрдбрд┐рдВрдЧ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдХрд░ рджреЛрдиреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рдХрд┐рдП рдЧрдП рдкрддрди рдХреЗ рд╕рд╛рде рдирдпрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рдПрдВ рдореЗрдиреВ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝реЗрдВ редрдкрддрди рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдирдП рдирдХреНрд╢реЗ рдХрд╛ рдореЗрдиреВред рдЪрдпрди рдХреЛ рдЯреНрд░реИрдХрдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП NewMapMenu
рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ , рд╕рд╛рде рд╣реА рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рднреАред рд╕реНрд╡рд┐рдЪ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреЗ рдкрд░ рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рджреЗрдВред bool wrapping = true; тАж public void ToggleWrapping (bool toggle) { wrapping = toggle; }
рдЬрдм рдПрдХ рдирдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдиреНрдпреВрдирддрдо рд╡рд┐рдХрд▓реНрдк рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред void CreateMap (int x, int z) { if (generateMaps) { mapGenerator.GenerateMap(x, z, wrapping); } else { hexGrid.CreateMap(x, z, wrapping); } HexMapCamera.ValidatePosition(); Close(); }
рдЗрд╕реЗ рдмрджрд▓реЛ HexMapGenerator.GenerateMap
рддрд╛рдХрд┐ рдпрд╣ рдЗрд╕ рдирдП рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░реЗ HexGrid.CreateMap
ред public void GenerateMap (int x, int z, bool wrapping) { тАж grid.CreateMap(x, z, wrapping); тАж }
рдХреЛрдб> рд╣реЗрдХреНрд╕рдЧреНрд░рд┐рдб рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдврд╣ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ CreateMap
рд╕реЗрдЯ рдХрд░реЗрдВред рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЧреНрд░рд┐рдб рдХрдо рд╕реЗ рдХрдо рд╣реЛрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрдкрдХреЛ рдирд┐рд░реАрдХреНрд╖рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред public int cellCountX = 20, cellCountZ = 15; public bool wrapping; тАж public bool CreateMap (int x, int z, bool wrapping) { тАж cellCountX = x; cellCountZ = z; this.wrapping = wrapping; тАж }
HexGrid
CreateMap
рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЦреБрдж рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИ ред рд╣рдо рдмрд╕ рдкрддрди рдХреЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред void Awake () { тАж CreateMap(cellCountX, cellCountZ, wrapping); } тАж public void Load (BinaryReader reader, int header) { тАж if (x != cellCountX || z != cellCountZ) { if (!CreateMap(x, z, wrapping)) { return; } } тАж }
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧреНрд░рд┐рдб рддрд╣ рд╕реНрд╡рд┐рдЪ рдЪрд╛рд▓реВ рд╣реИредрдмрдЪрдд рдФрд░ рд▓реЛрдбрд┐рдВрдЧ
рдЪреВрдВрдХрд┐ рддрд╣ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рд╣реЗрдЬрд╛ рдФрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдирд┐рд░рдВрддрд░ рд╡реГрджреНрдзрд┐ рдХрд░реЗрдВ SaveLoadMenu
ред const int mapFileVersion = 5;
рдмрдЪрдд рдХрд░рддреЗ рд╕рдордп, HexGrid
рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдмреВрд▓рд┐рдпрди рдлреЛрд▓реНрдбрд┐рдВрдЧ рдорд╛рди рд▓рд┐рдЦрдиреЗ рджреЗрдВред public void Save (BinaryWriter writer) { writer.Write(cellCountX); writer.Write(cellCountZ); writer.Write(wrapping); тАж }
рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдкрдврд╝реЗрдВрдЧреЗред рдпрджрд┐ рдпрд╣ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдкреБрд░рд╛рдирд╛ рдХрд╛рд░реНрдб рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЗрд╕реЗ рддрд╣ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдпрджрд┐ рдпрд╣ рдЕрд▓рдЧ рд╣реИ, рддреЛ рд╣рдо рдореМрдЬреВрджрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХрд╛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рдпрд╣ рдЕрдиреНрдп рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИред public void Load (BinaryReader reader, int header) { ClearPath(); ClearUnits(); int x = 20, z = 15; if (header >= 1) { x = reader.ReadInt32(); z = reader.ReadInt32(); } bool wrapping = header >= 5 ? reader.ReadBoolean() : false; if (x != cellCountX || z != cellCountZ || this.wrapping != wrapping) { if (!CreateMap(x, z, wrapping)) { return; } } тАж }
рддрд╣ рдореЗрдЯреНрд░рд┐рдХреНрд╕
рдирдХреНрд╢реЗ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдореЗрдВ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордпред рдЗрд╕рд▓рд┐рдП, рд╡реЗ рдХреЛрдб рдХреЛ рдЫреВ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЧреНрд░рд┐рдб рдХрд╛ рд╕реАрдзрд╛ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕реЗ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ HexMetrics
ред рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд╣ рдЖрдХрд╛рд░ рд╡рд╛рд▓реЗ рдПрдХ рд╕реНрдерд┐рд░ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЛ рдЬреЛрдбрд╝реЗрдВред рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдмрдВрдзрдиреЗрд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВред public static int wrapSize; public static bool Wrapping { get { return wrapSize > 0; } }
рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рддрд╣ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ HexGrid.CreateMap
ред public bool CreateMap (int x, int z, bool wrapping) { тАж this.wrapping = wrapping; HexMetrics.wrapSize = wrapping ? cellCountX : 0; тАж }
рдЪреВрдБрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд▓реЗ рдореЛрдб рдореЗрдВ рдкреБрдирдГрд╕рдВрдпреЛрдЬрди рд╕реЗ рдирд╣реАрдВ рдмрдЪреЗрдЧрд╛, рд╣рдо рдЗрд╕реЗ рдЗрд╕рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ OnEnable
ред void OnEnable () { if (!HexMetrics.noiseSource) { HexMetrics.noiseSource = noiseSource; HexMetrics.InitializeHashGrid(seed); HexUnit.unitPrefab = unitPrefab; HexMetrics.wrapSize = wrapping ? cellCountX : 0; ResetVisibility(); } }
рд╕реЗрд▓ рдХреА рдЪреМрдбрд╝рд╛рдИ
рдмрдВрдзрдиреЗрд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдЕрдХреНрд╕рд░ рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ HexMetrics.innerRadius * 2f
, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╣рд░ рдмрд╛рд░ рдЧреБрдгрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдереЗред рддреЛ рдЪрд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ HexMetrics.innerDiameter
ред public const float innerRadius = outerRadius * outerToInner; public const float innerDiameter = innerRadius * 2f;
рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╡реНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, HexGrid.CreateCell
рдЬрдм рдПрдХ рдирдП рд╕реЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ред void CreateCell (int x, int z, int i) { Vector3 position; position.x = (x + z * 0.5f - z / 2) * HexMetrics.innerDiameter; тАж }
рджреВрд╕рд░реЗ, HexMapCamera
рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдореЗрдВред Vector3 ClampPosition (Vector3 position) { float xMax = (grid.cellCountX - 0.5f) * HexMetrics.innerDiameter; position.x = Mathf.Clamp(position.x, 0f, xMax); тАж }
рдФрд░ HexCoordinates
рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдореЗрдВ рднреА ред public static HexCoordinates FromPosition (Vector3 position) { float x = position.x / HexMetrics.innerDiameter; тАж }
unitypackageрдХрд╛рд░реНрдб рдХреЗрдВрджреНрд░рд┐рдд
рдЬрдм рдирдХреНрд╢рд╛ рдирд╣реАрдВ рдЧрд┐рд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреВрд░реНрд╡реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреНрд╖реИрддрд┐рдЬ рдХреЗрдВрджреНрд░ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рддрд╣ рдХрд╛рд░реНрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рдореЗрдВ рди рддреЛ рдкреВрд░реНрд╡реА рдФрд░ рди рд╣реА рдкрд╢реНрдЪрд┐рдореА рдЫреЛрд░ рд╣реИ, рди рд╣реА рдХреЗрдВрджреНрд░ред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрдВрджреНрд░ рд╡рд╣ рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдВ рдХреИрдорд░рд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рд╣рдореЗрд╢рд╛ рд╣рдорд╛рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛред рдлрд┐рд░, рд╣рдо рдЬрд╣рд╛рдВ рднреА рд╣реИрдВ, рд╣рдо рдирдХреНрд╢реЗ рдХреЗ рдкреВрд░реНрд╡реА рдпрд╛ рдкрд╢реНрдЪрд┐рдореА рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗредрдирдХреНрд╢рд╛ рдЯреБрдХрдбрд╝рд╛ рдХреЙрд▓рдо
рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдорд╛рдирдЪрд┐рддреНрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреИрдорд░реЗ рдХреА рдЧрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрддреНрд╡реЛрдВ рдХреА рдирд┐рдпреБрдХреНрддрд┐ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдкрд╢реНрдЪрд┐рдо рдХреА рдУрд░ рдмрдврд╝рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкреВрд░реНрд╡реА рднрд╛рдЧ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реИ рдЙрд╕реЗ рд▓реЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд╢реНрдЪрд┐рдореА рднрд╛рдЧ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд▓реЗ рдЬрд╛рдПрдВред рдпрд╣реА рдмрд╛рдд рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИредрдЖрджрд░реНрд╢ рд░реВрдк рдореЗрдВ, рдЬреИрд╕реЗ рд╣реА рдХреИрдорд░рд╛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдкрдбрд╝реЛрд╕реА рд╕реНрддрдВрдн рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рддреБрд░рдВрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рдмрд╕реЗ рджреВрд░ рдХреЗ рд╕реНрддрдВрдн рдХреЛ рджреВрд╕рд░реА рддрд░рдл рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ рдЗрддрдирд╛ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдкреВрд░реЗ рдирдХреНрд╢реЗ рдХреЗ рдЯреБрдХрдбрд╝реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдореЗрд╢ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдирдХреНрд╢реЗ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИредрдЪреВрдБрдХрд┐ рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рдВрдкреВрд░реНрдг рд╕реНрддрдВрднреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓ рд╕реНрддрдВрдн рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдХрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдореВрд╣рд┐рдд рдХрд░реЗрдВред рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рдЬреЛрдбрд╝реЗрдВ HexGrid
, рдФрд░ рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВрдЧреЗ CreateChunks
ред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Transform
ред рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдирдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд╛рди рдЧреНрд░рд┐рдб рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕реНрдерд╛рдиреАрдп рдореВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред Transform[] columns; тАж void CreateChunks () { columns = new Transform[chunkCountX]; for (int x = 0; x < chunkCountX; x++) { columns[x] = new GameObject("Column").transform; columns[x].SetParent(transform, false); } тАж }
рдЕрдм рдЯреБрдХрдбрд╝рд╛ рдЧреНрд░рд┐рдб рдХреЗ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓рдо рдХрд╛ рдПрдХ рдмрдЪреНрдЪрд╛ рдмрди рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред void CreateChunks () { тАж chunks = new HexGridChunk[chunkCountX * chunkCountZ]; for (int z = 0, i = 0; z < chunkCountZ; z++) { for (int x = 0; x < chunkCountX; x++) { HexGridChunk chunk = chunks[i++] = Instantiate(chunkPrefab); chunk.transform.SetParent(columns[x], false); } } }
рдЦрдВрдб рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рдмрд╛рдВрдЯреЗ рдЧрдПредрдЪреВрдБрдХрд┐ рд╕рднреА рдЯреБрдХрдбрд╝реЗ рдЕрдм рд╕реНрддрдВрднреЛрдВ рдХреЗ рдмрдЪреНрдЪреЗ рдмрди рдЧрдП рд╣реИрдВ, CreateMap
рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА рд╕реНрддрдВрднреЛрдВ рдХреЛ рд╕реАрдзреЗ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЯреБрдХрдбрд╝реЗ рдирд╣реАрдВред рддреЛ рд╣рдо рдмреЗрдЯреА рдХреЗ рдЯреБрдХрдбрд╝реЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрдВрдЧреЗред public bool CreateMap (int x, int z, bool wrapping) { тАж if (columns != null) { for (int i = 0; i < columns.Length; i++) { Destroy(columns[i].gameObject); } } тАж }
рдЯреЗрд▓реАрдкреЛрд░реНрдЯ рдХреЙрд▓рдо
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рддрд┐ X рдХреЗ рд╕рд╛рде HexGrid
рдирдИ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ CenterMap
ред рдпреВрдирд┐рдЯреА рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдЯреБрдХрдбрд╝реЗ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреЙрд▓рдо рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдмрджрд▓реЗрдВред рдпрд╣ рдЙрд╕ рд╕реНрддрдВрдн рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдХреИрдорд░рд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдХреЗрдВрджреНрд░ рд╕реНрддрдВрдн рд╣реЛрдЧрд╛ред public void CenterMap (float xPosition) { int centerColumnIndex = (int) (xPosition / (HexMetrics.innerDiameter * HexMetrics.chunkSizeX)); }
рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рджреГрд╢реНрдп рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬрдм рдХреЗрдВрджреНрд░реАрдп рд╕реНрддрдВрдн рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдмрджрд▓рддрд╛ рд╣реИред рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдореИрджрд╛рди рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рддреЗ рд╕рдордп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди when1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдирдП рдорд╛рдирдЪрд┐рддреНрд░ рд╣рдореЗрд╢рд╛ рдХреЗрдВрджреНрд░рд┐рдд рд░рд╣реЗрдВред int currentCenterColumnIndex = -1; тАж public bool CreateMap (int x, int z, bool wrapping) { тАж this.wrapping = wrapping; currentCenterColumnIndex = -1; тАж } тАж public void CenterMap (float xPosition) { int centerColumnIndex = (int) (xPosition / (HexMetrics.innerDiameter * HexMetrics.chunkSizeX)); if (centerColumnIndex == currentCenterColumnIndex) { return; } currentCenterColumnIndex = centerColumnIndex; }
рдЕрдм рдЬрдм рд╣рдо рдХреЗрдВрджреНрд░реАрдп рд╕реНрддрдВрдн рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдШрдЯрд╛рдХрд░ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреА рдЖрдзреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбрд╝рдХрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реЗ рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЗрдВрджреНрд░рд┐рдд рд╕реНрддрдВрдн рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╕реЗ рдПрдХ рдХрджрдо рдЖрдЧреЗ рд╣реЛрдЧрд╛ред рдпрд╣ рдирдХреНрд╢реЗ рдХреЗ рд╕рдмрд╕реЗ рджреВрд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдХреЙрд▓рдо рдХреА рднрд░рдкрд╛рдИ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред currentCenterColumnIndex = centerColumnIndex; int minColumnIndex = centerColumnIndex - chunkCountX / 2; int maxColumnIndex = centerColumnIndex + chunkCountX / 2;
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЕрдзрд┐рдХрддрдо рдХреЙрд▓рдо рдЗрдВрдбреЗрдХреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рдпрд╛ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдиреНрдпреВрдирддрдо рд╢реВрдиреНрдп рддрднреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреИрдорд░рд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдХреЗрдВрджреНрд░ рдХреЗ рдкрд╛рд╕ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рдХрд╛рдо рд╕реНрддрдВрднреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдЗрди рд╕рд╛рдкреЗрдХреНрд╖ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдВред рдпрд╣ рд▓реВрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдХреЗ рд╕реНрдерд╛рдиреАрдп рдПрдХреНрд╕ рд╕рдордиреНрд╡рдп рдХреЛ рдмрджрд▓рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред int minColumnIndex = centerColumnIndex - chunkCountX / 2; int maxColumnIndex = centerColumnIndex + chunkCountX / 2; Vector3 position; position.y = position.z = 0f; for (int i = 0; i < columns.Length; i++) { position.x = 0f; columns[i].localPosition = position; }
рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдиреНрдпреВрдирддрдо рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХрдо рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЗрдВрджреНрд░ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдЙрд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рджреВрд╕рд░реА рдУрд░ рдЯреЗрд▓реАрдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрдкрдиреЗ рдПрдХреНрд╕ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╕рдордиреНрд╡рдпрд┐рдд рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдпрджрд┐ рдХреЙрд▓рдо рдЗрдВрдбреЗрдХреНрд╕ рдЕрдзрд┐рдХрддрдо рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдпрд╣ рдХреЗрдВрджреНрд░ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рддрд░рдл рдЯреЗрд▓реАрдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред for (int i = 0; i < columns.Length; i++) { if (i < minColumnIndex) { position.x = chunkCountX * (HexMetrics.innerDiameter * HexMetrics.chunkSizeX); } else if (i > maxColumnIndex) { position.x = chunkCountX * -(HexMetrics.innerDiameter * HexMetrics.chunkSizeX); } else { position.x = 0f; } columns[i].localPosition = position; }
рдХреИрдорд░рд╛ рдЪрд╛рд▓
рдмрджрд▓реЗрдВ HexMapCamera.AdjustPosition
рддрд╛рдХрд┐ рдЬрдм рдПрдХ рдврд╣рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рд╡рд╣ ClampPosition
рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ WrapPosition
ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрд╕ рдирдИ рд╡рд┐рдзрд┐ рдХреЛ WrapPosition
рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдмрдирд╛рдПрдВ ClampPosition
, рд▓реЗрдХрд┐рди рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде: рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ CenterMap
ред void AdjustPosition (float xDelta, float zDelta) { тАж transform.localPosition = grid.wrapping ? WrapPosition(position) : ClampPosition(position); } тАж Vector3 WrapPosition (Vector3 position) { float xMax = (grid.cellCountX - 0.5f) * HexMetrics.innerDiameter; position.x = Mathf.Clamp(position.x, 0f, xMax); float zMax = (grid.cellCountZ - 1) * (1.5f * HexMetrics.outerRadius); position.z = Mathf.Clamp(position.z, 0f, zMax); grid.CenterMap(position.x); return position; }
рддрд╛рдХрд┐ рдХрд╛рд░реНрдб рддреБрд░рдВрдд рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛ, рд╣рдо OnEnable
рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ ValidatePosition
ред void OnEnable () { instance = this; ValidatePosition(); }
рдХреИрдорд░реЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рд▓реЗ рдЬрд╛рдПрдБредрдпрджреНрдпрдкрд┐ рд╣рдо рдЕрднреА рднреА рдХреИрдорд░реЗ рдХреА рдЖрд╡рд╛рдЬрд╛рд╣реА рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдореИрдк рдЕрдм рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреЗрдВрджреНрд░ рдХреЛ, рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдЯреЗрд▓реАрдкреЛрд░реНрдЯрд┐рдВрдЧ рд╕реНрддрдВрднреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдирдХреНрд╢реЗ рдФрд░ рдПрдХ рджреВрд░рд╕реНрде рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрдбрд╝реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░, рдЯреЗрд▓реАрдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХреИрдорд░реЗ рдХреЗ рджреЗрдЦрдиреЗ рдХреА рд╕реАрдорд╛ рдХреЗ рдмрд╛рд╣рд░ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдирдХреНрд╢реЗ рдХреЗ рдХреЗрд╡рд▓ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреВрд░реНрд╡реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдмреАрдЪ рдЕрднреА рддрдХ рдХреЛрдИ рддреНрд░рд┐рдХреЛрдг рдирд╣реАрдВ рд╣реИредрдХреИрдорд░реЗ рдХреЛ рдзреНрд╡рд╕реНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреЗ рдПрдХреНрд╕ рд╕рдордиреНрд╡рдп рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ WrapPosition
ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд╢реВрдиреНрдп рдХреЗ рдиреАрдЪреЗ рд░рд╣рддреЗ рд╣реБрдП, рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЪреМрдбрд╝рд╛рдИ рджреНрд╡рд╛рд░рд╛ X рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдмрдврд╝рд╛рддреЗ рд░рд╣реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдХрдо рдХрд░реЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдмрдбрд╝рд╛ рд╣реИред Vector3 WrapPosition (Vector3 position) {
рд░реЛрд▓-рдЕрдк рдХреИрдорд░рд╛ рдирдХреНрд╢реЗ рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИредрдмрдВрдзрдиреЗрд╡рд╛рд▓рд╛ shader рдмрдирд╛рд╡рдЯ
рддреНрд░рд┐рдХреЛрдгреАрдп рд╕реНрдерд╛рди рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдЧреЗрдо рдореЛрдб рдореЗрдВ рдХреИрдорд░реЗ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдирд╛ рдЕрдЧреЛрдЪрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░, рд╕реНрдерд▓рд╛рдХреГрддрд┐ рдФрд░ рдкрд╛рдиреА рдХреЗ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдПрдХ рджреГрд╢реНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрди рдмрдирд╛рд╡рдЯреЛрдВ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЯреБрдХрдбрд╝реЗ рдХреЗ рдПрдХ рддреЗрдЬ рдЯреЗрд▓реАрдкреЛрд░реНрдЯреЗрд╢рди рд╕реЗ рдмрдирд╛рд╡рдЯ рдХрд╛ рд╕реНрдерд╛рди рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИредрд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЙрди рдЯрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкреНрд░рдХрдЯ рдХрд░рдХреЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЧреБрдгрдХ рд╣реИрдВред рдЦрдВрдб рдЖрдХрд╛рд░ рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ HexMetrics
, рддреЛ рдЪрд▓рд┐рдП HexMetrics.cginc shader рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдЙрд╕рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдЪрд┐рдкрдХрд╛рдПрдБред рдореВрд▓ рдЯрд╛рдЗрд▓ рдкреИрдорд╛рдиреЗ рдХреА рдЧрдгрдирд╛ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдмрд╛рд╣рд░реА рддреНрд░рд┐рдЬреНрдпрд╛ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдиреНрдп рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рддрджрдиреБрд╕рд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред #define OUTER_TO_INNER 0.866025404 #define OUTER_RADIUS 10 #define CHUNK_SIZE_X 5 #define TILING_SCALE (1 / (CHUNK_SIZE_X * 2 * OUTER_RADIUS / OUTER_TO_INNER))
рдпрд╣ рд╣рдореЗрдВ 0.00866025404 рдХрд╛ рдЯрд╛рдЗрд▓рд┐рдВрдЧ рд╕реНрдХреЗрд▓ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕ рдорд╛рди рдХреЗ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЯреЗрд▓реАрдкреЛрд░реНрдЯреЗрд╢рди рд╕реЗ рдмрдирд╛рд╡рдЯ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдкреВрд░реНрд╡реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдмрдирд╛рд╡рдЯ рдореВрд▓ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрдирдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рддреНрд░рд┐рдХреЛрдгрд┐рдд рдХрд░реЗрдВрдЧреЗред рд╣рдордиреЗ рдЯреЗрд░реЗрдирд╢реЗрдбрд░ рдореЗрдВ рдпреВрд╡реА рд╕реНрдХреЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ 0.02 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рджреЛрдЧреБрдиреЗ рдЯрд╛рдЗрд▓рд┐рдВрдЧ рд╕реНрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ 0.01732050808 рд╣реИред рдкреИрдорд╛рдиреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдмрдирд╛рд╡рдЯ рдХрд╛ рд╕реНрддрд░ рдереЛрдбрд╝рд╛ рдмрдврд╝ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдиреЗрддреНрд░рд╣реАрди рдпрд╣ рдЕрджреГрд╢реНрдп рд╣реИред #include "../HexMetrics.cginc" #include "../HexCellData.cginc" тАж float4 GetTerrainColor (Input IN, int index) { float3 uvw = float3( IN.worldPos.xz * (2 * TILING_SCALE), IN.terrain[index] ); тАж }
рдпреВрд╡реА рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рд░реЛрдбреНрд╕ рд╢реЗрдбрд░ рдореЗрдВ , рд╣рдордиреЗ 0.025 рдХреЗ рдкреИрдорд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЯреНрд░рд┐рдкрд▓ рдЯрд╛рдЗрд▓рд┐рдВрдЧ рд╕реНрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ 0.02598076212 рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рдлреА рдХрд░реАрдм рд╣реИред #include "HexMetrics.cginc" #include "HexCellData.cginc" тАж void surf (Input IN, inout SurfaceOutputStandardSpecular o) { float4 noise = tex2D(_MainTex, IN.worldPos.xz * (3 * TILING_SCALE)); тАж }
рдЕрдВрдд рдореЗрдВ, Water.cginc рдкрд░ рд╣рдордиреЗ рдлреЛрдо рдХреЗ рд▓рд┐рдП 0.015 рдФрд░ рддрд░рдВрдЧреЛрдВ рдХреЗ рд▓рд┐рдП 0.025 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣рд╛рдВ рд╣рдо рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЛрдЧреБрдиреА рдФрд░ рддрд┐рдЧреБрдиреА рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред #include "HexMetrics.cginc" float Foam (float shore, float2 worldXZ, sampler2D noiseTex) { shore = sqrt(shore) * 0.9; float2 noiseUV = worldXZ + _Time.y * 0.25; float4 noise = tex2D(noiseTex, noiseUV * (2 * TILING_SCALE)); тАж } тАж float Waves (float2 worldXZ, sampler2D noiseTex) { float2 uv1 = worldXZ; uv1.y += _Time.y; float4 noise1 = tex2D(noiseTex, uv1 * (3 * TILING_SCALE)); float2 uv2 = worldXZ; uv2.x += _Time.y; float4 noise2 = tex2D(noiseTex, uv2 * (3 * TILING_SCALE)); тАж }
unitypackageрдкреВрд░реНрд╡ рдФрд░ рдкрд╢реНрдЪрд┐рдо рдХрд╛ рдорд┐рд▓рди
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдирдХреНрд╢реЗ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рджреГрд╢реНрдп рд╕рдмреВрдд рдкреВрд░реНрд╡реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рд╕реНрддрдВрднреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЕрдВрддрд░ рд╣реИред рдпрд╣ рдЕрдВрддрд░ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЕрднреА рддрдХ рддрд╣ рдХреЗ рдмрд┐рдирд╛ рдирдХреНрд╢реЗ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрд┐рдирд╛рд░реЛрдВ рдФрд░ рдХреЛрдгреЛрдВ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рддреНрд░рд┐рдХреЛрдгрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИредрдХрд┐рдирд╛рд░реЗ рдкрд░ рдЬрдЧрд╣редрддрд╣ рдкрдбрд╝реЛрд╕реА
рдкреВрд░реНрд╡-рдкрд╢реНрдЪрд┐рдо рдХрдиреЗрдХреНрд╢рди рдХреЛ рддреНрд░рд┐рдХреЛрдгреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкрдХреНрд╖реЛрдВ рдкрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рддрдХ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ HexGrid.CreateCell
рдИ - рдбрдмреНрд▓реНрдпреВ рдХрдиреЗрдХреНрд╢рди рдкрд┐рдЫрд▓реЗ рд╕реЗрд▓ рдХреЗ рд╕рд╛рде рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрджрд┐ рдПрдХреНрд╕ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдврд╣рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдореЛрдбрд╝рддреЗ рд╕рдордп рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрддрд┐рдо рд╕реЗрд▓ рдХреЛ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдЙрд╕реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред void CreateCell (int x, int z, int i) { тАж if (x > 0) { cell.SetNeighbor(HexDirection.W, cells[i - 1]); if (wrapping && x == cellCountX - 1) { cell.SetNeighbor(HexDirection.E, cells[i - x]); } } тАж }
рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдИ - рдбрдмреНрд▓реНрдпреВ рдХреЗ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдВрддрд░ рдХрд╛ рдПрдХ рдЖрдВрд╢рд┐рдХ рддреНрд░рд┐рдХреЛрдгреАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд░реВрдкрдг рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗредрдпреМрдЧрд┐рдХ рдИ - рдбрдмреНрд▓реНрдпреВредрд╣рдореЗрдВ NE - SW рд▓рд┐рдВрдХ рдХреЛ рднреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрддрд┐рдо рдХрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗрд▓ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдкрд┐рдЫрд▓реА рд╕реЗрд▓ рд╣реЛрдЧреАред if (z > 0) { if ((z & 1) == 0) { cell.SetNeighbor(HexDirection.SE, cells[i - cellCountX]); if (x > 0) { cell.SetNeighbor(HexDirection.SW, cells[i - cellCountX - 1]); } else if (wrapping) { cell.SetNeighbor(HexDirection.SW, cells[i - 1]); } } else { тАж } }
рдПрдирдИ - рдПрд╕рдбрдмреНрд▓реНрдпреВ рдХрдиреЗрдХреНрд╢рдиредрдЕрдВрдд рдореЗрдВ, рдПрд╕рдИ - рдПрдирдбрдмреНрд▓реНрдпреВ рдХрдиреЗрдХреНрд╢рди рдкрд╣рд▓реЗ рдХреЗ рдиреАрдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╖рдо рд░реЗрдЦрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗрд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред if (z > 0) { if ((z & 1) == 0) { тАж } else { cell.SetNeighbor(HexDirection.SW, cells[i - cellCountX]); if (x < cellCountX - 1) { cell.SetNeighbor(HexDirection.SE, cells[i - cellCountX + 1]); } else if (wrapping) { cell.SetNeighbor( HexDirection.SE, cells[i - cellCountX * 2 + 1] ); } } }
рдпреМрдЧрд┐рдХ рдПрд╕рдИ - рдПрдирдбрдмреНрд▓реНрдпреВредрд╢реЛрд░ рддрд╣
рдЕрдВрддрд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдирдХреНрд╢реЗ рдХреЗ рдкреВрд░реНрд╡реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╢реЛрд░ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЙрд╕реА рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реЗрдб рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡рд┐рд░реВрдкрдг рдХреЗ рд▓рд┐рдП 0.003 рдХрд╛ рд╢реЛрд░ рдкреИрдорд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЯрд╛рдЗрд▓рд┐рдВрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреИрдорд╛рдиреЗ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдиреЗ рдХреА рдЕрдзрд┐рдХ рдЕрд░рд╛рдЬрдХ рд╡рд┐рдХреГрддрд┐ рд╣реЛ рдЬрд╛рдПрдЧреАредрдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╢реЛрд░ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдирдХреНрд╢реЗ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╢реЛрд░ рдХрд╛ рдПрдХ рд╕рд╣рдЬ рдХреНрд╖реАрдгрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╕реЗрд▓ рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд┐рдХрдиреА рдХреНрд╖реАрдгрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд░реВрдкрдг рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЪрд┐рдХрдиреА рд╕рдВрдХреНрд░рдордг рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╢реЛрд░ рдереЛрдбрд╝рд╛ рд╕реБрдЪрд╛рд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд▓рдВрдмреА рджреВрд░реА рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рддреЗрдЬ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрдм рдЦрд╛рдорд┐рдпреЛрдВ рдХреЗ рдПрдХ рдорд╛рдореВрд▓реА рд╡рд┐рд░реВрдкрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИредрддрд╛рдкрдорд╛рди рдореЗрдВ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?. , . , . , .
рдпрджрд┐ рд╣рдо рдХрд╛рд░реНрдб рдХреЛ рдирд╣реАрдВ рдЧрд┐рд░рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо HexMetrics.SampleNoise
рдПрдХ рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рд▓реЗрдХрд┐рди рдЬрдм рддрд╣ рдпрд╣ рдХреНрд╖реАрдгрди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирдореВрдирд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ рдПрдХ рдЪрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред public static Vector4 SampleNoise (Vector3 position) { Vector4 sample = noiseSource.GetPixelBilinear( position.x * noiseScale, position.z * noiseScale ); return sample; }
рдХрдо рд╕реЗ рдХрдо рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рджреВрд╕рд░реЗ рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдирдХреНрд╢реЗ рдХреЗ рдкреВрд░реНрд╡реА рднрд╛рдЧ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рджреВрд╕рд░реЗ рдирдореВрдиреЗ рдХреЛ рдкрд╢реНрдЪрд┐рдо рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред Vector4 sample = noiseSource.GetPixelBilinear( position.x * noiseScale, position.z * noiseScale ); if (Wrapping && position.x < innerDiameter) { Vector4 sample2 = noiseSource.GetPixelBilinear( (position.x + wrapSize * innerDiameter) * noiseScale, position.z * noiseScale ); }
рдПрдХ рд╕реЗрд▓ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рдкрд╢реНрдЪрд┐рдореА рд╕реЗ рдкреВрд░реНрд╡реА рднрд╛рдЧ рдореЗрдВ рд╕рд░рд▓ рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╖реАрдгрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред if (Wrapping && position.x < innerDiameter) { Vector4 sample2 = noiseSource.GetPixelBilinear( (position.x + wrapSize * innerDiameter) * noiseScale, position.z * noiseScale ); sample = Vector4.Lerp( sample2, sample, position.x * (1f / innerDiameter) ); }
рд╢реЛрд░ рдорд┐рд╢реНрд░рдг, рдПрдХ рдЕрдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рдиредрдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рд╕рдЯреАрдХ рдореИрдЪ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрд╡ рдХреА рдУрд░ рдХреА рдХреБрдЫ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдирдХрд╛рд░рд╛рддреНрдордХ X рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдкрд░реНрдХ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рд╕рдВрдХреНрд░рдордг рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд╢реНрдЪрд┐рдо рдореЗрдВ рдЖрдзрд╛ рд╕реЗрд▓ рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред if (Wrapping && position.x < innerDiameter * 1.5f) { Vector4 sample2 = noiseSource.GetPixelBilinear( (position.x + wrapSize * innerDiameter) * noiseScale, position.z * noiseScale ); sample = Vector4.Lerp( sample2, sample, position.x * (1f / innerDiameter) - 0.5f ); }
рд╕рд╣реА рдХреНрд╖реАрдгрдиредрд╕реЗрд▓ рдПрдбрд┐рдЯрд┐рдВрдЧ
рдЕрдм рдЬрдм рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди рд╕рд╣реА рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдФрд░ рддрд╣ рдХреЗ рд╕реАрдо рдкрд░ рд╕рдм рдХреБрдЫ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, teleported рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЧрд▓рдд рд╣реИрдВ рдФрд░ рдмрдбрд╝реЗ рдмреНрд░рд╢ рдПрдХ рд╕реАрдо рджреНрд╡рд╛рд░рд╛ рдХрд╛рдЯ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВредрдмреНрд░рд╢ рдЫрдВрдЯрдиреА рдХреА рд╣реИредрдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ HexCoordinates
рддрд╣ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рд╣рдо рдПрдХреНрд╕ рдХрд╛ рдорд┐рд▓рд╛рди рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдХреНрд╖реАрдп рд╕рдордиреНрд╡рдп X, Z рдХреЗ рдЖрдзреЗ рд╕рдордиреНрд╡рдп рдХреЛ рдШрдЯрд╛рдХрд░ рдСрдлрд╝рд╕реЗрдЯ рдХреЗ X рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╢реВрдиреНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╢реВрдиреНрдп рд╕реЗ рдХрдо рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдирдХреНрд╢реЗ рдХреЗ рдкреВрд░реНрд╡ рдХреА рдУрд░ рд╕реЗ рд╕рдордиреНрд╡рдп рдХрд░рддреЗ рд╣реИрдВред рдЪреВрдБрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рджрд┐рд╢рд╛ рдореЗрдВ рд╣рдо рдЖрдзреЗ рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдЯреЗрд▓реАрдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЧреБрдирд╛ рдЖрдХрд╛рд░ рдХреЛ рдПрдХ рдмрд╛рд░ рдПрдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдФрд░ рдЬрдм рдСрдлрд╕реЗрдЯ рд╕рдордиреНрд╡рдп рддрд╣ рдЖрдХрд╛рд░ рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдШрдЯрд╛рд╡ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред public HexCoordinates (int x, int z) { if (HexMetrics.Wrapping) { int oX = x + z / 2; if (oX < 0) { x += HexMetrics.wrapSize; } else if (oX >= HexMetrics.wrapSize) { x -= HexMetrics.wrapSize; } } this.x = x; this.z = z; }
рдХрднреА-рдХрднреА рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдиреАрдЪреЗ рдпрд╛ рдКрдкрд░ рд╕рдВрдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВрдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдХреЛрдиреЗ рдХреЗ рд╡рд┐рд░реВрдкрдг рдХреЗ рдХрд╛рд░рдг, рдХрд░реНрд╕рд░ рдирдХреНрд╢реЗ рдХреЗ рдмрд╛рд╣рд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рдЬреЛ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо HexGrid.GetCell
рд╡реЗрдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ ред рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ GetCell
рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ред public HexCell GetCell (Vector3 position) { position = transform.InverseTransformPoint(position); HexCoordinates coordinates = HexCoordinates.FromPosition(position);
рддрдЯреАрдп рддрд╣
рддреНрд░рд┐рдХреЛрдг рдЗрд▓рд╛рдХреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реНрд╡-рдкрд╢реНрдЪрд┐рдо рд╕реАрдо рдХреЗ рд╕рд╛рде рдкрд╛рдиреА рдХреЗ рддрдЯ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдирд╣реАрдВ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ рд╣реИрдВ, рд╡реЗ рд╕рд┐рд░реНрдл рдкрддрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдлрд╝реНрд▓рд┐рдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдирдХреНрд╢реЗ рдХреЗ рджреВрд╕рд░реА рддрд░рдл рдЦрд┐рдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВредрдкрд╛рдиреА рдХреА рдзрд╛рд░ рдЧреБрдоредрдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрдЯ рдХреЗ рдкрд╛рдиреА рдХреЛ рддреНрд░рд┐рдХреЛрдгреАрдп рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдкрдбрд╝реЛрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд╛рд░реНрдб рдХреЗ рджреВрд╕рд░реА рддрд░рдл рд╕реНрдерд┐рдд рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо HexCell
рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдПрдХ рд╕реЗрд▓ рдХреЙрд▓рдо рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ ред public int ColumnIndex { get; set; }
рдЗрд╕ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ HexGrid.CreateCell
ред рдпрд╣ рдХреЗрд╡рд▓ рдЦрдВрдб рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдПрдХреНрд╕ рдХреЗ рд╕рдордиреНрд╡рдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред void CreateCell (int x, int z, int i) { тАж cell.Index = i; cell.ColumnIndex = x / HexMetrics.chunkSizeX; тАж }
рдЕрдм рд╣рдо рдпрд╣ HexGridChunk.TriangulateWaterShore
рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдФрд░ рдЙрд╕рдХреЗ рдкрдбрд╝реЛрд╕реА рдХреЗ рдХреЙрд▓рдо рдЗрдВрдбреЗрдХреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдХреНрдпрд╛ рдХрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдкрдбрд╝реЛрд╕реА рдХреЗ рдХреЙрд▓рдо рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдПрдХ рдХрджрдо рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╣рдо рдкрд╢реНрдЪрд┐рдореА рддрд░рдл рд╣реИрдВ, рдФрд░ рдкрдбрд╝реЛрд╕реА рдкреВрд░реНрд╡реА рддрд░рдл рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕реА рдХреЛ рдкрд╢реНрдЪрд┐рдо рдХреА рдУрд░ рдореЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╡рд╣реА рдФрд░ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВред Vector3 center2 = neighbor.Position; if (neighbor.ColumnIndex < cell.ColumnIndex - 1) { center2.x += HexMetrics.wrapSize * HexMetrics.innerDiameter; } else if (neighbor.ColumnIndex > cell.ColumnIndex + 1) { center2.x -= HexMetrics.wrapSize * HexMetrics.innerDiameter; }
рддрдЯ рдХреА рдкрд╕рд▓рд┐рдпрд╛рдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдХреЛрдирд╛ рдирд╣реАрдВредрдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рддрдЯ рдХреА рдкрд╕рд▓рд┐рдпреЛрдВ рдХреА рджреЗрдЦрднрд╛рд▓ рдХреА, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ рдХреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╣рдореЗрдВ рдЕрдЧрд▓реЗ рдкрдбрд╝реЛрд╕реА рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред if (nextNeighbor != null) { Vector3 center3 = nextNeighbor.Position; if (nextNeighbor.ColumnIndex < cell.ColumnIndex - 1) { center3.x += HexMetrics.wrapSize * HexMetrics.innerDiameter; } else if (nextNeighbor.ColumnIndex > cell.ColumnIndex + 1) { center3.x -= HexMetrics.wrapSize * HexMetrics.innerDiameter; } Vector3 v3 = center3 + (nextNeighbor.IsUnderwater ? HexMetrics.GetFirstWaterCorner(direction.Previous()) : HexMetrics.GetFirstSolidCorner(direction.Previous())); тАж }
рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдШреБрдорд╛рд╡рджрд╛рд░ рддрдЯредрдХрд╛рд░реНрдб рдкреАрдврд╝реА
рдкреВрд░реНрд╡ рдФрд░ рдкрд╢реНрдЪрд┐рдо рдХреА рдУрд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирдХреНрд╢реЛрдВ рдХреА рдкреАрдврд╝реА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рддреЗ рд╕рдордп, рдкреАрдврд╝реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рднреА рдХрдо рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдФрд░ рдирдХреНрд╢реЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдЧреИрд░-рд╢реВрдиреНрдп рдореИрдк рдмреЙрд░реНрдбрд░ рдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рддрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИредрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдмрдбрд╝рд╛ рдирдХреНрд╢рд╛ 1208905299ред рддрд╣ рдХреЗ рд╕рд╛рде рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛редрдиреНрдпреВрдирддрдо рд╣реЛ рдирд╣реАрдВ рд╣реИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рднрд╛рд╡рдирд╛ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реАрдорд╛ рдПрдХреНрд╕ ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрдо рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд░реАрдЬрдирдмреЙрд░реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ редрдмрджрд▓реЗ HexMapGenerator.CreateRegions
рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреА рдЬрдЧрд╣ mapBorderX
рдкрд░ borderX
ред рдпрд╣ рдирдпрд╛ рдЪрд░ рдкрддрди рд╡рд┐рдХрд▓реНрдк рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ regionBorder
, рдпрд╛ mapBorderX
, рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ ред рдиреАрдЪреЗ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдЦрд╛рдПред int borderX = grid.wrapping ? regionBorder : mapBorderX; MapRegion region; switch (regionCount) { default: region.xMin = borderX; region.xMax = grid.cellCountX - borderX; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); break; тАж }
рдЗрд╕реА рд╕рдордп, рдХреНрд╖реЗрддреНрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрдм рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдкреВрд░реНрд╡ рдФрд░ рдкрд╢реНрдЪрд┐рдо рдХреА рдУрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдВред рдРрд╕реЗ рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓рд╛ рддрдм рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИред рджреВрд╕рд░рд╛ рддрдм рд╣реИ рдЬрдм рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреЛ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо borderX
рд╢реВрдиреНрдп рдХреЗ рдорд╛рди рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдЬреЛ рднреВрдорд┐ рдЬрдирддрд╛ рдХреЛ рдкреВрд░реНрд╡-рдкрд╢реНрдЪрд┐рдо рд╕реАрдо рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред switch (regionCount) { default: if (grid.wrapping) { borderX = 0; } region.xMin = borderX; region.xMax = grid.cellCountX - borderX; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); break; case 2: if (Random.value < 0.5f) { тАж } else { if (grid.wrapping) { borderX = 0; } region.xMin = borderX; region.xMax = grid.cellCountX - borderX; region.zMin = mapBorderZ; region.zMax = grid.cellCountZ / 2 - regionBorder; regions.Add(region); region.zMin = grid.cellCountZ / 2 + regionBorder; region.zMax = grid.cellCountZ - mapBorderZ; regions.Add(region); } break; тАж }
рдПрдХ рдХреНрд╖реЗрддреНрд░ рдврд╣ рд░рд╣рд╛ рд╣реИредрдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдВрддрд░ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рд╢реВрдиреНрдп рдкрд░ рдкреНрд░рддрд┐рд╢рддрддрд╛ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ редрдЬрдм рдХрдЯрд╛рд╡ рдЕрдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд░рд╛рд╣рдд рдкрд░ рдПрдХ рд╕реАрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредрдЕрдВрддрд░рд╛рд▓ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдо рд░рд╛рд╣рдд рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рд╕реЗрд▓ рд╕реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдХреЗрдВрджреНрд░ рддрдХ рдХреА рджреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирдХреНрд╢реЗ рдХреЗ рджреВрд╕рд░реА рддрд░рдл рдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдмрд╣реБрдд рджреВрд░ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рд▓рдЧрднрдЧ рдХрднреА рднреА рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдпрд╣ рдЧрд▓рдд рд╣реИред рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо HexCoordinates.DistanceTo
рдиреНрдпреВрдирддрдо рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВредрд╣рдо рдмреАрдЪ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ HexCoordinates
, рдкреНрд░рддреНрдпреЗрдХ рддреАрди рдЕрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рджреВрд░реА рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред Z рдХреЗ рд╕рд╛рде рдХреА рджреВрд░реА рд╣рдореЗрд╢рд╛ рд╕рд╣реА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рдореЗрдВ рдореЛрдбрд╝рдиреЗ рд╕реЗ X рдФрд░ Y рдХреА рджреВрд░реА рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИред рддреЛ рдЪрд▓рд┐рдП X + Y рдХреА рдПрдХ рдЕрд▓рдЧ рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред public int DistanceTo (HexCoordinates other) {
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд┐ рддрд╣ рдордирдорд╛рдиреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рджреВрд░реА рдмрдирд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪрд▓реЛ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП X + Y рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рд╣рдо рдкрд╢реНрдЪрд┐рдо рдХреА рдУрд░ рдПрдХ рдФрд░ рд╕рдордиреНрд╡рдп рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдорд╛рди рдореВрд▓ X + Y рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред int xy = (x < other.x ? other.x - x : x - other.x) + (Y < other.Y ? other.Y - Y : Y - other.Y); if (HexMetrics.Wrapping) { other.x += HexMetrics.wrapSize; int xyWrapped = (x < other.x ? other.x - x : x - other.x) + (Y < other.Y ? other.Y - Y : Y - other.Y); if (xyWrapped < xy) { xy = xyWrapped; } }
рдпрджрд┐ рдпрд╣ рдХрдо рджреВрд░реА рдХреА рдУрд░ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ рдХрдо рдореЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред if (HexMetrics.Wrapping) { other.x += HexMetrics.wrapSize; int xyWrapped = (x < other.x ? other.x - x : x - other.x) + (Y < other.Y ? other.Y - Y : Y - other.Y); if (xyWrapped < xy) { xy = xyWrapped; } else { other.x -= 2 * HexMetrics.wrapSize; xyWrapped = (x < other.x ? other.x - x : x - other.x) + (Y < other.Y ? other.Y - Y : Y - other.Y); if (xyWrapped < xy) { xy = xyWrapped; } } }
рдЕрдм рд╣рдо рд╣рдореЗрд╢рд╛ рдмрдВрдзреЗ рд╣реБрдП рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд╕рдмрд╕реЗ рдХрдо рджреВрд░реА рддрдп рдХрд░рддреЗ рд╣реИрдВред рдЗрд▓рд╛рдХреЗ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЕрдм рдПрдХ рд╕реАрдо рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рднреВрдорд┐ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЛ рдХрд░реНрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИредрдХрдЯрд╛рд╡ рдФрд░ рдХрдЯрд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рддрд╣ рд░рд╛рд╣рддредunitypackageрджреБрдирд┐рдпрд╛ рдХреА рдпрд╛рддреНрд░рд╛
рдореИрдк рдЬрдирд░реЗрд╢рди рдФрд░ рдЯреНрд░рд╛рдЗрдВрдЧреБрд▓реЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдм рд╕реНрдХреНрд╡рд╛рдбреНрд╕, рдЕрдиреНрд╡реЗрд╖рдг рдФрд░ рджреГрд╢реНрдпрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВредрдЯреЗрд╕реНрдЯ рд╕реАрд╡рди
рджреБрдирд┐рдпрд╛ рднрд░ рдореЗрдВ рдПрдХ рдЯреАрдо рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдкрд╣рд▓реА рдмрд╛рдзрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдЖрддреА рд╣реИ, рд╡рд╣ рд╣реИ рдирдХреНрд╢реЗ рдХрд╛ рдХрд┐рдирд╛рд░рд╛, рдЬрд┐рд╕реЗ рдЦреЛрдЬрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛редрдХрд╛рд░реНрдб рдХреЗ рд╕реАрдо рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИредрдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЕрдЪрд╛рдирдХ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд░реЛрдЬрд╝рдЧрд╛рд░ рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдирдХреНрд╢рд╛ рдХрдо рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдЙрддреНрддрд░ рдФрд░ рджрдХреНрд╖рд┐рдг рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдкреВрд░реНрд╡ рдФрд░ рдкрд╢реНрдЪрд┐рдо рдореЗрдВ рдирд╣реАрдВред HexGrid.CreateCell
рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдмрджрд▓реЗрдВ ред if (wrapping) { cell.Explorable = z > 0 && z < cellCountZ - 1; } else { cell.Explorable = x > 0 && z > 0 && x < cellCountX - 1 && z < cellCountZ - 1; }
рд░рд╛рд╣рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рджреГрд╢реНрдпрддрд╛
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рджреГрд╢реНрдпрддрд╛ рд╕реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдЗрд▓рд╛рдХреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд▓рд╛рдХреЗ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдврд╣рдиреЗ рд╕реЗ рдЕрдВрддрд┐рдо рд╕реЗрд▓ рдХреА рджреГрд╢реНрдпрддрд╛ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рдврд╣ рдирд╣реАрдВ рд░рд╣реА рдереАредрд╡рд╕реНрддреБрдУрдВ рдХреА рдЧрд▓рдд рджреГрд╢реНрдпрддрд╛редрдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ HexCellShaderData
рдХреНрд▓реИрдВрдк рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдирд╛рд╡рдЯ рддрд╣ рдореЛрдб рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрд╕рдХрд╛ рдХреНрд▓реИрдВрдк рдореЛрдб рдмрджрд▓реЗрдВред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рдпреВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Initialize
рд╣рдо wrapModeU
рдЗрд╕реЗ wrapModeV
рдЕрд▓рдЧ рд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ ред public void Initialize (int x, int z) { if (cellTexture) { cellTexture.Resize(x, z); } else { cellTexture = new Texture2D( x, z, TextureFormat.RGBA32, false, true ); cellTexture.filterMode = FilterMode.Point;
рд╕реНрдХреНрд╡рд╛рдб рдФрд░ рдХреЙрд▓рдо
рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдХрд╛рдЗрдпрд╛рдБ рдЕрднреА рддрдХ рдврд╣ рдирд╣реАрдВ рд░рд╣реА рд╣реИрдВред рдЬрд┐рд╕ рдХреЙрд▓рдо рдореЗрдВ рд╡реЗ рд╕реНрдерд┐рдд рд╣реИрдВ, рдЙрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрдХрд╛рдЗрдпрд╛рдВ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рд░рд╣рддреА рд╣реИрдВредрдЗрдХрд╛рдИ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рд╣реБрдИ рд╣реИ рдФрд░ рдЧрд▓рдд рддрд░рдл рд╣реИредрдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрддрдВрднреЛрдВ рдХреЗ рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред рдкрд╣рд▓реЗ, рд╣рдо рдЕрдм рдЙрдиреНрд╣реЗрдВ рдЧреНрд░рд┐рдб рдХреЗ рддрддреНрдХрд╛рд▓ рдмрдЪреНрдЪреЗ рдирд╣реАрдВ рдмрдирд╛рдПрдВрдЧреЗ HexGrid.AddUnit
ред public void AddUnit (HexUnit unit, HexCell location, float orientation) { units.Add(unit); unit.Grid = this;
рдЪреВрдВрдХрд┐ рдЗрдХрд╛рдЗрдпрд╛рдВ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рджреВрд╕рд░реЗ рдХреЙрд▓рдо рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдЙрдирдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо HexGrid
рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ MakeChildOfColumn
, рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдЗрд╕реЗ Transform
рдмрд╛рд▓ рддрддреНрд╡ рдХреЗ рдШрдЯрдХ рдФрд░ рдХреЙрд▓рдо рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ ред public void MakeChildOfColumn (Transform child, int columnIndex) { child.SetParent(columns[columnIndex], false); }
рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ HexUnit.Location
ред public HexCell Location { тАж set { тАж Grid.MakeChildOfColumn(transform, value.ColumnIndex); } }
рдЗрд╕рд╕реЗ рдЗрдХрд╛рдЗрдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЪрд▓рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдХреЙрд▓рдо рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ HexUnit.TravelPath
рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХреЙрд▓рдо рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдпрд╣ рдкрде рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реЗрд▓ рдХреЙрд▓рдо рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, рдпрд╛ рд╡рд░реНрддрдорд╛рди рдПрдХ рд╣реИ рдЕрдЧрд░ рдЗрд╕ рдХрджрдо рдХреЛ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред IEnumerator TravelPath () { Vector3 a, b, c = pathToTravel[0].Position; yield return LookAt(pathToTravel[1].Position);
рдЪрд╛рд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдЬрд╛рдВрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдЕрдЧрд▓реЗ рдХреЙрд▓рдо рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдСрд░реНрдбрд░ рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред int currentColumn = currentTravelLocation.ColumnIndex; float t = Time.deltaTime * travelSpeed; for (int i = 1; i < pathToTravel.Count; i++) { тАж Grid.IncreaseVisibility(pathToTravel[i], VisionRange); int nextColumn = currentTravelLocation.ColumnIndex; if (currentColumn != nextColumn) { Grid.MakeChildOfColumn(transform, nextColumn); currentColumn = nextColumn; } тАж }
рдпрд╣ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рд░реНрдб рдХреЗ рд╕реАрдо рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╕рдордп, рдЗрдХрд╛рдЗрдпрд╛рдВ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЧрд┐рд░рддреА рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдЕрдЪрд╛рдирдХ рдЧрд▓рдд рджрд┐рд╢рд╛ рдореЗрдВ рдмрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рд╕реАрдо рдХреЗ рд╕реНрдерд╛рди рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдЬрдм рд╡реЗ рдкреВрд░реЗ рдирдХреНрд╢реЗ рдкрд░ рдХреВрджрддреЗ рд╣реИрдВредрдкреВрд░реЗ рдирдХреНрд╢реЗ рдореЗрдВ рдШреБрдбрд╝рджреМрдбрд╝редрдпрд╣рд╛рдВ рд╣рдо рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░ рд╣рдо рд╡рдХреНрд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЯреБрдХрдбрд╝реА рдЪрд▓рддреА рд╣реИред рдпрджрд┐ рдЕрдЧрд▓рд╛ рдХреЙрд▓рдо рдкреВрд░реНрд╡ рдХреА рдУрд░ рдореБрдбрд╝рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рдХреНрд░ рдХреЛ рдкреВрд░реНрд╡ рдХреА рдУрд░ рднреА рдЯреЗрд▓реАрдкреЛрд░реНрдЯ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реА рддрд░рд╣ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдХреЗ рд▓рд┐рдПред рдЖрдкрдХреЛ рд╡рдХреНрд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ a
рдФрд░ b
, рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ c
ред for (int i = 1; i < pathToTravel.Count; i++) { currentTravelLocation = pathToTravel[i]; a = c; b = pathToTravel[i - 1].Position;
рддрд╣ рдХреЗ рд╕рд╛рде рдЖрдВрджреЛрд▓рдиредрдЖрдЦрд┐рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдпрд╣ рдкрд╣рд▓реА рд╕реЗрд▓ рдХреЛ рджреЗрдЦреЗрдЧрд╛, рддреЛ рдпрд╣ рд╕реНрдХреНрд╡рд╛рдб рдХреЗ рд╢реБрд░реБрдЖрддреА рдореЛрдбрд╝ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред рдпрджрд┐ рдпрд╣ рд╕реЗрд▓ рдкреВрд░реНрд╡-рдкрд╢реНрдЪрд┐рдо рд╕реАрдо рдХреЗ рджреВрд╕рд░реА рддрд░рдл рд╣реИ, рддреЛ рдпреВрдирд┐рдЯ рдЧрд▓рдд рджрд┐рд╢рд╛ рдореЗрдВ рджрд┐рдЦреЗрдЧрд╛редрдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдЙрддреНрддрд░ рдпрд╛ рджрдХреНрд╖рд┐рдг рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИред рдЖрдк рдкреВрд░реНрд╡ рдпрд╛ рдкрд╢реНрдЪрд┐рдо рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рдХрдЯрддрдо рджреВрд░реА рдХреЗ рдЕрдиреБрд░реВрдк рджрд┐рд╢рд╛ рдореЗрдВ рджреЗрдЦрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднреА рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ LookAt
редрдХрдо рд╕реЗ рдХрдо рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рд╕рд╛рдкреЗрдХреНрд╖ рджреВрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдпрд╣ рдирдХреНрд╢реЗ рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдЖрдзреЗ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкрд╢реНрдЪрд┐рдо рдХреА рдУрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдмрд┐рдВрджреБ рдкрд╢реНрдЪрд┐рдо рдХреЛ рдореЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рджреВрд░реА рдирдХреНрд╢реЗ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдЖрдзреА рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкреВрд░реНрд╡ рдХреА рдУрд░ рдврд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред IEnumerator LookAt (Vector3 point) { if (HexMetrics.Wrapping) { float xDistance = point.x - transform.localPosition.x; if (xDistance < -HexMetrics.innerRadius * HexMetrics.wrapSize) { point.x += HexMetrics.innerDiameter * HexMetrics.wrapSize; } else if (xDistance > HexMetrics.innerRadius * HexMetrics.wrapSize) { point.x -= HexMetrics.innerDiameter * HexMetrics.wrapSize; } } тАж }
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдиреНрдпреВрдирддрдо рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИред рдФрд░ рдпрд╣ рд╖рдЯреНрднреБрдЬ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдкрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕рдорд╛рдкрди рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдиреНрдп рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╖рдЯреНрднреБрдЬ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВред рд╢рд╛рдпрдж рдореИрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛редрдореИрдВрдиреЗ рдЕрдВрддрд┐рдо рдкреИрдХреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рдкреНрд▓реЗ рдореЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХреАрдВ, Rotation . . . 5.
рдореИрдВрдиреЗ рдЖрдЦрд┐рд░реА рдкреИрдХреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдЙрддрдиреЗ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИрдВ. - .
рдореИрдВрдиреЗ рдЖрдЦрд┐рд░реА рдкреИрдХреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рд╣реА рдХрд╛рд░реНрдб рдмрдирд╛рддрд╛ рд╣реИseed (1208905299), . , Use Fixed Seed .
unitypackage