рдпреВрдирд┐рдЯреА рд╣реЗрдХреНрд╕рд╛рдЧреЛрди рдореИрдкреНрд╕: рд╡реЙрдЯрд░, рд▓реИрдВрдбрдорд╛рд░реНрдХ рдФрд░ рдлреЛрд░реНрдЯреНрд╕ рд╡реЙрд▓

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

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

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

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

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

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

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

рднрд╛рдЧ 8: рдкрд╛рдиреА


  • рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрд╛рдиреА рдбрд╛рд▓реЗрдВред
  • рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдХреЛ рддреНрд░рд┐рдХреЛрдгрд┐рдд рдХрд░реЗрдВред
  • рдлреЛрдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░реНрдл рдмрдирд╛рдПрдВред
  • рдкрд╛рдиреА рдФрд░ рдирджрд┐рдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдПрдВред

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


рдкрд╛рдиреА рдЖ рд░рд╣рд╛ рд╣реИред

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


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

  public int WaterLevel { get { return waterLevel; } set { if (waterLevel == value) { return; } waterLevel = value; Refresh(); } } int waterLevel; 

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

рдмрд╛рдврд╝ рдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдБ


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

  public bool IsUnderwater { get { return waterLevel > elevation; } } 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рдкрд╛рдиреА рдХрд╛ рд╕реНрддрд░ рдФрд░ рдКрдВрдЪрд╛рдИ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕реЗрд▓ рдкрд╛рдиреА рд╕реЗ рдКрдкрд░ рдЙрда рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдкрд╛рдиреА рдХреА рдЕрд╕рд▓реА рд╕рддрд╣ рдЗрд╕ рдКрдВрдЪрд╛рдИ рд╕реЗ рдиреАрдЪреЗ рд╣реИред рдирджреА рдХреА рд╕рддрд╣реЛрдВ рдХреЗ рд╕рд╛рде, рдЙрд╕реА рдСрдлрд╕реЗрдЯ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - HexMetrics.riverSurfaceElevationOffset ред рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдПрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВред

 // public const float riverSurfaceElevationOffset = -0.5f; public const float waterElevationOffset = -0.5f; 

HexCell.RiverSurfaceY рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдирдП рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред рдлрд┐рд░ рд╣рдо рдмрд╛рдврд╝ рд╡рд╛рд▓реЗ рд╕реЗрд▓ рдХреА рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдкрд░ рдПрдХ рд╕рдорд╛рди рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

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

рдЬрд▓ рд╕рдВрдкрд╛рджрди


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

  int activeElevation; int activeWaterLevel; тАж bool applyElevation = true; bool applyWaterLevel = true; 

UI рдХреЗ рд╕рд╛рде рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВред

  public void SetApplyWaterLevel (bool toggle) { applyWaterLevel = toggle; } public void SetWaterLevel (float level) { activeWaterLevel = (int)level; } 

рдФрд░ рдкрд╛рдиреА рдХреЗ рд╕реНрддрд░ рдХреЛ EditCell ред

  void EditCell (HexCell cell) { if (cell) { if (applyColor) { cell.Color = activeColor; } if (applyElevation) { cell.Elevation = activeElevation; } if (applyWaterLevel) { cell.WaterLevel = activeWaterLevel; } тАж } } 

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


рдЬрд▓ рд╕реНрддрд░ рд╕реНрд▓рд╛рдЗрдбрд░ред

unitypackage

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


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

 Shader "Custom/Water" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" } LOD 200 CGPROGRAM #pragma surface surf Standard alpha #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; half _Glossiness; half _Metallic; fixed4 _Color; void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = _Color; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } ENDCG } FallBack "Diffuse" } 

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


рдкрд╛рдиреА рдХреА рд╕рд╛рдордЧреНрд░реАред

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



рдмрд╛рд▓ рд╡рд╕реНрддреБ рдЬрд▓ред

рдЗрд╕рдХреЗ рдмрд╛рдж, HexGridChunk рд╡реЙрдЯрд░ рдореЗрд╢ рд╕рдкреЛрд░реНрдЯ HexGridChunk ред

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

рдФрд░ рдЗрд╕реЗ рдкреНрд░реАрдлрд╝реИрдм рдмрдЪреНрдЪреЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред


рд╡рд╛рдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдкрд╛рдиреА рдХреЗ рд╣реЗрдХреНрд╕рд╛рдЧреЛрди


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

  void Triangulate (HexDirection direction, HexCell cell) { тАж if (cell.IsUnderwater) { TriangulateWater(direction, cell, center); } } void TriangulateWater ( HexDirection direction, HexCell cell, Vector3 center ) { } 

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

  void TriangulateWater ( HexDirection direction, HexCell cell, Vector3 center ) { center.y = cell.WaterSurfaceY; Vector3 c1 = center + HexMetrics.GetFirstSolidCorner(direction); Vector3 c2 = center + HexMetrics.GetSecondSolidCorner(direction); water.AddTriangle(center, c1, c2); } 


рдкрд╛рдиреА рдХреЗ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдиред

рдкрд╛рдиреА рдХреЗ рдпреМрдЧрд┐рдХ


рд╣рдо рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдПрдХ рдЪрддреБрд░реНрднреБрдЬ рдХреЗ рд╕рд╛рде рдкрд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

  water.AddTriangle(center, c1, c2); if (direction <= HexDirection.SE) { HexCell neighbor = cell.GetNeighbor(direction); if (neighbor == null || !neighbor.IsUnderwater) { return; } Vector3 bridge = HexMetrics.GetBridge(direction); Vector3 e1 = c1 + bridge; Vector3 e2 = c2 + bridge; water.AddQuad(c1, c2, e1, e2); } 


рдкрд╛рдиреА рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдХрдиреЗрдХреНрд╢рдиред

рдФрд░ рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХреЛрдиреЛрдВ рдХреЛ рднрд░реЗрдВред

  if (direction <= HexDirection.SE) { тАж water.AddQuad(c1, c2, e1, e2); if (direction <= HexDirection.E) { HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (nextNeighbor == null || !nextNeighbor.IsUnderwater) { return; } water.AddTriangle( c2, e2, c2 + HexMetrics.GetBridge(direction.Next()) ); } } 


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

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

рд╕реБрд░реАрд▓реЗ рдЬрд▓ рд╕реНрддрд░


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


рдЕрд╕рдВрдЧрдд рдЬрд▓ рд╕реНрддрд░ред

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

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

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

unitypackage

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


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


рдПрдХрджрдо рд╕рдкрд╛рдЯ рдкрд╛рдиреАред

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

  struct Input { float2 uv_MainTex; float3 worldPos; }; тАж void surf (Input IN, inout SurfaceOutputStandard o) { float2 uv = IN.worldPos.xz; uv.y += _Time.y; float4 noise = tex2D(_MainTex, uv * 0.025); float waves = noise.z; fixed4 c = saturate(_Color + waves); o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } 


рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдкрд╛рдиреА, рд╕рдордп ├Ч 10ред

рджреЛ рджрд┐рд╢рд╛рдПрдБ


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

  float2 uv1 = IN.worldPos.xz; uv1.y += _Time.y; float4 noise1 = tex2D(_MainTex, uv1 * 0.025); float2 uv2 = IN.worldPos.xz; uv2.x += _Time.y; float4 noise2 = tex2D(_MainTex, uv2 * 0.025); float waves = noise1.z + noise2.x; 

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

  float waves = noise1.z + noise2.x; waves = smoothstep(0.75, 2, waves); 


рджреЛ рджрд┐рд╢рд╛рдПрдБ, рд╕рдордп ├Ч резрежред

рдорд┐рд╢реНрд░рдг рдХреА рд▓рд╣рд░реЗрдВ


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

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

  float blendWave = sin((IN.worldPos.x + IN.worldPos.z) * 0.1 + _Time.y); 

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

  sin((IN.worldPos.x + IN.worldPos.z) * 0.1 + _Time.y); blendWave *= blendWave; float waves = noise1.z + noise2.x; waves = smoothstep(0.75, 2, waves); fixed4 c = blendWave; //saturate(_Color + waves); 


рдорд┐рд╢реНрд░рдг рдХреА рд▓рд╣рд░реЗрдВред

рдорд┐рдХреНрд╕рд┐рдВрдЧ рддрд░рдВрдЧреЛрдВ рдХреЛ рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛрдиреЛрдВ рдирдореВрдиреЛрдВ рд╕реЗ рдХреБрдЫ рд╢реЛрд░ рдорд┐рд▓рд╛рдПрдВред

  float blendWave = sin( (IN.worldPos.x + IN.worldPos.z) * 0.1 + (noise1.y + noise2.z) + _Time.y ); blendWave *= blendWave; 


рдорд┐рд╢реНрд░рдг рдХреА рд╡рд┐рдХреГрдд рддрд░рдВрдЧреЗрдВред

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

  float waves = lerp(noise1.z, noise1.w, blendWave) + lerp(noise2.x, noise2.y, blendWave); waves = smoothstep(0.75, 2, waves); fixed4 c = saturate(_Color + waves); 


рдорд┐рд╢реНрд░рдг рддрд░рдВрдЧреЛрдВ, рд╕рдордп ├Ч 2ред

unitypackage

рддрдЯ


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

  void TriangulateWater ( HexDirection direction, HexCell cell, Vector3 center ) { center.y = cell.WaterSurfaceY; HexCell neighbor = cell.GetNeighbor(direction); if (neighbor != null && !neighbor.IsUnderwater) { TriangulateWaterShore(direction, cell, neighbor, center); } else { TriangulateOpenWater(direction, cell, neighbor, center); } } void TriangulateOpenWater ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { Vector3 c1 = center + HexMetrics.GetFirstSolidCorner(direction); Vector3 c2 = center + HexMetrics.GetSecondSolidCorner(direction); water.AddTriangle(center, c1, c2); if (direction <= HexDirection.SE && neighbor != null) { // HexCell neighbor = cell.GetNeighbor(direction); // if (neighbor == null || !neighbor.IsUnderwater) { // return; // } Vector3 bridge = HexMetrics.GetBridge(direction); тАж } } void TriangulateWaterShore ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { } 


рддрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдИ рддреНрд░рд┐рднреБрдЬ рдирд╣реАрдВ рд╣реИред

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

  void TriangulateWaterShore ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { EdgeVertices e1 = new EdgeVertices( center + HexMetrics.GetFirstSolidCorner(direction), center + HexMetrics.GetSecondSolidCorner(direction) ); water.AddTriangle(center, e1.v1, e1.v2); water.AddTriangle(center, e1.v2, e1.v3); water.AddTriangle(center, e1.v3, e1.v4); water.AddTriangle(center, e1.v4, e1.v5); } 


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

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

  water.AddTriangle(center, e1.v4, e1.v5); Vector3 bridge = HexMetrics.GetBridge(direction); EdgeVertices e2 = new EdgeVertices( e1.v1 + bridge, e1.v5 + bridge ); water.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); water.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); water.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); water.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); 


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

рдЗрд╕реА рддрд░рд╣, рд╣рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдХреЛрдгреАрдп рддреНрд░рд┐рднреБрдЬ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

  water.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (nextNeighbor != null) { water.AddTriangle( e1.v5, e2.v5, e1.v5 + HexMetrics.GetBridge(direction.Next()) ); } 


рддрдЯ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд╕рд▓рд┐рдпреЛрдВ рдХреЗ рдХреЛрдиреЗред

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

рдпреБрд╡реА рддрдЯ


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

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

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

рдпрд╣ рдирдпрд╛ рдЬрд╛рд▓ TriangulateWaterShore рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

  void TriangulateWaterShore ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { тАж waterShore.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); waterShore.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); waterShore.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); waterShore.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (nextNeighbor != null) { waterShore.AddTriangle( e1.v5, e2.v5, e1.v5 + HexMetrics.GetBridge(direction.Next()) ); } } 

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


рдкрд╛рдиреА рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдпреВрд╡реА рд╕рд╛рдордЧреНрд░реАред

рд╡рд╛рдЯрд░ рд╢реЛрд░ рд╢реЗрдб рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдкрд╛рдиреА рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдпреВрд╡реА-рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗред

  fixed4 c = fixed4(IN.uv_MainTex, 1, 1); 

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


рддрдЯ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдЬрд╛рд▓ред

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

  waterShore.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); waterShore.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); waterShore.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); waterShore.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); waterShore.AddQuadUV(0f, 0f, 0f, 1f); waterShore.AddQuadUV(0f, 0f, 0f, 1f); waterShore.AddQuadUV(0f, 0f, 0f, 1f); waterShore.AddQuadUV(0f, 0f, 0f, 1f); HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (nextNeighbor != null) { waterShore.AddTriangle( e1.v5, e2.v5, e1.v5 + HexMetrics.GetBridge(direction.Next()) ); waterShore.AddTriangleUV( new Vector2(0f, 0f), new Vector2(0f, 1f), new Vector2(0f, 0f) ); } 


рддрдЯреЛрдВ рдкрд░ рд╕рдВрдХреНрд░рдордг рдЧрд▓рдд рд╣реИрдВред

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

  waterShore.AddTriangleUV( new Vector2(0f, 0f), new Vector2(0f, 1f), new Vector2(0f, nextNeighbor.IsUnderwater ? 0f : 1f) ); 


рддрдЯреЛрдВ рдкрд░ рд╕рдВрдХреНрд░рдордг рд╕рд╣реА рд╣реИрдВред

рддрдЯ рдкрд░ рдЭрд╛рдЧ


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

  void surf (Input IN, inout SurfaceOutputStandard o) { float shore = IN.uv_MainTex.y; float foam = shore; fixed4 c = saturate(_Color + foam); o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } 


рд░реИрдЦрд┐рдХ рдлреЛрдоред

рдлреЛрдо рдХреЛ рдЕрдзрд┐рдХ рд░реЛрдЪрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╕рд╛рдЗрдирд╕реЙрдЗрдб рдХреЗ рд╡рд░реНрдЧ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВред

  float foam = sin(shore * 10); foam *= foam * shore; 


рд▓реБрдкреНрдд рд╣реЛрддреА рд╕рд╛рдЗрдирд╕реЙрдЗрдб рд╕реНрдХреНрд╡рд╛рдпрд░ рдлреЛрдоред

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

  float shore = IN.uv_MainTex.y; shore = sqrt(shore); 


рдХрд┐рдирд╛рд░реЗ рдХреЗ рдкрд╛рд╕ рдЭрд╛рдЧ рдЧрд╛рдврд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

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

  float2 noiseUV = IN.worldPos.xz; float4 noise = tex2D(_MainTex, noiseUV * 0.015); float distortion = noise.x * (1 - shore); float foam = sin((shore + distortion) * 10); foam *= foam * shore; 


рд╡рд┐рдХреГрддрд┐ рдХреЗ рд╕рд╛рде рдлреЛрдоред

рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдЗрд╕ рд╕рдм рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдПрдХ рд╕рд╛рдЗрдирд╕реЙрдЗрдб рдФрд░ рд╡рд┐рдХреГрддрд┐рдпрд╛рдВ рджреЛрдиреЛрдВред

  float2 noiseUV = IN.worldPos.xz + _Time.y * 0.25; float4 noise = tex2D(_MainTex, noiseUV * 0.015); float distortion = noise.x * (1 - shore); float foam = sin((shore + distortion) * 10 - _Time.y); foam *= foam * shore; 


рдПрдирд┐рдореЗрдЯреЗрдб рдлреЛрдоред

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

  float distortion1 = noise.x * (1 - shore); float foam1 = sin((shore + distortion1) * 10 - _Time.y); foam1 *= foam1; float distortion2 = noise.y * (1 - shore); float foam2 = sin((shore + distortion2) * 10 + _Time.y + 2); foam2 *= foam2 * 0.7; float foam = max(foam1, foam2) * shore; 


рдЖрд╡рдХ рдФрд░ рдЖрд╡рд░реНрддреА рдлреЛрдоред

рд▓рд╣рд░реЛрдВ рдФрд░ рдлреЛрдо рдХрд╛ рдорд┐рд╢реНрд░рдг


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

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

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

 float Foam (float shore, float2 worldXZ, sampler2D noiseTex) { // float shore = IN.uv_MainTex.y; shore = sqrt(shore); float2 noiseUV = worldXZ + _Time.y * 0.25; float4 noise = tex2D(noiseTex, noiseUV * 0.015); float distortion1 = noise.x * (1 - shore); float foam1 = sin((shore + distortion1) * 10 - _Time.y); foam1 *= foam1; float distortion2 = noise.y * (1 - shore); float foam2 = sin((shore + distortion2) * 10 + _Time.y + 2); foam2 *= foam2 * 0.7; return max(foam1, foam2) * shore; } float Waves (float2 worldXZ, sampler2D noiseTex) { float2 uv1 = worldXZ; uv1.y += _Time.y; float4 noise1 = tex2D(noiseTex, uv1 * 0.025); float2 uv2 = worldXZ; uv2.x += _Time.y; float4 noise2 = tex2D(noiseTex, uv2 * 0.025); float blendWave = sin( (worldXZ.x + worldXZ.y) * 0.1 + (noise1.y + noise2.z) + _Time.y ); blendWave *= blendWave; float waves = lerp(noise1.z, noise1.w, blendWave) + lerp(noise2.x, noise2.y, blendWave); return smoothstep(0.75, 2, waves); } 

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

  #include "Water.cginc" sampler2D _MainTex; тАж void surf (Input IN, inout SurfaceOutputStandard o) { float waves = Waves(IN.worldPos.xz, _MainTex); fixed4 c = saturate(_Color + waves); o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } 

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

  #include "Water.cginc" sampler2D _MainTex; тАж void surf (Input IN, inout SurfaceOutputStandard o) { float shore = IN.uv_MainTex.y; float foam = Foam(shore, IN.worldPos.xz, _MainTex); float waves = Waves(IN.worldPos.xz, _MainTex); waves *= 1 - shore; fixed4 c = saturate(_Color + max(foam, waves)); o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } 


рдлреЛрдо рдФрд░ рддрд░рдВрдЧреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдгред

unitypackage

рдлрд┐рд░ рд╕реЗ рддрдЯреАрдп рдкрд╛рдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


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


рд▓рдЧрднрдЧ рдЫрд┐рдкрд╛ рд╣реБрдЖ рддрдЯреАрдп рдкрд╛рдиреАред

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

рдЕрдЦрдВрдбрддрд╛ рдЧреБрдгрд╛рдВрдХ 0.8 рд╣реИред рдкрд╛рдиреА рдХреЗ рдпреМрдЧрд┐рдХреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд╛рдиреА рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреЛ 0.6 рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

  public const float waterFactor = 0.6f; public static Vector3 GetFirstWaterCorner (HexDirection direction) { return corners[(int)direction] * waterFactor; } public static Vector3 GetSecondWaterCorner (HexDirection direction) { return corners[(int)direction + 1] * waterFactor; } 

рд╣рдо HexGridChunkрдкрд╛рдиреА рдХреЗ рдХреЛрдгреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдирдП рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ ред

  void TriangulateOpenWater ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { Vector3 c1 = center + HexMetrics.GetFirstWaterCorner(direction); Vector3 c2 = center + HexMetrics.GetSecondWaterCorner(direction); тАж } void TriangulateWaterShore ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { EdgeVertices e1 = new EdgeVertices( center + HexMetrics.GetFirstWaterCorner(direction), center + HexMetrics.GetSecondWaterCorner(direction) ); тАж } 


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

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

  public const float waterBlendFactor = 1f - waterFactor; public static Vector3 GetWaterBridge (HexDirection direction) { return (corners[(int)direction] + corners[(int)direction + 1]) * waterBlendFactor; } 

рдмрджрд▓реЛ HexGridChunkрддрд╛рдХрд┐ рд╡рд╣ рдирдИ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред

  void TriangulateOpenWater ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { тАж if (direction <= HexDirection.SE && neighbor != null) { Vector3 bridge = HexMetrics.GetWaterBridge(direction); тАж if (direction <= HexDirection.E) { тАж water.AddTriangle( c2, e2, c2 + HexMetrics.GetWaterBridge(direction.Next()) ); } } } void TriangulateWaterShore ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { тАж Vector3 bridge = HexMetrics.GetWaterBridge(direction); тАж HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (nextNeighbor != null) { waterShore.AddTriangle( e1.v5, e2.v5, e1.v5 + HexMetrics.GetWaterBridge(direction.Next()) ); тАж } } 


рдкрд╛рдиреА рдореЗрдВ рд▓рдВрдмреЗ рдкреБрд▓ред

рдкрд╛рдиреА рдФрд░ рдЬрдореАрди рдХреА рдкрд╕рд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ


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

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

 // Vector3 bridge = HexMetrics.GetWaterBridge(direction); Vector3 center2 = neighbor.Position; center2.y = center.y; EdgeVertices e2 = new EdgeVertices( center2 + HexMetrics.GetSecondSolidCorner(direction.Opposite()), center2 + HexMetrics.GetFirstSolidCorner(direction.Opposite()) ); тАж HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (nextNeighbor != null) { Vector3 center3 = nextNeighbor.Position; center3.y = center.y; waterShore.AddTriangle( e1.v5, e2.v5, center3 + HexMetrics.GetFirstSolidCorner(direction.Previous()) ); тАж } 


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

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

  HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (nextNeighbor != null) { // Vector3 center3 = nextNeighbor.Position; // center3.y = center.y; Vector3 v3 = nextNeighbor.Position + (nextNeighbor.IsUnderwater ? HexMetrics.GetFirstWaterCorner(direction.Previous()) : HexMetrics.GetFirstSolidCorner(direction.Previous())); v3.y = center.y; waterShore.AddTriangle(e1.v5, e2.v5, v3); waterShore.AddTriangleUV( new Vector2(0f, 0f), new Vector2(0f, 1f), new Vector2(0f, nextNeighbor.IsUnderwater ? 0f : 1f) ); } 


рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рд╕рд╣реА рдХреЛрдирд╛ред

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

  shore = sqrt(shore) * 0.9; 


рддреИрдпрд╛рд░ рдЭрд╛рдЧред

unitypackage

рдкрдирдбреБрдмреНрдмреА рдирджрд┐рдпрд╛рдБ


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


рдкрд╛рдиреА рдореЗрдВ рдмрд╣рдиреЗ рд╡рд╛рд▓реА рдирджрд┐рдпрд╛рдБред

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

  Tags { "RenderType"="Transparent" "Queue"="Transparent+1" } 


рд╣рдо рдирджрд┐рдпреЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрддреЗ рд╣реИрдВред

рдкрд╛рдиреА рдХреЗ рднреАрддрд░ рдЫрд┐рдкреА рдирджреА


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

  void TriangulateWithRiverBeginOrEnd ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж if (!cell.IsUnderwater) { bool reversed = cell.HasIncomingRiver; тАж } } void TriangulateWithRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж if (!cell.IsUnderwater) { bool reversed = cell.IncomingRiver == direction; тАж } } 

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

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


рдЕрдзрд┐рдХ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рдирджрд┐рдпрд╛рдБ рдирд╣реАрдВред

рдЭрд░рдиреЗ


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

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

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

  void TriangulateWaterfallInWater ( Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y1, float y2, float waterY ) { v1.y = v2.y = y1; v3.y = v4.y = y2; rivers.AddQuad(v1, v2, v3, v4); rivers.AddQuadUV(0f, 1f, 0.8f, 1f); } 

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

  if (!cell.IsUnderwater) { if (!neighbor.IsUnderwater) { TriangulateRiverQuad( e1.v2, e1.v4, e2.v2, e2.v4, cell.RiverSurfaceY, neighbor.RiverSurfaceY, 0.8f, cell.HasIncomingRiver && cell.IncomingRiver == direction ); } else if (cell.Elevation > neighbor.WaterLevel) { TriangulateWaterfallInWater( e1.v2, e1.v4, e2.v2, e2.v4, cell.RiverSurfaceY, neighbor.RiverSurfaceY, neighbor.WaterSurfaceY ); } } 

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

  if (!cell.IsUnderwater) { тАж } else if ( !neighbor.IsUnderwater && neighbor.Elevation > cell.WaterLevel ) { TriangulateWaterfallInWater( e2.v4, e2.v2, e1.v4, e1.v2, neighbor.RiverSurfaceY, cell.RiverSurfaceY, cell.WaterSurfaceY ); } 

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


рдЕрдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗред

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

  v1.y = v2.y = y1; v3.y = v4.y = y2; float t = (waterY - y2) / (y1 - y2); v3 = Vector3.Lerp(v3, v1, t); v4 = Vector3.Lerp(v4, v2, t); rivers.AddQuad(v1, v2, v3, v4); rivers.AddQuadUV(0f, 1f, 0.8f, 1f); 

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

  v1.y = v2.y = y1; v3.y = v4.y = y2; v1 = HexMetrics.Perturb(v1); v2 = HexMetrics.Perturb(v2); v3 = HexMetrics.Perturb(v3); v4 = HexMetrics.Perturb(v4); float t = (waterY - y2) / (y1 - y2); v3 = Vector3.Lerp(v3, v1, t); v4 = Vector3.Lerp(v4, v2, t); rivers.AddQuadUnperturbed(v1, v2, v3, v4); rivers.AddQuadUV(0f, 1f, 0.8f, 1f); 

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

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


рдЭрд░рдиреЗ рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред

unitypackage

рдореБрдВрд╣


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


рдирджреА рдЪреЛрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рдХреГрдд рдХрд┐рдП рдмрд┐рдирд╛ рддрдЯ рд╕реЗ рдорд┐рд▓рддреА рд╣реИред

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

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

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

  void TriangulateWaterShore ( HexDirection direction, HexCell cell, HexCell neighbor, Vector3 center ) { тАж if (cell.HasRiverThroughEdge(direction)) { TriangulateEstuary(e1, e2); } else { waterShore.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); waterShore.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); waterShore.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); waterShore.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); waterShore.AddQuadUV(0f, 0f, 0f, 1f); waterShore.AddQuadUV(0f, 0f, 0f, 1f); waterShore.AddQuadUV(0f, 0f, 0f, 1f); waterShore.AddQuadUV(0f, 0f, 0f, 1f); } тАж } void TriangulateEstuary (EdgeVertices e1, EdgeVertices e2) { } 

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

  void TriangulateEstuary (EdgeVertices e1, EdgeVertices e2) { waterShore.AddTriangle(e2.v1, e1.v2, e1.v1); waterShore.AddTriangle(e2.v5, e1.v5, e1.v4); waterShore.AddTriangleUV( new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 0f) ); waterShore.AddTriangleUV( new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 0f) ); } 


рдорд┐рд╢реНрд░рдг рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЯреНрд░реЗрдкреЗрдЬрд╝реЙрдЗрдбрд▓ рдЫреЗрджред

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


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

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

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

  public void AddTriangleUV2 (Vector2 uv1, Vector2 uv2, Vector3 uv3) { uv2s.Add(uv1); uv2s.Add(uv2); uv2s.Add(uv3); } public void AddQuadUV2 (Vector2 uv1, Vector2 uv2, Vector3 uv3, Vector3 uv4) { uv2s.Add(uv1); uv2s.Add(uv2); uv2s.Add(uv3); uv2s.Add(uv4); } public void AddQuadUV2 (float uMin, float uMax, float vMin, float vMax) { uv2s.Add(new Vector2(uMin, vMin)); uv2s.Add(new Vector2(uMax, vMin)); uv2s.Add(new Vector2(uMin, vMax)); uv2s.Add(new Vector2(uMax, vMax)); } 

рд░рд┐рд╡рд░ рд╢реИрдбрд░ рдлрдВрдХреНрд╢рди


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

 float River (float2 riverUV, sampler2D noiseTex) { float2 uv = riverUV; uv.x = uv.x * 0.0625 + _Time.y * 0.005; uv.y -= _Time.y * 0.25; float4 noise = tex2D(noiseTex, uv); float2 uv2 = riverUV; uv2.x = uv2.x * 0.0625 - _Time.y * 0.0052; uv2.y -= _Time.y * 0.23; float4 noise2 = tex2D(noiseTex, uv2); return noise.x * noise2.w; } 

рдЗрд╕ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рд╡рд░ рд╢реЗрдбрд░ рдмрджрд▓реЗрдВ ред

  #include "Water.cginc" sampler2D _MainTex; тАж void surf (Input IN, inout SurfaceOutputStandard o) { float river = River(IN.uv_MainTex, _MainTex); fixed4 c = saturate(_Color + river); тАж } 

рдореБрдБрд╣ рдХреА рд╡рд╕реНрддреБ


HexGridChunkрдореЗрд╖ рд╡рд╕реНрддреБ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдВрд╣ рдЬреЛрдбрд╝реЗрдВ ред

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

рдПрдХ рдЫрд╛рдпрд╛рджрд╛рд░, рд╕рд╛рдордЧреНрд░реА рдФрд░ рдореБрдВрд╣ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдПрдВ, рддрдЯ рдХреА рдирдХрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВред рдЗрд╕реЗ рдЦрдВрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реЗ UV рдФрд░ UV2 рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рд╡рд╕реНрддреБ рдЕрдиреБрдорд╛рдиред

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


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

  void TriangulateEstuary (EdgeVertices e1, EdgeVertices e2) { тАж estuaries.AddTriangle(e1.v3, e2.v2, e2.v4); estuaries.AddTriangleUV( new Vector2(0f, 0f), new Vector2(0f, 1f), new Vector2(0f, 1f) ); } 


рдордзреНрдп рддреНрд░рд┐рднреБрдЬред

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

  estuaries.AddQuad(e1.v2, e1.v3, e2.v1, e2.v2); estuaries.AddTriangle(e1.v3, e2.v2, e2.v4); estuaries.AddQuad(e1.v3, e1.v4, e2.v4, e2.v5); estuaries.AddQuadUV(0f, 0f, 0f, 1f); estuaries.AddTriangleUV( new Vector2(0f, 0f), new Vector2(0f, 1f), new Vector2(0f, 1f) ); estuaries.AddQuadUV(0f, 0f, 0f, 1f); 


рддреИрдпрд╛рд░ рд╣реИ рдЯреНрд░реЗрдкреЛрдЬреЙрдЗрдбред

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

  estuaries.AddQuad(e2.v1, e1.v2, e2.v2, e1.v3); estuaries.AddTriangle(e1.v3, e2.v2, e2.v4); estuaries.AddQuad(e1.v3, e1.v4, e2.v4, e2.v5); estuaries.AddQuadUV( new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 1f), new Vector2(0f, 0f) ); // estuaries.AddQuadUV(0f, 0f, 0f, 1f); 


рдШреБрдорд╛рдпрд╛ рд╣реБрдЖ рдХреНрд╡рд╛рдб, рд╕рдордорд┐рдд рдЬреНрдпрд╛рдорд┐рддрд┐

рдирджреА рдХрд╛ рдмрд╣рд╛рд╡


рдирджреА рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ UV2 рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдордзреНрдп рддреНрд░рд┐рднреБрдЬ рдХрд╛ рддрд▓ рдирджреА рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╕рдордиреНрд╡рдп U 0.5 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдирджреА рдкрд╛рдиреА рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдмрд╣рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╛рдПрдВ рдмрд┐рдВрджреБ рдХреЛ 1 рдХреЗ рдмрд░рд╛рдмрд░ рдпреВ рд╕рдордиреНрд╡рдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджрд╛рдИрдВ рдУрд░ 0 рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдпреВ рд╕рдордиреНрд╡рдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╣рдо рд╡рд░реНрддрдорд╛рди рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд░реВрдк 0 рдФрд░ 1 рдХреЛ Y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

  estuaries.AddTriangleUV2( new Vector2(0.5f, 1f), new Vector2(1f, 0f), new Vector2(0f, 0f) ); 

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

  estuaries.AddQuadUV2( new Vector2(1f, 0f), new Vector2(1f, 1f), new Vector2(1f, 0f), new Vector2(0.5f, 1f) ); estuaries.AddTriangleUV2( new Vector2(0.5f, 1f), new Vector2(1f, 0f), new Vector2(0f, 0f) ); estuaries.AddQuadUV2( new Vector2(0.5f, 1f), new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 0f) ); 


UV2 рдЯреНрд░реЗрдкреЛрдЬреЙрдЗрдбред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо UV2 рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдПрд╕реНрдЯреЗрд╕реНрдЯрд░ рд╢реЗрдбрд░ рдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕реМрдВрдк рджреЗрдВред рд╣рдо рдЗрдирдкреБрдЯ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдЗрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ float2 uv2_MainTexред

  struct Input { float2 uv_MainTex; float2 uv2_MainTex; float3 worldPos; }; тАж void surf (Input IN, inout SurfaceOutputStandard o) { float shore = IN.uv_MainTex.y; float foam = Foam(shore, IN.worldPos.xz, _MainTex); float waves = Waves(IN.worldPos.xz, _MainTex); waves *= 1 - shore; fixed4 c = fixed4(IN.uv2_MainTex, 1, 1); тАж } 


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

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

  void surf (Input IN, inout SurfaceOutputStandard o) { тАж float river = River(IN.uv2_MainTex, _MainTex); fixed4 c = saturate(_Color + river); тАж } 


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

рд╣рдордиреЗ рдирджрд┐рдпреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рд╣реИ рдХрд┐ рдЬрдм рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдХреЛ рддреНрд░рд┐рдХреЛрдгреАрдп рдХрд░рддреЗ рд╣реИрдВ, рддреЛ V рдирджреА рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 0.8 рд╕реЗ 1 рддрдХ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ 0 рд╕реЗ 1 рддрдХ рдирд╣реАрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рддрдЯреАрдп рдХрдиреЗрдХреНрд╢рди рд╕рд╛рдзрд╛рд░рдг рд╕реЗрд▓ рдХрдиреЗрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 50% рд╣реИред ред рдЗрд╕рд▓рд┐рдП, рдирджреА рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ 0.8 рд╕реЗ 1.1 рддрдХ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

  estuaries.AddQuadUV2( new Vector2(1f, 0.8f), new Vector2(1f, 1.1f), new Vector2(1f, 0.8f), new Vector2(0.5f, 1.1f) ); estuaries.AddTriangleUV2( new Vector2(0.5f, 1.1f), new Vector2(1f, 0.8f), new Vector2(0f, 0.8f) ); estuaries.AddQuadUV2( new Vector2(0.5f, 1.1f), new Vector2(0f, 1.1f), new Vector2(0f, 0.8f), new Vector2(0f, 0.8f) ); 



рдирджреА рдФрд░ рдореБрд╣рд╛рдирд╛ рдХрд╛ рд╕рдордХрд╛рд▓рд┐рдХ рдкреНрд░рд╡рд╛рд╣ред

рдкреНрд░рд╡рд╛рд╣ рд╕реЗрдЯрд┐рдВрдЧ


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

рдКрдкрд░реА рдпреВ рд╕рдордиреНрд╡рдп рдХреЛ рдирджреА рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдмрд╛рд╣рд░ рд╕реНрдерд┐рд░ рд░рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЗрдВ 0.5 рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдмрд╛рдИрдВ рдУрд░ 1.5 рд╣реИ, рджрд╛рдИрдВ рдУрд░ .50.5 рд╣реИред

рдЙрд╕реА рд╕рдордп, рд╣рдо рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдиреАрдЪреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдпреВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдПрдВ рдХреЛ 1 рд╕реЗ 0.7 рддрдХ рдФрд░ рджрд╛рдПрдВ рдХреЛ 0 рд╕реЗ 0.3 рддрдХ рдмрджрд▓реЗрдВред

  estuaries.AddQuadUV2( new Vector2(1.5f, 0.8f), new Vector2(0.7f, 1.1f), new Vector2(1f, 0.8f), new Vector2(0.5f, 1.1f) ); тАж estuaries.AddQuadUV2( new Vector2(0.5f, 1.1f), new Vector2(0.3f, 1.1f), new Vector2(0f, 0.8f), new Vector2(-0.5f, 0.8f) ); 



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

рд╡рдХреНрд░рддрд╛ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рди рдЪрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ V рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдмрджрд▓реЗрдВред рдЪреВрдВрдХрд┐ рдкрд╛рдиреА рдирджреА рдХреЗ рдЕрдВрдд рд╕реЗ рдмрд╣рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡реА рдКрдкрд░реА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ 1. рддрдХ рдмрдврд╝рд╛рдПрдВрдЧреЗ рдФрд░ рдПрдХ рдмреЗрд╣рддрд░ рд╡рдХреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рдирд┐рдЪрд▓реЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ 1.15 рддрдХ рдмрдврд╝рд╛рдПрдВрдЧреЗред

  estuaries.AddQuadUV2( new Vector2(1.5f, 1f), new Vector2(0.7f, 1.15f), new Vector2(1f, 0.8f), new Vector2(0.5f, 1.1f) ); estuaries.AddTriangleUV2( new Vector2(0.5f, 1.1f), new Vector2(1f, 0.8f), new Vector2(0f, 0.8f) ); estuaries.AddQuadUV2( new Vector2(0.5f, 1.1f), new Vector2(0.3f, 1.15f), new Vector2(0f, 0.8f), new Vector2(-0.5f, 1f) ); 



рдирджреА рдХрд╛ рдШреБрдорд╛рд╡рджрд╛рд░ рдХреЛрд░реНрд╕ред

рдирджреА рдФрд░ рддрдЯ рдорд┐рдХреНрд╕


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

  float shoreWater = max(foam, waves); float river = River(IN.uv2_MainTex, _MainTex); float water = lerp(shoreWater, river, IN.uv_MainTex.x); fixed4 c = saturate(_Color + water); 

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

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

  #pragma surface surf Standard alpha vertex:vert тАж struct Input { float2 uv_MainTex; float2 riverUV; float3 worldPos; }; тАж void vert (inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); o.riverUV = v.texcoord1.xy; } void surf (Input IN, inout SurfaceOutputStandard o) { тАж float river = River(IN.riverUV, _MainTex); тАж } 


рддрдЯ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдХреНрд╖реЗрдкред

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

  estuaries.AddQuadUV( new Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(0f, 0f) ); estuaries.AddTriangleUV( new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(1f, 1f) ); estuaries.AddQuadUV( new Vector2(0f, 0f), new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(0f, 1f) ); // estuaries.AddQuadUV(0f, 0f, 0f, 1f); 


рд╕рд╣реА рдорд┐рд╢реНрд░рдгред

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


рдПрдХреНрд╢рди рдпреВрдирд┐рдЯреАрдЬ рдореЗрдВ

рдЕрдиреБрдорд╛рди

рдЬрд▓ рдирд┐рдХрд╛рдпреЛрдВ рд╕реЗ рдмрд╣рдиреЗ рд╡рд╛рд▓реА рдирджрд┐рдпрд╛рдБ


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

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

  bool IsValidRiverDestination (HexCell neighbor) { return neighbor && ( elevation >= neighbor.elevation || waterLevel == neighbor.elevation ); } 

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

  public void SetOutgoingRiver (HexDirection direction) { if (hasOutgoingRiver && outgoingRiver == direction) { return; } HexCell neighbor = GetNeighbor(direction); // if (!neighbor || elevation < neighbor.elevation) { if (!IsValidRiverDestination(neighbor)) { return; } RemoveOutgoingRiver(); тАж } 

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

  void ValidateRivers () { if ( hasOutgoingRiver && !IsValidRiverDestination(GetNeighbor(outgoingRiver)) ) { RemoveOutgoingRiver(); } if ( hasIncomingRiver && !GetNeighbor(incomingRiver).IsValidRiverDestination(this) ) { RemoveIncomingRiver(); } } 

рд╣рдо рдЗрд╕ рдирдИ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреБрдгреЛрдВ ElevationрдФрд░ рдЧреБрдгреЛрдВ рдореЗрдВ рдХрд░реЗрдВрдЧреЗ WaterLevelред

  public int Elevation { тАж set { тАж // if ( // hasOutgoingRiver && // elevation < GetNeighbor(outgoingRiver).elevation // ) { // RemoveOutgoingRiver(); // } // if ( // hasIncomingRiver && // elevation > GetNeighbor(incomingRiver).elevation // ) { // RemoveIncomingRiver(); // } ValidateRivers(); тАж } } public int WaterLevel { тАж set { if (waterLevel == value) { return; } waterLevel = value; ValidateRivers(); Refresh(); } } 


рдирджреА рдХреА рдЭреАрд▓реЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдЬрд╛рдирд╛ рдФрд░ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ред

рдЬреНрд╡рд╛рд░ рдХреЛ рдореЛрдбрд╝реЛ


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

  void TriangulateEstuary ( EdgeVertices e1, EdgeVertices e2, bool incomingRiver ) { тАж } 

рд╣рдо рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЗрд╕ рдкрджреНрдзрддрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ TriangulateWaterShoreред

  if (cell.HasRiverThroughEdge(direction)) { TriangulateEstuary(e1, e2, cell.IncomingRiver == direction); } 

рдЕрдм рд╣рдореЗрдВ UV2 рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдмрджрд▓рдХрд░ рдирджреА рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рд╡рд░реНрддрдорд╛рди рдирджрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпреВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: becomes0.5 1.5 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, 0 1 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, 1 0 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ 1.5 and0.5 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

V рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде, рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВред рдпрджрд┐ рдЖрдк рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдордиреЗ рдЙрд▓реНрдЯреЗ рдирджреА рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ 0.8 0 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ 1 .20.2 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ 1.1 тИТ0.3 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ 1.15 .30.35 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

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

  void TriangulateEstuary ( EdgeVertices e1, EdgeVertices e2, bool incomingRiver ) { тАж if (incomingRiver) { estuaries.AddQuadUV2( new Vector2(1.5f, 1f), new Vector2(0.7f, 1.15f), new Vector2(1f, 0.8f), new Vector2(0.5f, 1.1f) ); estuaries.AddTriangleUV2( new Vector2(0.5f, 1.1f), new Vector2(1f, 0.8f), new Vector2(0f, 0.8f) ); estuaries.AddQuadUV2( new Vector2(0.5f, 1.1f), new Vector2(0.3f, 1.15f), new Vector2(0f, 0.8f), new Vector2(-0.5f, 1f) ); } else { estuaries.AddQuadUV2( new Vector2(-0.5f, -0.2f), new Vector2(0.3f, -0.35f), new Vector2(0f, 0f), new Vector2(0.5f, -0.3f) ); estuaries.AddTriangleUV2( new Vector2(0.5f, -0.3f), new Vector2(0f, 0f), new Vector2(1f, 0f) ); estuaries.AddQuadUV2( new Vector2(0.5f, -0.3f), new Vector2(0.7f, -0.35f), new Vector2(1f, 0f), new Vector2(1.5f, -0.2f) ); } } 


рдирджрд┐рдпреЛрдВ рдХрд╛ рд╕рд╣реА рдкрд╛рдареНрдпрдХреНрд░рдоред

unitypackage

рднрд╛рдЧ 9: рд░рд╛рд╣рдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ


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

рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдЗрд▓рд╛рдХреЗ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЗрдорд╛рд░рддреЛрдВ рдФрд░ рдкреЗрдбрд╝реЛрдВ рдЬреИрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред


рдЬрдВрдЧрд▓реЛрдВ, рдХреГрд╖рд┐ рднреВрдорд┐ рдФрд░ рд╢рд╣рд░реАрдХрд░рдг рдХреЗ рдмреАрдЪ рд╕рдВрдШрд░реНрд╖ред

рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ


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

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

рд╡рд╕реНрддреБ рдкреНрд░рдмрдВрдзрдХ


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

рд╣рдо рдПрдХ рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

 using UnityEngine; public class HexFeatureManager : MonoBehaviour { public void Clear () {} public void Apply () {} public void AddFeature (Vector3 position) {} } 

рдЕрдм рд╣рдо рдРрд╕реЗ рдШрдЯрдХ рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ HexGridChunkред рдлрд┐рд░ рдЖрдк рдЗрд╕реЗ рд╕рднреА рдмрдЪреНрдЪреЗ рддрддреНрд╡реЛрдВ рдХреА рддрд░рд╣ рддреНрд░рд┐рдХреЛрдгрд╛рд╕рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ HexMeshред

  public HexFeatureManager features; public void Triangulate () { terrain.Clear(); rivers.Clear(); roads.Clear(); water.Clear(); waterShore.Clear(); estuaries.Clear(); features.Clear(); for (int i = 0; i < cells.Length; i++) { Triangulate(cells[i]); } terrain.Apply(); rivers.Apply(); roads.Apply(); water.Apply(); waterShore.Apply(); estuaries.Apply(); features.Apply(); } 

рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд░рдЦрдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

  void Triangulate (HexCell cell) { for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { Triangulate(d, cell); } features.AddFeature(cell.Position); } 

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




рдПрдХ рд╡рд╕реНрддреБ рдкреНрд░рдмрдВрдзрдХ рдиреЗ рдЦрдВрдб рдкреНрд░реАрдлрд╝реИрдм рдореЗрдВ рдЬреЛрдбрд╝рд╛ред

рдкреНрд░реАрдлрд╝реИрдм рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕


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


рдкреНрд░реАрдлрд╝реИрдм рдХреНрдпреВрдмред

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

  public Transform featurePrefab; 


рдкреНрд░реАрдлреИрдм рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдореИрдиреЗрдЬрд░ред

рд╡рд╕реНрддреБ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛


рд╕рдВрд░рдЪрдирд╛ рддреИрдпрд╛рд░ рд╣реИ, рдФрд░ рд╣рдо рдЗрд▓рд╛рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ prefab рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ HexFeatureManager.AddFeatureрдФрд░ рдЙрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред

  public void AddFeature (Vector3 position) { Transform instance = Instantiate(featurePrefab); instance.localPosition = position; } 


рдЗрд▓рд╛рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгред

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

  public void AddFeature (Vector3 position) { Transform instance = Instantiate(featurePrefab); position.y += instance.localScale.y * 0.5f; instance.localPosition = position; } 


рд░рд╛рд╣рдд рдХреА рд╕рддрд╣ рдкрд░ рдХреНрдпреВрдмреНрд╕ред

рдпрджрд┐ рд╣рдо рджреВрд╕рд░реА рдЬрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
. , , . .

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

  instance.localPosition = HexMetrics.Perturb(position); 


рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд┐рдХреГрдд рд╕реНрдерд┐рддрд┐ред

рд░рд╛рд╣рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд┐рдирд╛рд╢


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

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

  Transform container; public void Clear () { if (container) { Destroy(container.gameObject); } container = new GameObject("Features Container").transform; container.SetParent(transform, false); } тАж public void AddFeature (Vector3 position) { Transform instance = Instantiate(featurePrefab); position.y += instance.localScale.y * 0.5f; instance.localPosition = HexMetrics.Perturb(position); instance.SetParent(container, false); } 

рд╕рдВрднрд╡рддрдГ, рд╣рд░ рдмрд╛рд░ рд░рд╛рд╣рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдирд╛ рдФрд░ рдирд╖реНрдЯ рдХрд░рдирд╛ рдЕрдХреНрд╖рдо рд╣реИред
, , . . . , , , . HexFeatureManager.Apply . . , , .

unitypackage

рд░рд╛рд╣рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕реНрдерд╛рди


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


рд╡рд╕реНрддреБрдПрдВ рд╣рд░ рдЬрдЧрд╣ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ HexGridChunk.TriangulateрдХреЛ рдЦрд╛рд▓реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реЗрд▓ рдЦрд╛рд▓реА рд╣реИред

  if (!cell.IsUnderwater && !cell.HasRiver && !cell.HasRoads) { features.AddFeature(cell.Position); } 


рд╕реАрдорд┐рдд рдЖрд╡рд╛рд╕ред

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


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

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

  void Triangulate (HexDirection direction, HexCell cell) { тАж if (cell.HasRiver) { тАж } else { TriangulateWithoutRiver(direction, cell, center, e); if (!cell.IsUnderwater && !cell.HasRoadThroughEdge(direction)) { features.AddFeature((center + e.v1 + e.v5) * (1f / 3f)); } } тАж } 


рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдирджрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдирд╣реАрдВред

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

  void TriangulateAdjacentToRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж if (!cell.IsUnderwater && !cell.HasRoadThroughEdge(direction)) { features.AddFeature((center + e.v1 + e.v5) * (1f / 3f)); } } 


рдирджрд┐рдпреЛрдВ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдПрдВ рджрд┐рдЦрд╛рдИ рджреАрдВред

рдХреНрдпрд╛ рдЗрддрдиреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?
, dynamic batching Unity. , . batch. ┬л ┬╗, . instancing, dynamic batching.

unitypackage

рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛


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

  public void AddFeature (Vector3 position) { Transform instance = Instantiate(featurePrefab); position.y += instance.localScale.y * 0.5f; instance.localPosition = HexMetrics.Perturb(position); instance.localRotation = Quaternion.Euler(0f, 360f * Random.value, 0f); instance.SetParent(container, false); } 


рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

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

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

рд╣реИрд╢ рдЯреЗрдмрд▓ рдмрдирд╛рдирд╛


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

  public const int hashGridSize = 256; static float[] hashGrid; public static void InitializeHashGrid () { hashGrid = new float[hashGridSize * hashGridSize]; for (int i = 0; i < hashGrid.Length; i++) { hashGrid[i] = Random.value; } } 

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

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

  public static void InitializeHashGrid (int seed) { hashGrid = new float[hashGridSize * hashGridSize]; Random.InitState(seed); for (int i = 0; i < hashGrid.Length; i++) { hashGrid[i] = Random.value; } } 

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

  Random.State currentState = Random.state; Random.InitState(seed); for (int i = 0; i < hashGrid.Length; i++) { hashGrid[i] = Random.value; } Random.state = currentState; 

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

  public int seed; void Awake () { HexMetrics.noiseSource = noiseSource; HexMetrics.InitializeHashGrid(seed); тАж } void OnEnable () { if (!HexMetrics.noiseSource) { HexMetrics.noiseSource = noiseSource; HexMetrics.InitializeHashGrid(seed); } } 

рд╕рд╛рдорд╛рдиреНрдп рдмреАрдЬ рдЪрд░ рд╣рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдмреАрдЬ рдорд╛рди рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреЛрдИ рднреА рдореВрд▓реНрдп рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛ред рдореИрдВрдиреЗ 1234 рдХреЛ рдЪреБрдирд╛ред


рдмреАрдЬ рдХрд╛ рдЪреБрдирд╛рд╡ред

рд╣реИрд╢ рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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

  public static float SampleHashGrid (Vector3 position) { int x = (int)position.x % hashGridSize; int z = (int)position.z % hashGridSize; return hashGrid[x + z * hashGridSize]; } 

рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ%?
, , тАФ . , тИТ4, тИТ3, тИТ2, тИТ1, 0, 1, 2, 3, 4 modulo 3 тИТ1, 0, тИТ2, тИТ1, 0, 1, 2, 0, 1.

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

  int x = (int)position.x % hashGridSize; if (x < 0) { x += hashGridSize; } int z = (int)position.z % hashGridSize; if (z < 0) { z += hashGridSize; } 

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

  public const float hashGridScale = 0.25f; public static float SampleHashGrid (Vector3 position) { int x = (int)(position.x * hashGridScale) % hashGridSize; if (x < 0) { x += hashGridSize; } int z = (int)(position.z * hashGridScale) % hashGridSize; if (z < 0) { z += hashGridSize; } return hashGrid[x + z * hashGridSize]; } 

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

  public void AddFeature (Vector3 position) { float hash = HexMetrics.SampleHashGrid(position); Transform instance = Instantiate(featurePrefab); position.y += instance.localScale.y * 0.5f; instance.localPosition = HexMetrics.Perturb(position); instance.localRotation = Quaternion.Euler(0f, 360f * hash, 0f); instance.SetParent(container, false); } 

рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреА рд╕реАрдорд╛


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

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

 using UnityEngine; public struct HexHash { public float a, b; public static HexHash Create () { HexHash hash; hash.a = Random.value; hash.b = Random.value; return hash; } } 

рдХреНрдпрд╛ рдЗрд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?
, , Unity. , .

рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ HexMetricsрддрд╛рдХрд┐ рдпрд╣ рдирдИ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред

  static HexHash[] hashGrid; public static void InitializeHashGrid (int seed) { hashGrid = new HexHash[hashGridSize * hashGridSize]; Random.State currentState = Random.state; Random.InitState(seed); for (int i = 0; i < hashGrid.Length; i++) { hashGrid[i] = HexHash.Create(); } Random.state = currentState; } public static HexHash SampleHashGrid (Vector3 position) { тАж } 

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

  public void AddFeature (Vector3 position) { HexHash hash = HexMetrics.SampleHashGrid(position); if (hash.a >= 0.5f) { return; } Transform instance = Instantiate(featurePrefab); position.y += instance.localScale.y * 0.5f; instance.localPosition = HexMetrics.Perturb(position); instance.localRotation = Quaternion.Euler(0f, 360f * hash.b, 0f); instance.SetParent(container, false); } 


рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдШрдирддреНрд╡ 50% рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

unitypackage

рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛


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

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

  public int UrbanLevel { get { return urbanLevel; } set { if (urbanLevel != value) { urbanLevel = value; RefreshSelfOnly(); } } } int urbanLevel; 

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

рдШрдирддреНрд╡ рд╕реНрд▓рд╛рдЗрдбрд░


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

  int activeUrbanLevel; тАж bool applyUrbanLevel; тАж public void SetApplyUrbanLevel (bool toggle) { applyUrbanLevel = toggle; } public void SetUrbanLevel (float level) { activeUrbanLevel = (int)level; } void EditCell (HexCell cell) { if (cell) { тАж if (applyWaterLevel) { cell.WaterLevel = activeWaterLevel; } if (applyUrbanLevel) { cell.UrbanLevel = activeUrbanLevel; } if (riverMode == OptionalToggle.No) { cell.RemoveRiver(); } тАж } } 

UI рдореЗрдВ рдПрдХ рдФрд░ рд╕реНрд▓рд╛рдЗрдбрд░ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВред рдореИрдВ рд╕реНрдХреНрд░реАрди рдХреЗ рджрд╛рдИрдВ рдУрд░ рдПрдХ рдирдпрд╛ рдкреИрдирд▓ рд▓рдЧрд╛рдКрдВрдЧрд╛ рддрд╛рдХрд┐ рдмрд╛рдПрдВ рдкреИрдирд▓ рдХреЛ рдУрд╡рд░рдлреНрд▓реЛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред

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



рд╢рд╣рд░реАрдХрд░рдг рд╕реНрд▓рд╛рдЗрдбрд░ред

рдереНрд░реЗрд╢реЛрд▓реНрдб рдкрд░рд┐рд╡рд░реНрддрди


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

рд╢рд╣рд░реАрдХрд░рдг рдХреЗ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ 0.25 рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рдВрдШрди рдХреЗ рд▓рд┐рдП рдирдП рд╕реАрдорд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЗ рд╕рд╛рде 25% рдмрдврд╝ рдЬрд╛рдПрдЧреАред

  public void AddFeature (HexCell cell, Vector3 position) { HexHash hash = HexMetrics.SampleHashGrid(position); if (hash.a >= cell.UrbanLevel * 0.25f) { return; } тАж } 

рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ HexGridChunkред

  void Triangulate (HexCell cell) { тАж if (!cell.IsUnderwater && !cell.HasRiver && !cell.HasRoads) { features.AddFeature(cell, cell.Position); } } void Triangulate (HexDirection direction, HexCell cell) { тАж if (!cell.IsUnderwater && !cell.HasRoadThroughEdge(direction)) { features.AddFeature(cell, (center + e.v1 + e.v5) * (1f / 3f)); } тАж } тАж void TriangulateAdjacentToRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж if (!cell.IsUnderwater && !cell.HasRoadThroughEdge(direction)) { features.AddFeature(cell, (center + e.v1 + e.v5) * (1f / 3f)); } } 


рд╢рд╣рд░реАрдХрд░рдг рдШрдирддреНрд╡ рд╕реНрддрд░ рдЦреАрдВрдЪрдирд╛ред

unitypackage

рд░рд╛рд╣рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХрдИ prefabs


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

рд╣рдо рдЦреЗрддреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ featurePrefabрдореЗрдВ HexFeatureManagerрдФрд░ prefabs рд╢рд╣рд░реАрдХрд░рдг рдХреА рдПрдХ рд╕рд░рдгреА рд╕реЗ рдмрджрд▓ рджреЗрдВред рдЙрдкрдпреБрдХреНрдд рдкреНрд░реАрдлрд╝реИрдм рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╢рд╣рд░реАрдХрд░рдг рдХреЗ рд╕реНрддрд░ рд╕реЗ рдПрдХ рдХреЛ рдШрдЯрд╛рдПрдВрдЧреЗ рдФрд░ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

 <del>// public Transform featurePrefab;</del> public Transform[] urbanPrefabs; public void AddFeature (HexCell cell, Vector3 position) { тАж Transform instance = Instantiate(urbanPrefabs[cell.UrbanLevel - 1]); тАж } 

рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░реАрдлреИрдм рдХреЗ рджреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдмрдирд╛рдПрдВ, рдирд╛рдо рдмрджрд▓реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓ рджреЗрдВ рддрд╛рдХрд┐ рд╡реЗ рд╢рд╣рд░реАрдХрд░рдг рдХреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрддрд░реЛрдВ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдВред рд╕реНрддрд░ 1 рдПрдХ рдХрдо рдШрдирддреНрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЭреЛрдВрдкрдбрд╝реА рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реБрдП, рдПрдХ рдХрд┐рдирд╛рд░реЗ рдХреА рдЗрдХрд╛рдИ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рдШрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рд▓реЗрд╡рд▓ 2 рдкреНрд░реАрдлреИрдм рдХреЛ 1.5 (1.5, 2, 1.5) рд╕реНрдХреЗрд▓ рдХрд░ рджреВрдВрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рджреЛ рдордВрдЬрд┐рд▓рд╛ рдЗрдорд╛рд░рдд рдЬреИрд╕рд╛ рд▓рдЧреЗред рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА 3 рдЗрдорд╛рд░рддреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реНрдХреЗрд▓ (2, 5, 2) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред



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

рдкреНрд░реАрдлрд╝реИрдм рдорд┐рдХреНрд╕


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

рд╕реНрддрд░ 1 рдкрд░ рд╣рдо 40% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╢реЗрдХ рдХреЗ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреЛрдИ рджреВрд╕рд░реА рдЗрдорд╛рд░рддреЗрдВ рдирд╣реАрдВ рд╣реЛрдВрдЧреАред рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рд╣рдо рддреАрди рдореВрд▓реНрдпреЛрдВ (0.4, 0, 0) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрддрд░ 2 рдкрд░, рдмрдбрд╝реЗ рднрд╡рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЭрдЯрдХреЛрдВ рдХреЛ рдмрджрд▓реЗрдВ, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЭрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП 20% рдореМрдХрд╛ рдЬреЛрдбрд╝реЗрдВред рд╣рдо рдКрдВрдЪреА рдЗрдорд╛рд░рддреЗрдВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдпрд╣реА рд╣реИ, рд╣рдо рддреАрди рдореВрд▓реНрдпреЛрдВ (0.2, 0.4, 0) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрддрд░ 3 рдкрд░, рд╣рдо рдордзреНрдпрдо рдЗрдорд╛рд░рддреЛрдВ рдХреЛ рд▓рдВрдмреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рд╢реЗрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рд╢реЗрдХ рдХрд╛ рдПрдХ рдФрд░ 20% рдореМрдХрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рджрд╣рд▓реАрдЬ рдорд╛рди (0.2, 0.2, 0.4) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

рдпрд╣реА рд╣реИ, рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╢рд╣рд░реАрдХрд░рдг рдХреЗ рд╕реНрддрд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рд╣рдо рдореМрдЬреВрджрд╛ рдЗрдорд╛рд░рддреЛрдВ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЦрд╛рд▓реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдирдП рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдореМрдЬреВрджрд╛ рдЗрдорд╛рд░рдд рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрд╕реА рд╣реИрд╢ рдорд╛рди рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕реНрддрд░ 1 рдкрд░ 0 рдФрд░ 0.4 рдХреЗ рдмреАрдЪ рдХреЗ рд╣реИрд╢ рд╢реЗрдХ рдереЗ, рддреЛ рд╕реНрддрд░ 3 рдкрд░ рд╕рдорд╛рди рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдКрдВрдЪреА рдЗрдорд╛рд░рддреЗрдВ рдмрди рдЬрд╛рдПрдВрдЧреАред рд╕реНрддрд░ 3 рдкрд░, рдКрдБрдЪреА рдЗрдорд╛рд░рддреЛрдВ рдХреЛ 0-0.4 рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реИрд╢ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, 0.4-0.6 рдХреА рд╕реАрдорд╛ рдореЗрдВ рджреЛ рдордВрдЬрд┐рд▓рд╛ рдЗрдорд╛рд░рддреЗрдВ рдФрд░ 0.6-0.8 рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣рд┐рд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕реЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рддрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб (0.4, 0.6, 0.8) рдХреЗ рдЯреНрд░рд┐рдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрд╡рд▓ 2 рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рддрдм рдмрдиреЗрдВрдЧреЗ (0, 0.4, 0.6), рдФрд░ рд▓реЗрд╡рд▓ 1 рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб (0, 0, 0.4) рдмрди рдЬрд╛рдПрдВрдЧреЗред

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

  static float[][] featureThresholds = { new float[] {0.0f, 0.0f, 0.4f}, new float[] {0.0f, 0.4f, 0.6f}, new float[] {0.4f, 0.6f, 0.8f} }; public static float[] GetFeatureThresholds (int level) { return featureThresholds[level]; } 

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

  Transform PickPrefab (int level, float hash) { if (level > 0) { float[] thresholds = HexMetrics.GetFeatureThresholds(level - 1); for (int i = 0; i < thresholds.Length; i++) { if (hash < thresholds[i]) { return urbanPrefabs[i]; } } } return null; } 

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


рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд рдЖрджреЗрд╢ рдЙрд▓рдЯрд╛ред рдкреНрд░реАрдлрд╝реИрдм рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

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

  public void AddFeature (HexCell cell, Vector3 position) { HexHash hash = HexMetrics.SampleHashGrid(position); // if (hash.a >= cell.UrbanLevel * 0.25f) { // return; // } // Transform instance = Instantiate(urbanPrefabs[cell.UrbanLevel - 1]); Transform prefab = PickPrefab(cell.UrbanLevel, hash.a); if (!prefab) { return; } Transform instance = Instantiate(prefab); position.y += instance.localScale.y * 0.5f; instance.localPosition = HexMetrics.Perturb(position); instance.localRotation = Quaternion.Euler(0f, 360f * hash.b, 0f); instance.SetParent(container, false); } 


рдкреНрд░реАрдлрд╝реИрдмреНрд╕ рдХреЛ рдорд┐рд▓рд╛рдПрдВред

рд╕реНрддрд░ рднрд┐рдиреНрдирддрд╛


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

  public float a, b, c; public static HexHash Create () { HexHash hash; hash.a = Random.value; hash.b = Random.value; hash.c = Random.value; return hash; } 

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

  public Transform[][] urbanPrefabs; тАж Transform PickPrefab (int level, float hash, float choice) { if (level > 0) { float[] thresholds = HexMetrics.GetFeatureThresholds(level - 1); for (int i = 0; i < thresholds.Length; i++) { if (hash < thresholds[i]) { return urbanPrefabs[i][(int)(choice * urbanPrefabs[i].Length)]; } } } return null; } 

рдЪрд▓реЛ рджреВрд╕рд░реА рд╣реИрд╢ (рдмреА) рдХреЗ рдореВрд▓реНрдп рдкрд░ рд╣рдорд╛рд░реА рдкрд╕рдВрдж рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдкрдХреЛ B рд╕реЗ C рдХреА рдУрд░ рдореБрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  public void AddFeature (HexCell cell, Vector3 position) { HexHash hash = HexMetrics.SampleHashGrid(position); Transform prefab = PickPrefab(cell.UrbanLevel, hash.a, hash.b); if (!prefab) { return; } Transform instance = Instantiate(prefab); position.y += instance.localScale.y * 0.5f; instance.localPosition = HexMetrics.Perturb(position); instance.localRotation = Quaternion.Euler(0f, 360f * hash.c, 0f); instance.SetParent(container, false); } 

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

  public static HexHash Create () { HexHash hash; hash.a = Random.value * 0.999f; hash.b = Random.value * 0.999f; hash.c = Random.value * 0.999f; return hash; } 

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

 using UnityEngine; [System.Serializable] public struct HexFeatureCollection { public Transform[] prefabs; public Transform Pick (float choice) { return prefabs[(int)(choice * prefabs.Length)]; } } 

рд╣рдо HexFeatureManagerрдРрд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред

 // public Transform[][] urbanPrefabs; public HexFeatureCollection[] urbanCollections; тАж Transform PickPrefab (int level, float hash, float choice) { if (level > 0) { float[] thresholds = HexMetrics.GetFeatureThresholds(level - 1); for (int i = 0; i < thresholds.Length; i++) { if (hash < thresholds[i]) { return urbanCollections[i].Pick(choice); } } } return null; } 

рдЕрдм рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдШрдирддреНрд╡ рд╕реНрддрд░ рддрдХ рдХрдИ рдЗрдорд╛рд░рддреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╡реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рд╣рдореЗрдВ рдкреНрд░рддрд┐ рд╕реНрддрд░ рд╕рдорд╛рди рд░рд╛рд╢рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдкреНрд░рддрд┐ рд╕реНрддрд░ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рдирд┐рдЪрд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдЙрдирдХреЗ рд▓рд┐рдП рддрд░рд╛рдЬреВ (3.5, 3, 2), (2.75, 1.5, 1.5) рдФрд░ (1.75, 1, 1) рдЪреБрдирд╛ред



рдШрдирддреНрд╡ рд╕реНрддрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЗрдорд╛рд░рддреЗрдВред

unitypackage

рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдБ


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

  public int FarmLevel { get { return farmLevel; } set { if (farmLevel != value) { farmLevel = value; RefreshSelfOnly(); } } } public int PlantLevel { get { return plantLevel; } set { if (plantLevel != value) { plantLevel = value; RefreshSelfOnly(); } } } int urbanLevel, farmLevel, plantLevel; 

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

  int activeUrbanLevel, activeFarmLevel, activePlantLevel; bool applyUrbanLevel, applyFarmLevel, applyPlantLevel; тАж public void SetApplyFarmLevel (bool toggle) { applyFarmLevel = toggle; } public void SetFarmLevel (float level) { activeFarmLevel = (int)level; } public void SetApplyPlantLevel (bool toggle) { applyPlantLevel = toggle; } public void SetPlantLevel (float level) { activePlantLevel = (int)level; } тАж void EditCell (HexCell cell) { if (cell) { тАж if (applyUrbanLevel) { cell.UrbanLevel = activeUrbanLevel; } if (applyFarmLevel) { cell.FarmLevel = activeFarmLevel; } if (applyPlantLevel) { cell.PlantLevel = activePlantLevel; } тАж } } 

рдЙрдиреНрд╣реЗрдВ UI рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред


рддреАрди рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ред

рд╕рд╛рде рд╣реА, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдЧреНрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА HexFeatureManagerред

  public HexFeatureCollection[] urbanCollections, farmCollections, plantCollections; 


рд░рд╛рд╣рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рддреАрди рд╕рдВрдЧреНрд░рд╣ред

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

рдореИрдВрдиреЗ рдХреГрд╖рд┐ рднреВрдорд┐ рдХреЗ рд╡рд░реНрдЧ рдЖрд╡рдВрдЯрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 0.1 рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рд╕рд╛рде рдЦреЗрдд рдХреНрдпреВрдмреНрд╕ рдмрдирд╛рдПред рдЙрдЪреНрдЪ рдШрдирддреНрд╡ рд╡рд╛рд▓реЗ рддрд░рд╛рдЬреВ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ (2.5, 0.1, 2.5) рдФрд░ (3.5, 0.1, 2) рдХреЛ рдЪреБрдирд╛ред рдФрд╕рддрди, рд╕рд╛рдЗрдЯреЛрдВ рдХрд╛ рдХреНрд╖реЗрддреНрд░рдлрд▓ 1.75 рдФрд░ 2.5 рдХрд╛ рдЖрдХрд╛рд░ 1.25 рд╣реЛрддрд╛ рд╣реИред рдШрдирддреНрд╡ рдХрд╛ рдирд┐рдореНрди рд╕реНрддрд░ 1 рдХреЗ рдХреНрд╖реЗрддреНрд░ рдФрд░ 1.5 рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде 0.75 рддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдкреНрд░реАрдлреИрдм рдкреМрдзреЗ рд▓рдВрдмреЗ рдкреЗрдбрд╝реЛрдВ рдФрд░ рдмрдбрд╝реЗ рдЭрд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдЙрдЪреНрдЪ рдШрдирддреНрд╡ рдкреНрд░реАрдлреИрдм рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╣реИрдВ, (1.25, 4.5, 1.25) рдФрд░ (1.5, 3, 1.5)ред рдФрд╕рдд рддрд░рд╛рдЬреВ (0.75, 3, 0.75) рдФрд░ (1, 1.5, 1) рд╣реИрдВред рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдкреМрдзреЛрдВ рдХрд╛ рдЖрдХрд╛рд░ (0.5, 1.5, 0.5) рдФрд░ (0.75, 1, 0.75) рд╣реЛрддрд╛ рд╣реИред

рд░рд╛рд╣рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЪрдпрди


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

  public float a, b, c, d, e; public static HexHash Create () { HexHash hash; hash.a = Random.value * 0.999f; hash.b = Random.value * 0.999f; hash.c = Random.value * 0.999f; hash.d = Random.value * 0.999f; hash.e = Random.value * 0.999f; return hash; } 

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

  Transform PickPrefab ( HexFeatureCollection[] collection, int level, float hash, float choice ) { if (level > 0) { float[] thresholds = HexMetrics.GetFeatureThresholds(level - 1); for (int i = 0; i < thresholds.Length; i++) { if (hash < thresholds[i]) { return collection[i].Pick(choice); } } } return null; } public void AddFeature (HexCell cell, Vector3 position) { HexHash hash = HexMetrics.SampleHashGrid(position); Transform prefab = PickPrefab( urbanCollections, cell.UrbanLevel, hash.a, hash.d ); тАж instance.localRotation = Quaternion.Euler(0f, 360f * hash.e, 0f); instance.SetParent(container, false); } 

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

  Transform prefab = PickPrefab( urbanCollections, cell.UrbanLevel, hash.a, hash.d ); Transform otherPrefab = PickPrefab( farmCollections, cell.FarmLevel, hash.b, hash.d ); if (!prefab) { return; } 

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

  Transform otherPrefab = PickPrefab( farmCollections, cell.FarmLevel, hash.b, hash.d ); if (prefab) { if (otherPrefab && hash.b < hash.a) { prefab = otherPrefab; } } else if (otherPrefab) { prefab = otherPrefab; } else { return; } 


рд╢рд╣рд░реА рдФрд░ рдЧреНрд░рд╛рдореАрдг рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдорд┐рд╢реНрд░рдгред
рдЕрдЧрд▓рд╛, рд╕реА рд╣реИрд╢ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреМрдзреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВред

  if (prefab) { if (otherPrefab && hash.b < hash.a) { prefab = otherPrefab; } } else if (otherPrefab) { prefab = otherPrefab; } otherPrefab = PickPrefab( plantCollections, cell.PlantLevel, hash.c, hash.d ); if (prefab) { if (otherPrefab && hash.c < hash.a) { prefab = otherPrefab; } } else if (otherPrefab) { prefab = otherPrefab; } else { return; } 

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

  float usedHash = hash.a; if (prefab) { if (otherPrefab && hash.b < hash.a) { prefab = otherPrefab; usedHash = hash.b; } } else if (otherPrefab) { prefab = otherPrefab; usedHash = hash.b; } otherPrefab = PickPrefab( plantCollections, cell.PlantLevel, hash.c, hash.d ); if (prefab) { if (otherPrefab && hash.c < usedHash) { prefab = otherPrefab; } } else if (otherPrefab) { prefab = otherPrefab; } else { return; } 


рд╢рд╣рд░реА, рдЧреНрд░рд╛рдореАрдг рдФрд░ рдкреМрдзреЛрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдорд┐рд╢реНрд░рдгред

unitypackage

рднрд╛рдЧ 10: рджреАрд╡рд╛рд░реЗрдВ


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

рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо рджреАрд╡рд╛рд░ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред


рдКрдВрдЪреА рджреАрд╡рд╛рд░ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд▓реБрднрд╛рд╡рдирд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред

рджреАрд╡рд╛рд░ рдХрд╛ рд╕рдВрдкрд╛рджрди


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


рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рджреАрд╡рд╛рд░реЗрдВред

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

рджреАрд╡рд╛рд░ рд╡рд╛рд▓реА рд╕рдВрдкрддреНрддрд┐


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

  public bool Walled { get { return walled; } set { if (walled != value) { walled = value; Refresh(); } } } bool walled; 

рд╕рдВрдкрд╛рджрдХ рд╕реНрд╡рд┐рдЪ


рдХрдХреНрд╖реЛрдВ рдХреА "рдлрд╝реЗрдВрд╕" рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ HexMapEditorрд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ ред рдЗрд╕рд▓рд┐рдП, рд╣рдо OptionalToggleрдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдлрд╝реАрд▓реНрдб рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ ред

  OptionalToggle riverMode, roadMode, walledMode; тАж public void SetWalledMode (int mode) { walledMode = (OptionalToggle)mode; } 

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

  void EditCell (HexCell cell) { if (cell) { тАж if (roadMode == OptionalToggle.No) { cell.RemoveRoads(); } if (walledMode != OptionalToggle.Ignore) { cell.Walled = walledMode == OptionalToggle.Yes; } if (isDrag) { тАж } } } 

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


рд╕реНрд╡рд┐рдЪ "рдмрд╛рдбрд╝"ред

unitypackage

рджреАрд╡рд╛рд░реЗрдВ рдмрдирд╛рдирд╛


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



рд╕рд╣рд╛рдпрдХ рдкреНрд░реАрдлреИрдм рджреАрд╡рд╛рд░реЗрдВред

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

рджреАрд╡рд╛рд░ рдкреНрд░рдмрдВрдзрди


рдЪреВрдВрдХрд┐ рджреАрд╡рд╛рд░реЗрдВ рд░рд╛рд╣рдд рдХреА рд╡рд╕реНрддреБ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЙрдирд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП HexFeatureManagerред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд░рд╛рд╣рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рд╡реЙрд▓реНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗрдВрдЧреЗ , рдФрд░ рдЗрд╕реЗ ClearрдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ Applyред

  public HexMesh walls; тАж public void Clear () { тАж walls.Clear(); } public void Apply () { walls.Apply(); } 


рд╢реАрд░реНрд╖рд╕реНрде рдкреНрд░рдмрдВрдзрдХ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рджреАрд╡рд╛рд░реЗрдВред

рдХреНрдпрд╛ рджреАрд╡рд╛рд░реЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдмрдЪреНрдЪрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?
, . , Walls Hex Grid Chunk .

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

  public void AddWall ( EdgeVertices near, HexCell nearCell, EdgeVertices far, HexCell farCell ) { } 

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

  void TriangulateConnection ( HexDirection direction, HexCell cell, EdgeVertices e1 ) { тАж if (cell.GetEdgeType(direction) == HexEdgeType.Slope) { тАж } else { тАж } features.AddWall(e1, cell, e2, neighbor); HexCell nextNeighbor = cell.GetNeighbor(direction.Next()); if (direction <= HexDirection.E && nextNeighbor != null) { тАж } } 

рдПрдХ рджреАрд╡рд╛рд░ рдЦрдВрдб рдмрдирд╛рдПрдБ


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

  void AddWallSegment ( Vector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight ) { } 


рдкрд╛рд╕ рдФрд░ рджреВрд░ рдХрд╛ рдХрд┐рдирд╛рд░рд╛ред

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

  public void AddWall ( EdgeVertices near, HexCell nearCell, EdgeVertices far, HexCell farCell ) { if (nearCell.Walled != farCell.Walled) { AddWallSegment(near.v1, far.v1, near.v5, far.v5); } } 

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

  void AddWallSegment ( Vector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight ) { Vector3 left = Vector3.Lerp(nearLeft, farLeft, 0.5f); Vector3 right = Vector3.Lerp(nearRight, farRight, 0.5f); } 

рджреАрд╡рд╛рд░ рдХрд┐рддрдиреА рд▓рдВрдмреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдЪрд▓реЛ рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ HexMetricsред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕реЗрд▓ рдКрдВрдЪрд╛рдИ рдХреЗ рд╕реНрддрд░ рдХрд╛ рдЖрдХрд╛рд░ рджрд┐рдпрд╛ред

  public const float wallHeight = 3f; 

HexFeatureManager.AddWallSegmentрдЗрд╕ рдКрдБрдЪрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд╡рд╛рдб рдХреЗ рддреАрд╕рд░реЗ рдФрд░ рдЪреМрдереЗ рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдореЗрд╖ рдореЗрдВ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ wallsред

  Vector3 left = Vector3.Lerp(nearLeft, farLeft, 0.5f); Vector3 right = Vector3.Lerp(nearRight, farRight, 0.5f); Vector3 v1, v2, v3, v4; v1 = v3 = left; v2 = v4 = right; v3.y = v4.y = left.y + HexMetrics.wallHeight; walls.AddQuad(v1, v2, v3, v4); 

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


рдПрдХ рддрд░рдлрд╛ рдХреНрд╡рд╛рдб-рджреАрд╡рд╛рд░реЗрдВред

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

  walls.AddQuad(v1, v2, v3, v4); walls.AddQuad(v2, v1, v4, v3); 


рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рджреАрд╡рд╛рд░реЗрдВред

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

рдореЛрдЯреА рджреАрд╡рд╛рд░реЗрдВ


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

  public const float wallThickness = 0.75f; 

рджреЛ рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдореЛрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрдХреНрд╖реЛрдВ рдХреЛ рджреЛ рдХреНрд╡реИрдб рднрд╛рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдкрдХреНрд╖ рдХреЛ рдкрд╛рд╕ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреА рдУрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рджреВрд╕рд░реЗ рдХреЛ рджреВрд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреА рдУрд░ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдСрдлрд╝рд╕реЗрдЯ рд╡реЗрдХреНрдЯрд░ рдмрд░рд╛рдмрд░ рд╣реИ far - near, рд▓реЗрдХрд┐рди рджреАрд╡рд╛рд░ рдХреЗ рд╢реАрд░реНрд╖ рдХреЛ рд╕рдкрд╛рдЯ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдШрдЯрдХ Y рдХреЛ 0. рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

  public static Vector3 WallThicknessOffset (Vector3 near, Vector3 far) { Vector3 offset; offset.x = far.x - near.x; offset.y = 0f; offset.z = far.z - near.z; return offset; } 

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

  return offset.normalized * (wallThickness * 0.5f); 

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

  Vector3 left = Vector3.Lerp(nearLeft, farLeft, 0.5f); Vector3 right = Vector3.Lerp(nearRight, farRight, 0.5f); Vector3 leftThicknessOffset = HexMetrics.WallThicknessOffset(nearLeft, farLeft); Vector3 rightThicknessOffset = HexMetrics.WallThicknessOffset(nearRight, farRight); Vector3 v1, v2, v3, v4; v1 = v3 = left - leftThicknessOffset; v2 = v4 = right - rightThicknessOffset; v3.y = v4.y = left.y + HexMetrics.wallHeight; walls.AddQuad(v1, v2, v3, v4); v1 = v3 = left + leftThicknessOffset; v2 = v4 = right + rightThicknessOffset; v3.y = v4.y = left.y + HexMetrics.wallHeight; walls.AddQuad(v2, v1, v4, v3); 


рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рджреАрд╡рд╛рд░реЗрдВред

рдХреНрд╡рд╛рдбреНрд╕ рдЕрдм рдкрдХреНрд╖рдкрд╛рддреА рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рджреАрд╡рд╛рд░ рдХреА рдореЛрдЯрд╛рдИ рд╕рдорд╛рди рд╣реИрдВ?
, ┬л-┬╗ . , . . , . , . , - , . .

рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рд╢реАрд░реНрд╖


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

  Vector3 v1, v2, v3, v4; v1 = v3 = left - leftThicknessOffset; v2 = v4 = right - rightThicknessOffset; v3.y = v4.y = left.y + HexMetrics.wallHeight; walls.AddQuad(v1, v2, v3, v4); Vector3 t1 = v3, t2 = v4; v1 = v3 = left + leftThicknessOffset; v2 = v4 = right + rightThicknessOffset; v3.y = v4.y = left.y + HexMetrics.wallHeight; walls.AddQuad(v2, v1, v4, v3); walls.AddQuad(t1, t2, v3, v4); 


рд╕рдмрд╕реЗ рдКрдкрд░ рд╡рд╛рд▓реА рджреАрд╡рд╛рд░реЗрдВред

рдХреЛрдиреЛрдВ рдкрд░ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ


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


рдХреЛрдг рд╡рд┐рдиреНрдпрд╛рд╕ред

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


рд╕реЗрд▓ рд░реЛрд▓реНрд╕ред

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

  void AddWallSegment ( Vector3 pivot, HexCell pivotCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { AddWallSegment(pivot, left, pivot, right); } 

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

  public void AddWall ( Vector3 c1, HexCell cell1, Vector3 c2, HexCell cell2, Vector3 c3, HexCell cell3 ) { if (cell1.Walled) { if (cell2.Walled) { if (!cell3.Walled) { AddWallSegment(c3, cell3, c1, cell1, c2, cell2); } } else if (cell3.Walled) { AddWallSegment(c2, cell2, c3, cell3, c1, cell1); } else { AddWallSegment(c1, cell1, c2, cell2, c3, cell3); } } else if (cell2.Walled) { if (cell3.Walled) { AddWallSegment(c1, cell1, c2, cell2, c3, cell3); } else { AddWallSegment(c2, cell2, c3, cell3, c1, cell1); } } else if (cell3.Walled) { AddWallSegment(c3, cell3, c1, cell1, c2, cell2); } } 

рдХреЛрдиреЗ рдХреЗ рдЦрдВрдбреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдЕрдВрдд рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВ HexGridChunk.TriangulateCornerред

  void TriangulateCorner ( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { тАж features.AddWall(bottom, bottomCell, left, leftCell, right, rightCell); } 


рдХреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рджреАрд╡рд╛рд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЫреЗрдж рд╣реИрдВред

рдЫреЗрдж рдмрдВрдж рдХрд░реЗрдВ


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

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, AddWallSegmentрдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рд╢реАрд░реНрд╖ рдХреЛрдиреЗ рдХреЗ рд╡рд╛рдИ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗред

  float leftTop = left.y + HexMetrics.wallHeight; float rightTop = right.y + HexMetrics.wallHeight; Vector3 v1, v2, v3, v4; v1 = v3 = left - leftThicknessOffset; v2 = v4 = right - rightThicknessOffset; v3.y = leftTop; v4.y = rightTop; walls.AddQuad(v1, v2, v3, v4); Vector3 t1 = v3, t2 = v4; v1 = v3 = left + leftThicknessOffset; v2 = v4 = right + rightThicknessOffset; v3.y = leftTop; v4.y = rightTop; walls.AddQuad(v2, v1, v4, v3); 


рд╕рдВрд▓рдЧреНрди рджреАрд╡рд╛рд░реЗрдВред

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

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


рдЫрд╛рдпрд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЫреЗрдж рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

unitypackage

рдПрд▓рдИрдбреА рджреАрд╡рд╛рд░


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


рдЕрдЧрд▓-рдмрдЧрд▓ рдХреА рджреАрд╡рд╛рд░реЛрдВ рдкрд░ рд╕реАрдзреА рджреАрд╡рд╛рд░реЗрдВред

рдзрд╛рд░ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ


рдкреВрд░реЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрдВрдб рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдзрд╛рд░ рдкрдЯреНрдЯреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕реЗ рд╣рдо рдПрдЬ AddWallSegmentрд╡рд░реНрдЬрди рдореЗрдВ рдЪрд╛рд░ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ AddWallред

  public void AddWall ( EdgeVertices near, HexCell nearCell, EdgeVertices far, HexCell farCell ) { if (nearCell.Walled != farCell.Walled) { AddWallSegment(near.v1, far.v1, near.v2, far.v2); AddWallSegment(near.v2, far.v2, near.v3, far.v3); AddWallSegment(near.v3, far.v3, near.v4, far.v4); AddWallSegment(near.v4, far.v4, near.v5, far.v5); } } 


рдШреБрдорд╛рд╡рджрд╛рд░ рджреАрд╡рд╛рд░реЗрдВред

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

рдЬрдореАрди рдкрд░ рджреАрд╡рд╛рд░реЗрдВ рдЦрдбрд╝реА рдХрд░рдирд╛


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


рд╣рд╡рд╛ рдореЗрдВ рд▓рдЯрдХрддреА рд╣реБрдИ рджреАрд╡рд╛рд░реЗрдВред

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

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


рдиреАрдЪреА рджреАрд╡рд╛рд░ред

рдЖрдЗрдП , рдЗрд╕ рдкреНрд░рдХреНрд╖реЗрдк рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╡рд╛рд▓реА HexMetricsрд╡рд┐рдзрд┐ рдХреЗ WallLerpрд╕рд╛рде, рдПрдХреНрд╕ рдФрд░ рдЬреЗрдб рдХреЗ рдФрд╕рдд рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдирд┐рдХрдЯ рдФрд░ рджреВрд░ рдХреЗ рдЫреЛрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ ред рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ TerraceLerpред

  public const float wallElevationOffset = verticalTerraceStepSize; тАж public static Vector3 WallLerp (Vector3 near, Vector3 far) { near.x += (far.x - near.x) * 0.5f; near.z += (far.z - near.z) * 0.5f; float v = near.y < far.y ? wallElevationOffset : (1f - wallElevationOffset); near.y += (far.y - near.y) * v; return near; } 

HexFeatureManagerрдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдХреЛрдиреЗ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдмрд╛рдзреНрдп рдХрд░реЗрдВред

  void AddWallSegment ( Vector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight ) { Vector3 left = HexMetrics.WallLerp(nearLeft, farLeft); Vector3 right = HexMetrics.WallLerp(nearRight, farRight); тАж } 


рдЬрдореАрди рдкрд░ рдЦрдбрд╝реА рджреАрд╡рд╛рд░реЗрдВред

рджреАрд╡рд╛рд░ рд╡рд┐рд░реВрдкрдг


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

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

  void AddWallSegment ( Vector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight ) { nearLeft = HexMetrics.Perturb(nearLeft); farLeft = HexMetrics.Perturb(farLeft); nearRight = HexMetrics.Perturb(nearRight); farRight = HexMetrics.Perturb(farRight); тАж walls.AddQuadUnperturbed(v1, v2, v3, v4); тАж walls.AddQuadUnperturbed(v2, v1, v4, v3); walls.AddQuadUnperturbed(t1, t2, v3, v4); } 


рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рдЕрд╡рд┐рд░рд▓ рд╢реАрд░реНрд╖ред

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


рдЕрдзрд┐рдХ рд▓рдЧрд╛рддрд╛рд░ рджреАрд╡рд╛рд░ рдХреА рдореЛрдЯрд╛рдИред

unitypackage

рджреАрд╡рд╛рд░реЛрдВ рдореЗрдВ рдЫреЗрдж


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

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

  public void AddWall ( EdgeVertices near, HexCell nearCell, EdgeVertices far, HexCell farCell, bool hasRiver, bool hasRoad ) { if (nearCell.Walled != farCell.Walled) { AddWallSegment(near.v1, far.v1, near.v2, far.v2); if (hasRiver || hasRoad) { // Leave a gap. } else { AddWallSegment(near.v2, far.v2, near.v3, far.v3); AddWallSegment(near.v3, far.v3, near.v4, far.v4); } AddWallSegment(near.v4, far.v4, near.v5, far.v5); } } 

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

  void TriangulateConnection ( HexDirection direction, HexCell cell, EdgeVertices e1 ) { тАж bool hasRiver = cell.HasRiverThroughEdge(direction); bool hasRoad = cell.HasRoadThroughEdge(direction); if (hasRiver) { тАж } if (cell.GetEdgeType(direction) == HexEdgeType.Slope) { TriangulateEdgeTerraces(e1, cell, e2, neighbor, hasRoad); } else { TriangulateEdgeStrip(e1, cell.Color, e2, neighbor.Color, hasRoad); } features.AddWall(e1, cell, e2, neighbor, hasRiver, hasRoad); тАж } 


рдирджрд┐рдпреЛрдВ рдФрд░ рд╕рдбрд╝рдХреЛрдВ рдХреЗ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рджреАрд╡рд╛рд░реЛрдВ рдореЗрдВ рдЫреЗрджред

рд╣рдо рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ


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

  void AddWallCap (Vector3 near, Vector3 far) { near = HexMetrics.Perturb(near); far = HexMetrics.Perturb(far); Vector3 center = HexMetrics.WallLerp(near, far); Vector3 thickness = HexMetrics.WallThicknessOffset(near, far); Vector3 v1, v2, v3, v4; v1 = v3 = center - thickness; v2 = v4 = center + thickness; v3.y = v4.y = center.y + HexMetrics.wallHeight; walls.AddQuadUnperturbed(v1, v2, v3, v4); } 

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

  public void AddWall ( EdgeVertices near, HexCell nearCell, EdgeVertices far, HexCell farCell, bool hasRiver, bool hasRoad ) { if (nearCell.Walled != farCell.Walled) { AddWallSegment(near.v1, far.v1, near.v2, far.v2); if (hasRiver || hasRoad) { AddWallCap(near.v2, far.v2); AddWallCap(far.v4, near.v4); } тАж } } 


рджреАрд╡рд╛рд░реЛрдВ рдореЗрдВ рдмрдВрдж рдЫреЗрджред

рдирдХреНрд╢реЗ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЫреЗрдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
, . . , .

unitypackage

рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдФрд░ рдкрд╛рдиреА рд╕реЗ рдкрд░рд╣реЗрдЬ


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


рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдкрд░ рдФрд░ рдкрд╛рдиреА рдореЗрдВ рджреАрд╡рд╛рд░реЗрдВред

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

  public void AddWall ( EdgeVertices near, HexCell nearCell, EdgeVertices far, HexCell farCell, bool hasRiver, bool hasRoad ) { if ( nearCell.Walled != farCell.Walled && !nearCell.IsUnderwater && !farCell.IsUnderwater && nearCell.GetEdgeType(farCell) != HexEdgeType.Cliff ) { тАж } } 


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

рджреАрд╡рд╛рд░ рдХреЗ рдХреЛрдиреЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛


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

  void AddWallSegment ( Vector3 pivot, HexCell pivotCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { if (pivotCell.IsUnderwater) { return; } AddWallSegment(pivot, left, pivot, right); } 


рдЕрдзрд┐рдХ рдкрд╛рдиреА рдХреЗ рднреАрддрд░ рд╕рд╣рд╛рдпрддрд╛ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВред

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

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

  if (pivotCell.IsUnderwater) { return; } bool hasLeftWall = !leftCell.IsUnderwater && pivotCell.GetEdgeType(leftCell) != HexEdgeType.Cliff; bool hasRighWall = !rightCell.IsUnderwater && pivotCell.GetEdgeType(rightCell) != HexEdgeType.Cliff; if (hasLeftWall && hasRighWall) { AddWallSegment(pivot, left, pivot, right); } 


рд╕рднреА рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЛрдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред

рдХреЛрдиреЛрдВ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ


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

  if (hasLeftWall) { if (hasRighWall) { AddWallSegment(pivot, left, pivot, right); } else { AddWallCap(pivot, left); } } else if (hasRighWall) { AddWallCap(right, pivot); } 


рд╣рдо рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рджреАрд╡рд╛рд░реЛрдВ рдХрд╛ рдХрдиреЗрдХреНрд╢рди


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


рджреАрд╡рд╛рд░реЛрдВ рдФрд░ рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рдмреАрдЪ рдЫреЗрджред

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

  void AddWallWedge (Vector3 near, Vector3 far, Vector3 point) { near = HexMetrics.Perturb(near); far = HexMetrics.Perturb(far); point = HexMetrics.Perturb(point); Vector3 center = HexMetrics.WallLerp(near, far); Vector3 thickness = HexMetrics.WallThicknessOffset(near, far); Vector3 v1, v2, v3, v4; Vector3 pointTop = point; point.y = center.y; v1 = v3 = center - thickness; v2 = v4 = center + thickness; v3.y = v4.y = pointTop.y = center.y + HexMetrics.wallHeight; // walls.AddQuadUnperturbed(v1, v2, v3, v4); walls.AddQuadUnperturbed(v1, point, v3, pointTop); walls.AddQuadUnperturbed(point, v2, pointTop, v4); walls.AddTriangleUnperturbed(pointTop, v3, v4); } 

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

  if (hasLeftWall) { if (hasRighWall) { AddWallSegment(pivot, left, pivot, right); } else if (leftCell.Elevation < rightCell.Elevation) { AddWallWedge(pivot, left, right); } else { AddWallCap(pivot, left); } } else if (hasRighWall) { if (rightCell.Elevation < leftCell.Elevation) { AddWallWedge(right, pivot, left); } else { AddWallCap(right, pivot); } } 


, .

unitypackage

11:


  • .
  • .
  • .


.


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

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

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

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


рдкреНрд░реАрдлреИрдм рдЯреЙрд╡рд░ред

рдЗрд╕ рдкреНрд░реАрдлрд╝реИрдм рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ HexFeatureManagerрдФрд░ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред

  public Transform wallTower; 


рдкреНрд░реАрдлрд╝реИрдм рдЯреЙрд╡рд░ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред

рдЯрд╛рд╡рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


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

  void AddWallSegment ( Vector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight ) { тАж Transform towerInstance = Instantiate(wallTower); towerInstance.transform.localPosition = (left + right) * 0.5f; towerInstance.SetParent(container, false); } 


рдкреНрд░рддрд┐ рджреАрд╡рд╛рд░ рдЦрдВрдб рдПрдХ рдЯреЙрд╡рд░ред

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

рд╕реНрд╡рдпрдВ рд░реЛрдЯреЗрд╢рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдмрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ Transform.rightрд╡реЗрдХреНрдЯрд░ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ ред рдПрдХрддрд╛ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕рдХреА рд╕реНрдерд╛рдиреАрдп рджрд┐рд╢рд╛ рд╕рд╣реА рдкреНрд░реЗрд╖рд┐рдд рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реЛред

  Transform towerInstance = Instantiate(wallTower); towerInstance.transform.localPosition = (left + right) * 0.5f; Vector3 rightDirection = right - left; rightDirection.y = 0f; towerInstance.transform.right = rightDirection; towerInstance.SetParent(container, false); 


рдЯрд╛рд╡рд░реЛрдВ рдХреЛ рджреАрд╡рд╛рд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Transform.right рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
Quaternion.FromToRotation . .

 public Vector3 right { get { return rotation * Vector3.right; } set { rotation = Quaternion.FromToRotation(Vector3.right, value); } } 

рдЯрд╛рд╡рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░реЗрдВ


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

  void AddWallSegment ( Vector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight, bool addTower = false ) { тАж if (addTower) { Transform towerInstance = Instantiate(wallTower); towerInstance.transform.localPosition = (left + right) * 0.5f; Vector3 rightDirection = right - left; rightDirection.y = 0f; towerInstance.transform.right = rightDirection; towerInstance.SetParent(container, false); } } 

рдЯрд╛рд╡рд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдХреЛрдиреЛрдВ рдХреЗ рдХреЛрдиреЛрдВ рдореЗрдВ рд░рдЦреЗрдВред рдирддреАрдЬрддрди, рд╣рдо рдЙрдирдХреЗ рдмреАрдЪ рдХрд╛рдлреА рдирд┐рд░рдВрддрд░ рджреВрд░реА рд╡рд╛рд▓реЗ рдХрдо рдЯреЙрд╡рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

  void AddWallSegment ( Vector3 pivot, HexCell pivotCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell ) { тАж AddWallSegment(pivot, left, pivot, right, true); тАж } 


рдЯреЙрд╡рд░ рдХреЗрд╡рд▓ рдХреЛрдиреЛрдВ рдореЗрдВ рд╣реИрдВред

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

  HexHash hash = HexMetrics.SampleHashGrid( (pivot + left + right) * (1f / 3f) ); bool hasTower = hash.e < HexMetrics.wallTowerThreshold; AddWallSegment(pivot, left, pivot, right, hasTower); 

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

  public const float wallTowerThreshold = 0.5f; 


рдмреЗрддрд░рддреАрдм рдЯрд╛рд╡рд░ред

рд╣рдо рдврд▓рд╛рди рд╕реЗ рдЯрд╛рд╡рд░реЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ


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


рдврд▓рд╛рди рдкрд░ рдЯрд╛рд╡рд░реНрд╕ред

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

  bool hasTower = false; if (leftCell.Elevation == rightCell.Elevation) { HexHash hash = HexMetrics.SampleHashGrid( (pivot + left + right) * (1f / 3f) ); hasTower = hash.e < HexMetrics.wallTowerThreshold; } AddWallSegment(pivot, left, pivot, right, hasTower); 


рдврд▓рд╛рди рдХреА рджреАрд╡рд╛рд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдЯреЙрд╡рд░ рдирд╣реАрдВ рд╣реИрдВред

рд╣рдордиреЗ рджреАрд╡рд╛рд░реЛрдВ рдФрд░ рдЯрд╛рд╡рд░реЛрдВ рдХреЛ рдЬрдореАрди рдкрд░ рд░рдЦ рджрд┐рдпрд╛


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


рд╣рд╡рд╛ рдореЗрдВ рдЯрд╛рд╡рд░реНрд╕ред

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


рджреАрд╡рд╛рд░реЗрдВ рд╣рд╡рд╛ рдореЗрдВ рд╣реИрдВред

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

  public const float wallHeight = 4f; public const float wallYOffset = -1f; 

рд╣рдо рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ HexMetrics.WallLerpрддрд╛рдХрд┐ рд╡рд╛рдИ рд╕рдордиреНрд╡рдп рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдирдИ рдСрдлрд╕реЗрдЯ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗред

  public static Vector3 WallLerp (Vector3 near, Vector3 far) { near.x += (far.x - near.x) * 0.5f; near.z += (far.z - near.z) * 0.5f; float v = near.y < far.y ? wallElevationOffset : (1f - wallElevationOffset); near.y += (far.y - near.y) * v + wallYOffset; return near; } 

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



рдЬрдореАрди рдкрд░ рджреАрд╡рд╛рд░реЗрдВ рдФрд░ рдЯрд╛рд╡рд░ред

unitypackage

рдкреБрд▓реЛрдВ


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

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

рдкреБрд▓ рдХреЗ рдкреНрд░реАрдлрд╝реИрдм рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ HexFeatureManagerрдФрд░ рдЗрд╕реЗ рдкреНрд░реАрдлрд╝реИрдм рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред

  public Transform wallTower, bridge; 


рдмреНрд░рд┐рдЬ рдкреНрд░реАрдлреИрдм рдХрд╛ рдХрд╛рдо рд╕реМрдВрдкрд╛ред

рдкреБрд▓реЛрдВ рдХрд╛ рд╕реНрдерд╛рди


рдкреБрд▓ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ HexFeatureManager.AddBridgeред рдкреБрд▓ рдХреЛ рдирджреА рдХреЗ рдХреЗрдВрджреНрд░ рдФрд░ рдирджреА рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

  public void AddBridge (Vector3 roadCenter1, Vector3 roadCenter2) { Transform instance = Instantiate(bridge); instance.localPosition = (roadCenter1 + roadCenter2) * 0.5f; instance.SetParent(container, false); } 

рд╣рдо рдЕрд╡рд┐рд░рд▓ рд╕рдбрд╝рдХ рдХреЗрдВрджреНрд░реЛрдВ рдХреЛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкреБрд▓ рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

  roadCenter1 = HexMetrics.Perturb(roadCenter1); roadCenter2 = HexMetrics.Perturb(roadCenter2); Transform instance = Instantiate(bridge); 

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

  Transform instance = Instantiate(bridge); instance.localPosition = (roadCenter1 + roadCenter2) * 0.5f; instance.forward = roadCenter2 - roadCenter1; instance.SetParent(container, false); 

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


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

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕реАрдзреЗ рдирджрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВред рдЕрдВрджрд░, HexGridChunk.TriangulateRoadAdjacentToRiverрдкрд╣рд▓рд╛ рдСрдкрд░реЗрдЯрд░ else ifрдРрд╕реА рдирджрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕рдбрд╝рдХреЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рд╣рдо рдкреБрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗред

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

  void TriangulateRoadAdjacentToRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж else if (cell.IncomingRiver == cell.OutgoingRiver.Opposite()) { тАж roadCenter += corner * 0.5f; features.AddBridge(roadCenter, center - corner * 0.5f); center += corner * 0.25f; } тАж } 


рд╕реАрдзреА рдирджрд┐рдпреЛрдВ рдкрд░ рдкреБрд▓ред

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

  roadCenter += corner * 0.5f; if (cell.IncomingRiver == direction.Next()) { features.AddBridge(roadCenter, center - corner * 0.5f); } center += corner * 0.25f; 

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

  if (cell.IncomingRiver == direction.Next() && ( cell.HasRoadThroughEdge(direction.Next2()) || cell.HasRoadThroughEdge(direction.Opposite()) )) { features.AddBridge(roadCenter, center - corner * 0.5f); } 


рджреЛрдиреЛрдВ рддрд░рдл рдХреА рд╕рдбрд╝рдХреЛрдВ рдХреЗ рдмреАрдЪ рдкреБрд▓ред

рдШреБрдорд╛рд╡рджрд╛рд░ рдирджрд┐рдпреЛрдВ рдкрд░ рдкреБрд▓


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

  void TriangulateRoadAdjacentToRiver ( HexDirection direction, HexCell cell, Vector3 center, EdgeVertices e ) { тАж else { HexDirection middle; if (previousHasRiver) { middle = direction.Next(); } else if (nextHasRiver) { middle = direction.Previous(); } else { middle = direction; } if ( !cell.HasRoadThroughEdge(middle) && !cell.HasRoadThroughEdge(middle.Previous()) && !cell.HasRoadThroughEdge(middle.Next()) ) { return; } Vector3 offset = HexMetrics.GetSolidEdgeMiddle(middle); roadCenter += offset * 0.25f; } тАж } 

рд╡рдХреНрд░ рдХреЗ рдмрд╛рд╣рд░ рд╡рд┐рд╕реНрдерд╛рдкрди рдкреИрдорд╛рдиреЗ 0.25 рд╣реИ, рдФрд░ рдЕрдВрджрд░ HexMetrics.innerToOuter * 0.7fред рд╣рдо рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдкреБрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

  Vector3 offset = HexMetrics.GetSolidEdgeMiddle(middle); roadCenter += offset * 0.25f; features.AddBridge( roadCenter, center - offset * (HexMetrics.innerToOuter * 0.7f) ); 


рдШреБрдорд╛рд╡рджрд╛рд░ рдирджрд┐рдпреЛрдВ рдкрд░ рдкреБрд▓ред

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

  Vector3 offset = HexMetrics.GetSolidEdgeMiddle(middle); roadCenter += offset * 0.25f; if (direction == middle) { features.AddBridge( roadCenter, center - offset * (HexMetrics.innerToOuter * 0.7f) ); } 

рдФрд░ рдлрд┐рд░, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдбрд╝рдХ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рд╣реИред

  if ( direction == middle && cell.HasRoadThroughEdge(direction.Opposite()) ) { features.AddBridge( roadCenter, center - offset * (HexMetrics.innerToOuter * 0.7f) ); } 


рджреЛрдиреЛрдВ рддрд░рдл рдХреА рд╕рдбрд╝рдХреЛрдВ рдХреЗ рдмреАрдЪ рдкреБрд▓ред

рдкреБрд▓ рд╕реНрдХреЗрд▓рд┐рдВрдЧ


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


рднрд┐рдиреНрди рджреВрд░реА рд▓реЗрдХрд┐рди рдирд┐рд░рдВрддрд░ рдкреБрд▓ рдХреА рд▓рдВрдмрд╛рдИред

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

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

  public const float bridgeDesignLength = 7f; 

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

  public void AddBridge (Vector3 roadCenter1, Vector3 roadCenter2) { roadCenter1 = HexMetrics.Perturb(roadCenter1); roadCenter2 = HexMetrics.Perturb(roadCenter2); Transform instance = Instantiate(bridge); instance.localPosition = (roadCenter1 + roadCenter2) * 0.5f; instance.forward = roadCenter2 - roadCenter1; float length = Vector3.Distance(roadCenter1, roadCenter2); instance.localScale = new Vector3( 1f, 1f, length * (1f / HexMetrics.bridgeDesignLength) ); instance.SetParent(container, false); } 


рдкреБрд▓реЛрдВ рдХреА рдмрджрд▓рддреА рд▓рдВрдмрд╛рдИред

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


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



рд╡рд┐рднрд┐рдиреНрди рд▓рдВрдмрд╛рдИ рдХреЗ рдзрдиреБрд╖рд╛рдХрд╛рд░ рдкреБрд▓ред

unitypackage

рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ


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

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


рдорд╣рд▓ рдХрд╛ рдкреНрд░реАрдлреИрдмред

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


рдкреНрд░реАрдлрд╝рдм рдЬрд╝рд┐рдЧрдЧреБрд░рд╛рддред

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


рдкреНрд░реАрдлрд╝реИрдм рдореЗрдЧрд╛рдлреНрд▓реЛрд░рд╛ред рдЗрди рдкреНрд░реАрдлрд╝реИрдм рдХреЛ рдЯреНрд░реИрдХ

рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HexFeatureManagerрд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ ред

  public Transform[] special; 

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


рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рдиред

рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдмрдирд╛рдирд╛


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

  int specialIndex; 

рдЕрдиреНрдп рд░рд╛рд╣рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рддрд░рд╣, рдЖрдЗрдП рд╣рдо рдЗрд╕реЗ рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрдВред

  public int SpecialIndex { get { return specialIndex; } set { if (specialIndex != value) { specialIndex = value; RefreshSelfOnly(); } } } 

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

  public bool IsSpecial { get { return specialIndex > 0; } } 

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

  int activeUrbanLevel, activeFarmLevel, activePlantLevel, activeSpecialIndex; тАж bool applyUrbanLevel, applyFarmLevel, applyPlantLevel, applySpecialIndex; тАж public void SetApplySpecialIndex (bool toggle) { applySpecialIndex = toggle; } public void SetSpecialIndex (float index) { activeSpecialIndex = (int)index; } тАж void EditCell (HexCell cell) { if (cell) { if (applyColor) { cell.Color = activeColor; } if (applyElevation) { cell.Elevation = activeElevation; } if (applyWaterLevel) { cell.WaterLevel = activeWaterLevel; } if (applySpecialIndex) { cell.SpecialIndex = activeSpecialIndex; } if (applyUrbanLevel) { cell.UrbanLevel = activeUrbanLevel; } тАж } } 

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


рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд▓рд╛рдЗрдбрд░ред

рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛


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

  public void AddSpecialFeature (HexCell cell, Vector3 position) { Transform instance = Instantiate(special[cell.SpecialIndex - 1]); instance.localPosition = HexMetrics.Perturb(position); instance.SetParent(container, false); } 

рдЪрд▓реЛ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рд░реЛрдЯреЗрд╢рди рджреЗрддреЗ рд╣реИрдВред

  public void AddSpecialFeature (HexCell cell, Vector3 position) { Transform instance = Instantiate(special[cell.SpecialIndex - 1]); instance.localPosition = HexMetrics.Perturb(position); HexHash hash = HexMetrics.SampleHashGrid(position); instance.localRotation = Quaternion.Euler(0f, 360f * hash.e, 0f); instance.SetParent(container, false); } 

рдХрд┐рд╕реА рд╕реЗрд▓ рдХреЛ рдЯреНрд░рд╛рдИрдЧреБрд▓реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдо HexGridChunk.TriangulateрдЬрд╛рдБрдЪреЗрдВрдЧреЗ рдХрд┐ рд╕реЗрд▓ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреА рдирдИ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ AddFeatureред

  void Triangulate (HexCell cell) { for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { Triangulate(d, cell); } if (!cell.IsUnderwater && !cell.HasRiver && !cell.HasRoads) { features.AddFeature(cell, cell.Position); } if (cell.IsSpecial) { features.AddSpecialFeature(cell, cell.Position); } } 


рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБред рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝реЗ рд╣реИрдВред

рдирджрд┐рдпреЛрдВ рд╕реЗ рдмрдЪреЗрдВ


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


рдирджрд┐рдпреЛрдВ рдкрд░ рд╡рд╕реНрддреБрдПрдВред

рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирджрд┐рдпреЛрдВ рдХреЗ рдКрдкрд░ рдмрдирд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ HexCell.SpecialIndexред рд╣рдо рдЗрдВрдбреЗрдХреНрд╕ рддрднреА рдмрджрд▓реЗрдВрдЧреЗ рдЬрдм рд╕реЗрд▓ рдореЗрдВ рдХреЛрдИ рдирджрд┐рдпрд╛рдВ рди рд╣реЛрдВред

  public int SpecialIndex { тАж set { if (specialIndex != value && !HasRiver) { specialIndex = value; RefreshSelfOnly(); } } } 

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

  public void SetOutgoingRiver (HexDirection direction) { тАж hasOutgoingRiver = true; outgoingRiver = direction; specialIndex = 0; neighbor.RemoveIncomingRiver(); neighbor.hasIncomingRiver = true; neighbor.incomingRiver = direction.Opposite(); neighbor.specialIndex = 0; SetRoad((int)direction, false); } 

рд╣рдо рд╕рдбрд╝рдХреЛрдВ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ


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


рд╕рдбрд╝рдХ рдкрд░ рд╡рд╕реНрддреБрдПрдВред

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

  public int SpecialIndex { тАж set { if (specialIndex != value && !HasRiver) { specialIndex = value; RemoveRoads(); RefreshSelfOnly(); } } } 

рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
0, , . .

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

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

рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдмрдЪреЗрдВ


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


рдПрдХ рд╡рд╕реНрддреБ рдЬреЛ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддреА рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджрдмрд╛ рджреЗрдВрдЧреЗ, рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдереЗред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ HexFeatureManager.AddFeatureред

  public void AddFeature (HexCell cell, Vector3 position) { if (cell.IsSpecial) { return; } тАж } 

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


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


рдкрд╛рдиреА рдореЗрдВ рд╡рд╕реНрддреБрдПрдБред

рдЬреИрд╕рд╛ рдХрд┐ HexGridChunk.Triangulateрд╣рдо рдмрд╛рдврд╝ рдФрд░ рд╡рд┐рд╢реЗрд╖, рдФрд░ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБрдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред

  void Triangulate (HexCell cell) { for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { Triangulate(d, cell); } if (!cell.IsUnderwater && !cell.HasRiver && !cell.HasRoads) { features.AddFeature(cell, cell.Position); } if (!cell.IsUnderwater && cell.IsSpecial) { features.AddSpecialFeature(cell, cell.Position); } } 

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

  void Triangulate (HexCell cell) { for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++) { Triangulate(d, cell); } if (!cell.IsUnderwater) { if (!cell.HasRiver && !cell.HasRoads) { features.AddFeature(cell, cell.Position); } if (cell.IsSpecial) { features.AddSpecialFeature(cell, cell.Position); } } } 

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

unitypackage

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


All Articles