{"id":290692,"date":"2018-10-12T13:10:12","date_gmt":"2018-10-12T09:10:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=290692"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2018-10-12T09:10:12","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=290692","title":{"rendered":"\u041a\u0430\u0440\u0442\u044b \u0438\u0437 \u0448\u0435\u0441\u0442\u0438\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0432 Unity: \u0432\u043e\u0434\u0430, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u0438 \u043a\u0440\u0435\u043f\u043e\u0441\u0442\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\"><a href=\"https:\/\/habr.com\/post\/424257\/\">\u0427\u0430\u0441\u0442\u0438 1-3: \u0441\u0435\u0442\u043a\u0430, \u0446\u0432\u0435\u0442\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u044b \u044f\u0447\u0435\u0435\u043a.<\/a><\/p>\n<p>  <a href=\"https:\/\/habr.com\/post\/424491\/\">\u0427\u0430\u0441\u0442\u0438 4-7: \u043d\u0435\u0440\u043e\u0432\u043d\u043e\u0441\u0442\u0438, \u0440\u0435\u043a\u0438 \u0438 \u0434\u043e\u0440\u043e\u0433\u0438.<\/a><\/p>\n<h1>\u0427\u0430\u0441\u0442\u044c 8: \u0432\u043e\u0434\u0430<\/h1>\n<p>  <\/p>\n<ul>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432\u043e\u0434\u0443.<\/li>\n<li>\u0422\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0434\u044b.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0440\u0438\u0431\u043e\u0439 \u0441 \u043f\u0435\u043d\u043e\u0439.<\/li>\n<li>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u043e\u0434\u0443 \u0438 \u0440\u0435\u043a\u0438.<\/li>\n<\/ul>\n<p>  \u041c\u044b \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u0435\u043a, \u0430 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0432\u043e\u0434\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2a9\/73c\/b6e\/2a973cb6eb97eba7d04a325f3ac89a3e.jpg\"><\/div>\n<p>  <i>\u0412\u043e\u0434\u0430 \u043f\u0440\u0438\u0431\u044b\u0432\u0430\u0435\u0442.<\/i><br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b<\/h2>\n<p>  \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432\u043e\u0434\u044b, \u0437\u0430\u0434\u0430\u0432 \u0435\u0451 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u0412\u0441\u0435 \u044f\u0447\u0435\u0439\u043a\u0438, \u0432\u044b\u0441\u043e\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0432 \u0432\u043e\u0434\u0443. \u041d\u043e \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u043e\u0434\u044b \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u044b\u0441\u043e\u0442\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b <code>HexCell<\/code> \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b.<\/p>\n<pre><code class=\"cs\">\tpublic int WaterLevel { \t\tget { \t\t\treturn waterLevel; \t\t} \t\tset { \t\t\tif (waterLevel == value) { \t\t\t\treturn; \t\t\t} \t\t\twaterLevel = value; \t\t\tRefresh(); \t\t} \t} \t \tint waterLevel;<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439. \u041d\u043e \u043f\u043e\u043a\u0430 \u044f \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0443. \u0422\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438, \u043a\u0430\u043a \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u0434\u043e\u0440\u043e\u0433\u0438, \u043c\u0435\u043d\u044f \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0437\u0430\u0442\u043e\u043f\u043b\u0435\u043d\u044b.<\/p>\n<h3>\u0417\u0430\u0442\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u0438 \u0432\u043e\u0434\u044b, \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439. \u042f\u0447\u0435\u0439\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439, \u0435\u0441\u043b\u0438 \u0435\u0451 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b \u0432\u044b\u0448\u0435 \u0435\u0451 \u0432\u044b\u0441\u043e\u0442\u044b. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<pre><code class=\"cs\">\tpublic bool IsUnderwater { \t\tget { \t\t\treturn waterLevel &gt; elevation; \t\t} \t}<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b \u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u0440\u0430\u0432\u043d\u044b, \u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0430 \u0432\u043e\u0437\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0434 \u0432\u043e\u0434\u043e\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0434\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0438\u0436\u0435 \u044d\u0442\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b. \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0440\u0435\u043a, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u2014 <code>HexMetrics.riverSurfaceElevationOffset<\/code>. \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0435\u0435.<\/p>\n<pre><code class=\"cs\">\/\/\tpublic const float riverSurfaceElevationOffset = -0.5f; \tpublic const float waterElevationOffset = -0.5f;<\/code><\/pre>\n<p>  \u0418\u0437\u043c\u0435\u043d\u0438\u043c <code>HexCell.RiverSurfaceY<\/code> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u043e\u0432\u043e\u0435 \u0438\u043c\u044f. \u0417\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043a \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0434\u044b \u0437\u0430\u0442\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438.<\/p>\n<pre><code class=\"cs\">\tpublic float RiverSurfaceY { \t\tget { \t\t\treturn \t\t\t\t(elevation + HexMetrics.waterElevationOffset) * \t\t\t\tHexMetrics.elevationStep; \t\t} \t} \t \tpublic float WaterSurfaceY { \t\tget { \t\t\treturn \t\t\t\t(waterLevel + HexMetrics.waterElevationOffset) * \t\t\t\tHexMetrics.elevationStep; \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0434\u044b<\/h3>\n<p>  \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u043e\u0434\u044b \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0432\u044b\u0441\u043e\u0442\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>HexMapEditor<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b \u0438 \u0442\u043e, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0451 \u043a \u044f\u0447\u0435\u0439\u043a\u0430\u043c.<\/p>\n<pre><code class=\"cs\">\tint activeElevation; \tint activeWaterLevel;  \t\u2026 \t \tbool applyElevation = true; \tbool applyWaterLevel = true; \t \t<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441 UI.<\/p>\n<pre><code class=\"cs\">\tpublic void SetApplyWaterLevel (bool toggle) { \t\tapplyWaterLevel = toggle; \t} \t \tpublic void SetWaterLevel (float level) { \t\tactiveWaterLevel = (int)level; \t}<\/code><\/pre>\n<p>  \u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b \u0432 <code>EditCell<\/code>.<\/p>\n<pre><code class=\"cs\">\tvoid EditCell (HexCell cell) { \t\tif (cell) { \t\t\tif (applyColor) { \t\t\t\tcell.Color = activeColor; \t\t\t} \t\t\tif (applyElevation) { \t\t\t\tcell.Elevation = activeElevation; \t\t\t} \t\t\tif (applyWaterLevel) { \t\t\t\tcell.WaterLevel = activeWaterLevel; \t\t\t} \t\t\t\u2026 \t\t} \t}<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 UI \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b, \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u043c \u043c\u0435\u0442\u043a\u0443 \u0438 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0432\u044b\u0441\u043e\u0442\u044b, \u0430 \u043f\u043e\u0442\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0438\u0445. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/42b\/a13\/de4\/42ba13de4120b43e460628021c77d99f.png\"><\/div>\n<p>  <i>\u041f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u043e\u0434\u044b.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-8\/water-level\/water-level.unitypackage\">unitypackage<\/a><\/p>\n<h2>\u0422\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u044f \u0432\u043e\u0434\u044b<\/h2>\n<p>  \u0414\u043b\u044f \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u0432\u043e\u0434\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0448 \u0441 \u043d\u043e\u0432\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0448\u0435\u0439\u0434\u0435\u0440 <em>Water<\/em>, \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0432 \u0448\u0435\u0439\u0434\u0435\u0440 <em>River<\/em>. \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u0435\u0433\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0446\u0432\u0435\u0442\u0430.<\/p>\n<pre><code>Shader \"Custom\/Water\" { \tProperties { \t\t_Color (\"Color\", Color) = (1,1,1,1) \t\t_MainTex (\"Albedo (RGB)\", 2D) = \"white\" {} \t\t_Glossiness (\"Smoothness\", Range(0,1)) = 0.5 \t\t_Metallic (\"Metallic\", Range(0,1)) = 0.0 \t} \tSubShader { \t\tTags { \"RenderType\"=\"Transparent\" \"Queue\"=\"Transparent\" } \t\tLOD 200 \t\t \t\tCGPROGRAM \t\t#pragma surface surf Standard alpha \t\t#pragma target 3.0  \t\tsampler2D _MainTex;  \t\tstruct Input { \t\t\tfloat2 uv_MainTex; \t\t};  \t\thalf _Glossiness; \t\thalf _Metallic; \t\tfixed4 _Color;  \t\tvoid surf (Input IN, inout SurfaceOutputStandard o) { \t\t\tfixed4 c = _Color; \t\t\to.Albedo = c.rgb; \t\t\to.Metallic = _Metallic; \t\t\to.Smoothness = _Glossiness; \t\t\to.Alpha = c.a; \t\t} \t\tENDCG \t} \tFallBack \"Diffuse\" }<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441 \u044d\u0442\u0438\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u043c, \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0432 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b <em>Water<\/em> \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0435\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440. \u041e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0448\u0443\u043c\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0437\u0436\u0435 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fd9\/238\/283\/fd9238283d92bacd26a3ff5dce73b17b.png\"><\/div>\n<p>  <i>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b Water.<\/i><\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043f\u0440\u0435\u0444\u0430\u0431\u0443 \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <em>Rivers<\/em>. \u0415\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0438 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b <em>Water<\/em>. \u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e, \u0441\u043e\u0437\u0434\u0430\u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0440\u0435\u0444\u0430\u0431\u0430, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0435\u0433\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a \u043f\u0440\u0435\u0444\u0430\u0431\u0443. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6ec\/6e6\/82f\/6ec6e682f16c604d75c0e5b835d5b03e.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7c5\/3f3\/eeb\/7c53f3eeb282e533f9f0b8a20e813091.png\"><\/div>\n<p>  <i>\u0414\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 Water.<\/i><\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexGridChunk<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043c\u0435\u0448\u0430 \u0432\u043e\u0434\u044b.<\/p>\n<pre><code class=\"cs\">\tpublic HexMesh terrain, rivers, roads, water;  \tpublic void Triangulate () { \t\tterrain.Clear(); \t\trivers.Clear(); \t\troads.Clear(); \t\twater.Clear(); \t\tfor (int i = 0; i &lt; cells.Length; i++) { \t\t\tTriangulate(cells[i]); \t\t} \t\tterrain.Apply(); \t\trivers.Apply(); \t\troads.Apply(); \t\twater.Apply(); \t}<\/code><\/pre>\n<p>  \u0418 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0435\u0433\u043e \u0441 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043f\u0440\u0435\u0444\u0430\u0431\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b4d\/19a\/76a\/b4d19a76a745d550314b277fd2c0e13c.png\"><\/div>\n<p>  <i>\u041e\u0431\u044a\u0435\u043a\u0442 Water \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d.<\/i><\/p>\n<h3>\u0428\u0435\u0441\u0442\u0438\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0432\u043e\u0434\u044b<\/h3>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u043e\u0434\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0439, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u0430\u0434\u0438\u043c \u0435\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0432 \u0432\u043e\u0434\u0443.<\/p>\n<pre><code class=\"cs\">\tvoid Triangulate (HexDirection direction, HexCell cell) { \t\t\u2026  \t\tif (cell.IsUnderwater) { \t\t\tTriangulateWater(direction, cell, center); \t\t} \t}  \tvoid TriangulateWater ( \t\tHexDirection direction, HexCell cell, Vector3 center \t) { \t}<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0440\u0435\u043a\u0430\u043c\u0438, \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0434\u044b \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043e\u0434\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043d\u0430\u043c, \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0440\u0451\u0431\u0440\u0430. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateWater ( \t\tHexDirection direction, HexCell cell, Vector3 center \t) { \t\tcenter.y = cell.WaterSurfaceY; \t\tVector3 c1 = center + HexMetrics.GetFirstSolidCorner(direction); \t\tVector3 c2 = center + HexMetrics.GetSecondSolidCorner(direction);  \t\twater.AddTriangle(center, c1, c2); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a51\/72b\/99b\/a5172b99ba382c6e79abff653e4b7fb2.png\"><\/div>\n<p>  <i>\u0428\u0435\u0441\u0442\u0438\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0432\u043e\u0434\u044b.<\/i><\/p>\n<h3>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432\u043e\u0434\u044b<\/h3>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441 \u0432\u043e\u0434\u043e\u0439 \u043e\u0434\u043d\u0438\u043c \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c.<\/p>\n<pre><code class=\"cs\">\t\twater.AddTriangle(center, c1, c2);  \t\tif (direction &lt;= HexDirection.SE) { \t\t\tHexCell neighbor = cell.GetNeighbor(direction); \t\t\tif (neighbor == null || !neighbor.IsUnderwater) { \t\t\t\treturn; \t\t\t}  \t\t\tVector3 bridge = HexMetrics.GetBridge(direction); \t\t\tVector3 e1 = c1 + bridge; \t\t\tVector3 e2 = c2 + bridge;  \t\t\twater.AddQuad(c1, c2, e1, e2); \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0a6\/3af\/949\/0a63af9496da925e966b008f41f808a8.png\"><\/div>\n<p>  <i>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0451\u0432 \u0432\u043e\u0434\u044b.<\/i><\/p>\n<p>  \u0418 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0443\u0433\u043b\u044b \u043e\u0434\u043d\u0438\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c.<\/p>\n<pre><code class=\"cs\">\t\tif (direction &lt;= HexDirection.SE) { \t\t\t\u2026  \t\t\twater.AddQuad(c1, c2, e1, e2);  \t\t\tif (direction &lt;= HexDirection.E) { \t\t\t\tHexCell nextNeighbor = cell.GetNeighbor(direction.Next()); \t\t\t\tif (nextNeighbor == null || !nextNeighbor.IsUnderwater) { \t\t\t\t\treturn; \t\t\t\t} \t\t\t\twater.AddTriangle( \t\t\t\t\tc2, e2, c2 + HexMetrics.GetBridge(direction.Next()) \t\t\t\t); \t\t\t} \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c32\/37e\/5b4\/c3237e5b4e492f9a1c334f90aaa88ee4.png\"><\/div>\n<p>  <i>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0443\u0433\u043b\u043e\u0432 \u0432\u043e\u0434\u044b.<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438 \u0432\u043e\u0434\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c\u044b\u0435, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c. \u041e\u043d\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0438 \u0441\u0443\u0445\u0438\u043c\u0438 \u043a\u043b\u0435\u0442\u0430\u043c\u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0432\u044b\u0441\u043e\u0442\u043e\u0439, \u043d\u043e \u044d\u0442\u043e \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430 \u043f\u043e\u0442\u043e\u043c.<\/p>\n<h3>\u0421\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u0432\u043e\u0434\u044b<\/h3>\n<p>  \u041c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a \u0438 \u0435\u0441\u0442\u044c, \u0442\u043e \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fcf\/a8b\/b4f\/fcfa8bb4fb960ddc788d358e60f9023f.png\"><\/div>\n<p>  <i>\u041d\u0435\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u0432\u043e\u0434\u044b.<\/i><\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0434\u0443 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u043e\u0434\u044b \u0437\u0430\u0442\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u0435\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u044f\u0447\u0435\u0439\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0432 \u0432\u043e\u0434\u0443. \u042d\u0442\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u0437\u0430\u0434\u0430\u044e\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430.<\/p>\n<p>  \u041e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0431\u044b\u0441\u0442\u0440\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f. \u041f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u044e \u043a\u0430\u0440\u0442\u0443. \u0422\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c\u0443 \u0441\u043a\u0430\u0447\u043a\u0443 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u042d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u041f\u043e\u043a\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0432\u043e\u0434\u044b \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430 \u0441\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-8\/triangulating-water\/triangulating-water.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0410\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0434\u044b<\/h2>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0447\u0442\u043e, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0435\u0435 \u0432\u043e\u043b\u043d\u044b. \u041a\u0430\u043a \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445, \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f \u043a \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0435, \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u043b\u043d.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ca1\/a2f\/1f9\/ca1a2f1f978cd2f2993a96b44440227b.png\"><\/div>\n<p>  <i>\u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043b\u043e\u0441\u043a\u0430\u044f \u0432\u043e\u0434\u0430.<\/i><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0441 \u0440\u0435\u043a\u0430\u043c\u0438. \u0421\u044d\u043c\u043f\u043b\u0438\u0440\u0443\u0435\u043c \u0448\u0443\u043c \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u043c\u0438\u0440\u0430 \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u043a \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u043e\u043c\u0443 \u0446\u0432\u0435\u0442\u0443. \u0427\u0442\u043e\u0431\u044b \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c, \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043c \u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435 V \u0432\u0440\u0435\u043c\u044f.<\/p>\n<pre><code>\t\tstruct Input { \t\t\tfloat2 uv_MainTex; \t\t\tfloat3 worldPos; \t\t};  \t\t\u2026  \t\tvoid surf (Input IN, inout SurfaceOutputStandard o) { \t\t\tfloat2 uv = IN.worldPos.xz; \t\t\tuv.y += _Time.y; \t\t\tfloat4 noise = tex2D(_MainTex, uv * 0.025); \t\t\tfloat waves = noise.z;  \t\t\tfixed4 c = saturate(_Color + waves); \t\t\to.Albedo = c.rgb; \t\t\to.Metallic = _Metallic; \t\t\to.Smoothness = _Glossiness; \t\t\to.Alpha = c.a; \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 54.9995%;\"><iframe src=\"https:\/\/gfycat.com\/ifr\/AcceptableDarlingCoypu\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <i>\u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0434\u044b, \u0432\u0440\u0435\u043c\u044f \u00d710.<\/i><\/p>\n<h3>\u0414\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/h3>\n<p>  \u041f\u043e\u043a\u0430 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0432\u043e\u043b\u043d\u044b. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u044d\u043c\u043f\u043b \u0448\u0443\u043c\u0430 <br \/>  \u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 U. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u0448\u0443\u043c\u0430, \u0447\u0442\u043e\u0431\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430. \u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0432\u043e\u043b\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0441\u044d\u043c\u043f\u043b\u0430\u043c\u0438, \u0441\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<pre><code>\t\t\tfloat2 uv1 = IN.worldPos.xz; \t\t\tuv1.y += _Time.y; \t\t\tfloat4 noise1 = tex2D(_MainTex, uv1 * 0.025);  \t\t\tfloat2 uv2 = IN.worldPos.xz; \t\t\tuv2.x += _Time.y; \t\t\tfloat4 noise2 = tex2D(_MainTex, uv2 * 0.025);  \t\t\tfloat waves = noise1.z + noise2.x;<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0431\u043e\u0438\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 0\u20132, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a 0\u20131. \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u043b\u043d \u043f\u043e\u043f\u043e\u043b\u0430\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>smoothstep<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u041c\u044b \u043d\u0430\u043b\u043e\u0436\u0438\u043c \u00be\u20132 \u043d\u0430 0\u20131, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0434\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0432\u043e\u043b\u043d.<\/p>\n<pre><code>\t\t\tfloat waves = noise1.z + noise2.x; \t\t\twaves = smoothstep(0.75, 2, waves);<\/code><\/pre>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 54.9995%;\"><iframe src=\"https:\/\/gfycat.com\/ifr\/FaroffImpassionedIberianlynx\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <i>\u0414\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0432\u0440\u0435\u043c\u044f \u00d710.<\/i><\/p>\n<h3>\u0412\u043e\u043b\u043d\u044b \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>  \u0412\u0441\u0451 \u0435\u0449\u0451 \u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0448\u0443\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f. \u0411\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u0435\u0435, \u0435\u0441\u043b\u0438 \u0431\u044b \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u0448\u0443\u043c\u0430. \u041d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u044d\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f, \u0438\u043d\u0430\u0447\u0435 \u0432\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0434\u044b \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0430 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u043e\u043b\u043d\u0443 \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0412\u043e\u043b\u043d\u0443 \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0434\u044b. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u0438\u0440\u0430 X \u0438 Z \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u043a \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>sin<\/code>. \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043e\u043b\u043e\u0441\u044b. \u0418 \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043c \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<pre><code>\t\t\tfloat blendWave = \t\t\t\tsin((IN.worldPos.x + IN.worldPos.z) * 0.1 + _Time.y);<\/code><\/pre>\n<p>  \u0421\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u044b \u043a\u043e\u043b\u0435\u0431\u043b\u044e\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \u043e\u0442 -1 \u0438 1, \u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b 0\u20131. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e, \u0432\u043e\u0437\u0432\u0435\u0434\u044f \u0432\u043e\u043b\u043d\u0443 \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442. \u0427\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code>\t\t\tsin((IN.worldPos.x + IN.worldPos.z) * 0.1 + _Time.y); \t\t\tblendWave *= blendWave;  \t\t\tfloat waves = noise1.z + noise2.x; \t\t\twaves = smoothstep(0.75, 2, waves);  \t\t\tfixed4 c = blendWave; \/\/saturate(_Color + waves);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/aa3\/3d9\/d70\/aa33d9d70a022df57a0348423181b258.png\"><\/div>\n<p>  <i>\u0412\u043e\u043b\u043d\u044b \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u044f.<\/i><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u043b\u043d\u044b \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u043d\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u043c\u0438, \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043c \u043a \u043d\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430 \u0438\u0437 \u043e\u0431\u043e\u0438\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432.<\/p>\n<pre><code>\t\t\tfloat blendWave = sin( \t\t\t\t(IN.worldPos.x + IN.worldPos.z) * 0.1 + \t\t\t\t(noise1.y + noise2.z) + _Time.y \t\t\t); \t\t\tblendWave *= blendWave;<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/618\/c8f\/697\/618c8f697cd2e463d7349030277d1a82.png\"><\/div>\n<p>  <i>\u0418\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u0435 \u0432\u043e\u043b\u043d\u044b \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u044f.<\/i><\/p>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u043e\u043b\u043d\u0443 \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0443 \u043e\u0431\u043e\u0438\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u0448\u0443\u043c\u0430. \u0414\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430.<\/p>\n<pre><code>\t\t\tfloat waves = \t\t\t\tlerp(noise1.z, noise1.w, blendWave) + \t\t\t\tlerp(noise2.x, noise2.y, blendWave); \t\t\twaves = smoothstep(0.75, 2, waves);  \t\t\tfixed4 c = saturate(_Color + waves);<\/code><\/pre>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 54.9995%;\"><iframe src=\"https:\/\/gfycat.com\/ifr\/UnlawfulPolishedAmurminnow\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <i>\u0421\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u043e\u043b\u043d, \u0432\u0440\u0435\u043c\u044f \u00d72.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-8\/animating-water\/animating-water.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u041f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435<\/h2>\n<p>  \u041c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0432\u043e\u0434\u043e\u0439, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b \u0432 \u0432\u043e\u0434\u0435 \u0432\u0434\u043e\u043b\u044c \u0431\u0435\u0440\u0435\u0433\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0443\u0440\u0430\u043c \u0441\u0443\u0448\u0438, \u0432\u043e\u0434\u0430 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c <code>TriangulateWater<\/code> \u043d\u0430 \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u2014 \u043e\u0434\u0438\u043d \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0432\u043e\u0434\u044b, \u0432\u0442\u043e\u0440\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u044e\u044e \u044f\u0447\u0435\u0439\u043a\u0443. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 <code>TriangulateWater<\/code> \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u043e\u0441\u0435\u0434\u0430. \u0415\u0441\u043b\u0438 \u0441\u043e\u0441\u0435\u0434 \u0435\u0441\u0442\u044c \u0438 \u043e\u043d \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439, \u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435\u043c.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateWater ( \t\tHexDirection direction, HexCell cell, Vector3 center \t) { \t\tcenter.y = cell.WaterSurfaceY;  \t\tHexCell neighbor = cell.GetNeighbor(direction); \t\tif (neighbor != null &amp;&amp; !neighbor.IsUnderwater) { \t\t\tTriangulateWaterShore(direction, cell, neighbor, center); \t\t} \t\telse { \t\t\tTriangulateOpenWater(direction, cell, neighbor, center); \t\t} \t}  \tvoid TriangulateOpenWater ( \t\tHexDirection direction, HexCell cell, HexCell neighbor, Vector3 center \t) { \t\tVector3 c1 = center + HexMetrics.GetFirstSolidCorner(direction); \t\tVector3 c2 = center + HexMetrics.GetSecondSolidCorner(direction);  \t\twater.AddTriangle(center, c1, c2);  \t\tif (direction &lt;= HexDirection.SE &amp;&amp; neighbor != null) { \/\/\t\t\tHexCell neighbor = cell.GetNeighbor(direction); \/\/\t\t\tif (neighbor == null || !neighbor.IsUnderwater) { \/\/\t\t\t\treturn; \/\/\t\t\t} \t\t\t \t\t\tVector3 bridge = HexMetrics.GetBridge(direction); \t\t\t\u2026 \t\t} \t}  \tvoid TriangulateWaterShore ( \t\tHexDirection direction, HexCell cell, HexCell neighbor, Vector3 center \t) { \t\t \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f04\/799\/441\/f0479944178dcb5646bbf935700a798e.png\"><\/div>\n<p>  <i>\u0422\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u0432\u0434\u043e\u043b\u044c \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f \u043d\u0435\u0442.<\/i><\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u043e, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043a\u0430\u0437\u0438\u0442\u044c \u0438 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0432\u043e\u0434\u044b \u0432\u0434\u043e\u043b\u044c \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0440\u0451\u0431\u0435\u0440 \u0438 \u0432\u0435\u0435\u0440 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateWaterShore ( \t\tHexDirection direction, HexCell cell, HexCell neighbor, Vector3 center \t) { \t\tEdgeVertices e1 = new EdgeVertices( \t\t\tcenter + HexMetrics.GetFirstSolidCorner(direction), \t\t\tcenter + HexMetrics.GetSecondSolidCorner(direction) \t\t); \t\twater.AddTriangle(center, e1.v1, e1.v2); \t\twater.AddTriangle(center, e1.v2, e1.v3); \t\twater.AddTriangle(center, e1.v3, e1.v4); \t\twater.AddTriangle(center, e1.v4, e1.v5); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bbd\/761\/283\/bbd76128386859bb388e6e2d3f105ff0.png\"><\/div>\n<p>  <i>\u0412\u0435\u0435\u0440\u044b \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0432\u0434\u043e\u043b\u044c \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f.<\/i><\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0451\u0442 \u043f\u043e\u043b\u043e\u0441\u0430 \u0440\u0451\u0431\u0435\u0440, \u043a\u0430\u043a \u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0440\u0435\u043b\u044c\u0435\u0444\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>TriangulateWaterShore<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435\u043c, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0441\u0430 \u043d\u0443\u0436\u043d\u0430 \u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<pre><code class=\"cs\">\t\twater.AddTriangle(center, e1.v4, e1.v5); \t\t \t\tVector3 bridge = HexMetrics.GetBridge(direction); \t\tEdgeVertices e2 = new EdgeVertices( \t\t\te1.v1 + bridge, \t\t\te1.v5 + bridge \t\t); \t\twater.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); \t\twater.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); \t\twater.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); \t\twater.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7da\/fbc\/aa9\/7dafbcaa95a4b48509ab68fbf111c703.png\"><\/div>\n<p>  <i>\u041f\u043e\u043b\u043e\u0441\u044b \u0440\u0451\u0431\u0435\u0440 \u0432\u0434\u043e\u043b\u044c \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f.<\/i><\/p>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a.<\/p>\n<pre><code class=\"cs\">\t\twater.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5);  \t\tHexCell nextNeighbor = cell.GetNeighbor(direction.Next()); \t\tif (nextNeighbor != null) { \t\t\twater.AddTriangle( \t\t\t\te1.v5, e2.v5, e1.v5 + HexMetrics.GetBridge(direction.Next()) \t\t\t); \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/064\/18f\/8b1\/06418f8b10cc0fc0a4e2276b86375385.png\"><\/div>\n<p>  <i>\u0423\u0433\u043b\u044b \u0440\u0451\u0431\u0435\u0440 \u0432\u0434\u043e\u043b\u044c \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f.<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0432\u043e\u0434\u0430 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f. \u0427\u0430\u0441\u0442\u044c \u0435\u0451 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0438\u0436\u0435 \u043c\u0435\u0448\u0430 \u0440\u0435\u043b\u044c\u0435\u0444\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u044b\u0440\u044b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.<\/p>\n<h3>UV \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f<\/h3>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0451 \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u0443 \u043f\u0440\u0438\u0431\u0440\u0435\u0436\u043d\u043e\u0439 \u0432\u043e\u0434\u044b \u0438\u043c\u0435\u043b\u0430\u0441\u044c \u0441\u0432\u043e\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u0435\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043a \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044e. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u0448\u0435\u0439\u0434\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u0438\u0437\u043e\u043a \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044e. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.<\/p>\n<p>  \u0423 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0432\u043e\u0434\u044b \u043d\u0435\u0442 UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438 \u0435\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u043f\u0435\u043d\u0430. \u041e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u043e\u0434\u044b \u0440\u044f\u0434\u043e\u043c \u0441 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043e\u0431\u043e\u0438\u043c \u0442\u0438\u043f\u0430\u043c \u0432\u043e\u0434\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. \u041b\u043e\u0433\u0438\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0448. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexGridChunk<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u0435\u0448\u0430.<\/p>\n<pre><code class=\"cs\">\tpublic HexMesh terrain, rivers, roads, water, waterShore; \t \tpublic void Triangulate () { \t\tterrain.Clear(); \t\trivers.Clear(); \t\troads.Clear(); \t\twater.Clear(); \t\twaterShore.Clear(); \t\tfor (int i = 0; i &lt; cells.Length; i++) { \t\t\tTriangulate(cells[i]); \t\t} \t\tterrain.Apply(); \t\trivers.Apply(); \t\troads.Apply(); \t\twater.Apply(); \t\twaterShore.Apply(); \t}<\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0448 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>TriangulateWaterShore<\/code>.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateWaterShore ( \t\tHexDirection direction, HexCell cell, HexCell neighbor, Vector3 center \t) { \t\t\u2026 \t\twaterShore.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); \t\twaterShore.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); \t\twaterShore.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); \t\twaterShore.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5);  \t\tHexCell nextNeighbor = cell.GetNeighbor(direction.Next()); \t\tif (nextNeighbor != null) { \t\t\twaterShore.AddTriangle( \t\t\t\te1.v5, e2.v5, e1.v5 + HexMetrics.GetBridge(direction.Next()) \t\t\t); \t\t} \t}<\/code><\/pre>\n<p>  \u0414\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u043e\u0434\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0435\u0433\u043e \u0441 \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0448\u0435\u0439\u0434\u0435\u0440 \u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u043f\u0440\u0438\u0431\u0440\u0435\u0436\u043d\u043e\u0439 \u0432\u043e\u0434\u044b, \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0432 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0448\u0435\u0439\u0434\u0435\u0440 \u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0432\u043e\u0434\u044b.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/561\/77e\/e73\/56177ee7331ce092a859a058645f0364.png\"><\/div>\n<p>  <i>\u041e\u0431\u044a\u0435\u043a\u0442 Water shore \u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441 UV.<\/i><\/p>\n<p>  \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u0448\u0435\u0439\u0434\u0435\u0440 <em>Water Shore<\/em> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u043e\u0434\u044b \u043e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.<\/p>\n<pre><code>\t\t\tfixed4 c = fixed4(IN.uv_MainTex, 1, 1);<\/code><\/pre>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u044b, \u043e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442 \u0441\u043f\u043b\u043e\u0448\u043d\u043e\u0439 \u0446\u0432\u0435\u0442. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043b\u0435\u0433\u043a\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435 \u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0448 \u0441 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/630\/45c\/ec0\/63045cec0f1f367bfee191f69cfa11ad.png\"><\/div>\n<p>  <i>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0448 \u0434\u043b\u044f \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f.<\/i><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 V. \u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043e\u0434\u044b \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u0435\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0, \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0443\u0448\u0438 \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1. \u0422\u0430\u043a \u043a\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0432\u0441\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b U \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0432\u043d\u044b 0.<\/p>\n<pre><code class=\"cs\">\t\twaterShore.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); \t\twaterShore.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); \t\twaterShore.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); \t\twaterShore.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); \t\twaterShore.AddQuadUV(0f, 0f, 0f, 1f); \t\twaterShore.AddQuadUV(0f, 0f, 0f, 1f); \t\twaterShore.AddQuadUV(0f, 0f, 0f, 1f); \t\twaterShore.AddQuadUV(0f, 0f, 0f, 1f);  \t\tHexCell nextNeighbor = cell.GetNeighbor(direction.Next()); \t\tif (nextNeighbor != null) { \t\t\twaterShore.AddTriangle( \t\t\t\te1.v5, e2.v5, e1.v5 + HexMetrics.GetBridge(direction.Next()) \t\t\t); \t\t\twaterShore.AddTriangleUV( \t\t\t\tnew Vector2(0f, 0f), \t\t\t\tnew Vector2(0f, 1f), \t\t\t\tnew Vector2(0f, 0f) \t\t\t); \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8f4\/3fa\/f86\/8f43faf864c259e21c2ce731d08f43f6.png\"><\/div>\n<p>  <i>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043a \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f\u043c, \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435.<\/i><\/p>\n<p>  \u0412\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0440\u0451\u0431\u0435\u0440, \u043d\u043e \u043e\u0448\u0438\u0431\u043e\u0447\u0435\u043d \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0433\u043b\u0430\u0445. \u0415\u0441\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043e\u0441\u0435\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439, \u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043e\u0441\u0435\u0434 \u043d\u0435 \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439, \u0442\u043e \u0442\u0440\u0435\u0442\u044c\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0441\u0443\u0448\u0435\u0439.<\/p>\n<pre><code class=\"cs\">\t\t\twaterShore.AddTriangleUV( \t\t\t\tnew Vector2(0f, 0f), \t\t\t\tnew Vector2(0f, 1f), \t\t\t\tnew Vector2(0f, nextNeighbor.IsUnderwater ? 0f : 1f) \t\t\t);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c2e\/9e9\/6e6\/c2e9e96e63c161d0f71f81e31742af89.png\"><\/div>\n<p>  <i>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043a \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f\u043c, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435.<\/i><\/p>\n<h3>\u041f\u0435\u043d\u0430 \u043d\u0430 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043a \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432\u0435\u0440\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u0435\u043d\u044b. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0435\u0440\u0435\u0433\u0430 \u043a \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u043e\u043c\u0443 \u0446\u0432\u0435\u0442\u0443.<\/p>\n<pre><code>\t\tvoid surf (Input IN, inout SurfaceOutputStandard o) { \t\t\tfloat shore = IN.uv_MainTex.y; \t\t\t \t\t\tfloat foam = shore;  \t\t\tfixed4 c = saturate(_Color + foam); \t\t\to.Albedo = c.rgb; \t\t\to.Metallic = _Metallic; \t\t\to.Smoothness = _Glossiness; \t\t\to.Alpha = c.a; \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ef5\/502\/a56\/ef5502a56ab665732312be25a6961817.png\"><\/div>\n<p>  <i>\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u043f\u0435\u043d\u0430.<\/i><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u043d\u0430 \u0431\u044b\u043b\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u0443\u043c\u043d\u043e\u0436\u0438\u043c \u0435\u0451 \u043d\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u044b.<\/p>\n<pre><code>\t\t\tfloat foam = sin(shore * 10); \t\t\tfoam *= foam * shore;<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c2e\/acf\/6d8\/c2eacf6d83e9f7c1298cdd7a05e551d0.png\"><\/div>\n<p>  <i>\u0417\u0430\u0442\u0443\u0445\u0430\u044e\u0449\u0430\u044f \u043f\u0435\u043d\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u044b.<\/i><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0444\u0440\u043e\u043d\u0442 \u043f\u0435\u043d\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043a \u0431\u0435\u0440\u0435\u0433\u0443. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u0437\u044f\u0432 \u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f \u0435\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0440\u0435\u043d\u044c.<\/p>\n<pre><code>\t\t\tfloat shore = IN.uv_MainTex.y; \t\t\tshore = sqrt(shore);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/762\/675\/e98\/762675e987d119034cd5b643c86ca672.png\"><\/div>\n<p>  <i>\u041f\u0435\u043d\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u0443\u0449\u0435 \u0443 \u0431\u0435\u0440\u0435\u0433\u0430.<\/i><\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0435\u0435. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043a \u0431\u0435\u0440\u0435\u0433\u0443 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0441\u043b\u0430\u0431\u0435\u0435. \u0422\u0430\u043a \u043e\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u0438 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f.<\/p>\n<pre><code>\t\t\tfloat2 noiseUV = IN.worldPos.xz; \t\t\tfloat4 noise = tex2D(_MainTex, noiseUV * 0.015);  \t\t\tfloat distortion = noise.x * (1 - shore); \t\t\tfloat foam = sin((shore + distortion) * 10); \t\t\tfoam *= foam * shore;<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/31a\/7fd\/59a\/31a7fd59ad215b200571133543f1406b.png\"><\/div>\n<p>  <i>\u041f\u0435\u043d\u0430 \u0441 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438.<\/i><\/p>\n<p>  \u0418, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0432\u0441\u0451 \u044d\u0442\u043e \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u043c: \u0438 \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u0443, \u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code>\t\t\tfloat2 noiseUV = IN.worldPos.xz + _Time.y * 0.25; \t\t\tfloat4 noise = tex2D(_MainTex, noiseUV * 0.015);  \t\t\tfloat distortion = noise.x * (1 - shore); \t\t\tfloat foam = sin((shore + distortion) * 10 - _Time.y); \t\t\tfoam *= foam * shore;<\/code><\/pre>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 58.0653%;\"><iframe src=\"https:\/\/gfycat.com\/ifr\/SpryWideeyedBrownbear\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <i>\u0410\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u043d\u0430.<\/i><\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u043f\u0440\u0438\u0431\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u0435\u043d\u044b, \u0435\u0441\u0442\u044c \u0438 \u043e\u0442\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0430\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u0435\u0451 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0451 \u0441\u043b\u0430\u0431\u0435\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0434\u0432\u0438\u0433. \u0413\u043e\u0442\u043e\u0432\u0430\u044f \u043f\u0435\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u043e\u043c \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434.<\/p>\n<pre><code>\t\t\tfloat distortion1 = noise.x * (1 - shore); \t\t\tfloat foam1 = sin((shore + distortion1) * 10 - _Time.y); \t\t\tfoam1 *= foam1;  \t\t\tfloat distortion2 = noise.y * (1 - shore); \t\t\tfloat foam2 = sin((shore + distortion2) * 10 + _Time.y + 2); \t\t\tfoam2 *= foam2 * 0.7;  \t\t\tfloat foam = max(foam1, foam2) * shore;<\/code><\/pre>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 58.0653%;\"><iframe src=\"https:\/\/gfycat.com\/ifr\/SerpentineAlarmedBlackpanther\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <i>\u041f\u0440\u0438\u0431\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0438 \u043e\u0442\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0430\u044f \u043f\u0435\u043d\u0430.<\/i><\/p>\n<h3>\u0421\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u043e\u043b\u043d \u0438 \u043f\u0435\u043d\u044b<\/h3>\n<p>  \u041c\u0435\u0436\u0434\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0438 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u043d\u043e\u0439 \u0432\u043e\u0434\u043e\u0439 \u0435\u0441\u0442\u044c \u0440\u0435\u0437\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043e\u043b\u043d\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0432\u043e\u0434\u044b \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 \u0432\u043e\u0434\u0443 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0438 \u0432\u043e\u043b\u043d\u044b \u0432 \u0448\u0435\u0439\u0434\u0435\u0440 <em>Water Shore<\/em>.<\/p>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432\u043e\u043b\u043d, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432 include-\u0444\u0430\u0439\u043b <em>Water.cginc<\/em>. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u043a\u043e\u0434 \u0438 \u0434\u043b\u044f \u043f\u0435\u043d\u044b, \u0438 \u0434\u043b\u044f \u0432\u043e\u043b\u043d, \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 include-\u0444\u0430\u0439\u043b\u044b \u0448\u0435\u0439\u0434\u0435\u0440\u0430?<\/b><\/p>\n<div class=\"spoiler_text\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 include-\u0444\u0430\u0439\u043b\u043e\u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/rendering\/part-5\/\">Rendering 5, Multiple Lights<\/a>.<\/div>\n<\/div>\n<p>  <\/p>\n<pre><code>float Foam (float shore, float2 worldXZ, sampler2D noiseTex) { \/\/\tfloat shore = IN.uv_MainTex.y; \tshore = sqrt(shore);  \tfloat2 noiseUV = worldXZ + _Time.y * 0.25; \tfloat4 noise = tex2D(noiseTex, noiseUV * 0.015);  \tfloat distortion1 = noise.x * (1 - shore); \tfloat foam1 = sin((shore + distortion1) * 10 - _Time.y); \tfoam1 *= foam1;  \tfloat distortion2 = noise.y * (1 - shore); \tfloat foam2 = sin((shore + distortion2) * 10 + _Time.y + 2); \tfoam2 *= foam2 * 0.7;  \treturn max(foam1, foam2) * shore; }  float Waves (float2 worldXZ, sampler2D noiseTex) { \tfloat2 uv1 = worldXZ; \tuv1.y += _Time.y; \tfloat4 noise1 = tex2D(noiseTex, uv1 * 0.025);  \tfloat2 uv2 = worldXZ; \tuv2.x += _Time.y; \tfloat4 noise2 = tex2D(noiseTex, uv2 * 0.025);  \tfloat blendWave = sin( \t\t(worldXZ.x + worldXZ.y) * 0.1 + \t\t(noise1.y + noise2.z) + _Time.y \t); \tblendWave *= blendWave;  \tfloat waves = \t\tlerp(noise1.z, noise1.w, blendWave) + \t\tlerp(noise2.x, noise2.y, blendWave); \treturn smoothstep(0.75, 2, waves); }<\/code><\/pre>\n<p>  \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u0448\u0435\u0439\u0434\u0435\u0440 <em>Water<\/em> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u043e\u0432\u044b\u0439 include-\u0444\u0430\u0439\u043b.<\/p>\n<pre><code>\t\t#include \"Water.cginc\"  \t\tsampler2D _MainTex;  \t\t\u2026  \t\tvoid surf (Input IN, inout SurfaceOutputStandard o) { \t\t\tfloat waves = Waves(IN.worldPos.xz, _MainTex);  \t\t\tfixed4 c = saturate(_Color + waves); \t\t\to.Albedo = c.rgb; \t\t\to.Metallic = _Metallic; \t\t\to.Smoothness = _Glossiness; \t\t\to.Alpha = c.a; \t\t}<\/code><\/pre>\n<p>  \u0412 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 <em>Water Shore<\/em> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0434\u043b\u044f \u043f\u0435\u043d\u044b, \u0438 \u0434\u043b\u044f \u0432\u043e\u043b\u043d. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0440\u0438\u0433\u043b\u0443\u0448\u0430\u0435\u043c \u0432\u043e\u043b\u043d\u044b \u043f\u0440\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043a \u0431\u0435\u0440\u0435\u0433\u0443. \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u043e\u043c \u043f\u0435\u043d\u044b \u0438 \u0432\u043e\u043b\u043d.<\/p>\n<pre><code>\t\t#include \"Water.cginc\"  \t\tsampler2D _MainTex;  \t\t\u2026  \t\tvoid surf (Input IN, inout SurfaceOutputStandard o) { \t\t\tfloat shore = IN.uv_MainTex.y; \t\t\tfloat foam = Foam(shore, IN.worldPos.xz, _MainTex); \t\t\tfloat waves = Waves(IN.worldPos.xz, _MainTex); \t\t\twaves *= 1 - shore;  \t\t\tfixed4 c = saturate(_Color + max(foam, waves)); \t\t\to.Albedo = c.rgb; \t\t\to.Metallic = _Metallic; \t\t\to.Smoothness = _Glossiness; \t\t\to.Alpha = c.a; \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 58.0653%;\"><iframe src=\"https:\/\/gfycat.com\/ifr\/ImpoliteNearAbyssiniangroundhornbill\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <i>\u0421\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u043d\u044b \u0438 \u0432\u043e\u043b\u043d.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-8\/shore-water\/shore-water.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0421\u043d\u043e\u0432\u0430 \u043e \u043f\u0440\u0438\u0431\u0440\u0435\u0436\u043d\u043e\u0439 \u0432\u043e\u0434\u0435<\/h2>\n<p>  \u0427\u0430\u0441\u0442\u044c \u043c\u0435\u0448\u0430 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439 \u043f\u043e\u0434 \u043c\u0435\u0448\u0435\u043c \u0440\u0435\u043b\u044c\u0435\u0444\u0430. \u042d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0441\u043a\u0440\u044b\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043a\u0440\u0443\u0442\u044b\u0435 \u043e\u0431\u0440\u044b\u0432\u044b \u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0431\u041e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u0431\u0440\u0435\u0436\u043d\u043e\u0439 \u0432\u043e\u0434\u044b, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u043f\u0435\u043d\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/dea\/adf\/7e3\/deaadf7e3290f93b28ed6177c713bbaa.png\"><\/div>\n<p>  <i>\u041f\u043e\u0447\u0442\u0438 \u0441\u043a\u0440\u044b\u0442\u0430\u044f \u043f\u0440\u0438\u0431\u0440\u0435\u0436\u043d\u0430\u044f \u0432\u043e\u0434\u0430.<\/i><\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u043b\u043e\u0441\u044b \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0432 \u0440\u0430\u0434\u0438\u0443\u0441 \u0448\u0435\u0441\u0442\u0438\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0432\u043e\u0434\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0443 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0432 <code>HexMetrics<\/code> \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0432\u043e\u0434\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0433\u043b\u043e\u0432 \u0432\u043e\u0434\u044b.<\/p>\n<p>  \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0432\u0435\u043d 0.8. \u0427\u0442\u043e\u0431\u044b \u0443\u0434\u0432\u043e\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0432\u043e\u0434\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0443 \u0432\u043e\u0434\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0.6.<\/p>\n<pre><code class=\"cs\">\tpublic const float waterFactor = 0.6f; \t \tpublic static Vector3 GetFirstWaterCorner (HexDirection direction) { \t\treturn corners[(int)direction] * waterFactor; \t}  \tpublic static Vector3 GetSecondWaterCorner (HexDirection direction) { \t\treturn corners[(int)direction + 1] * waterFactor; \t}<\/code><\/pre>\n<p>  \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u044d\u0442\u0438\u043c\u0438 \u043d\u043e\u0432\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0432 <code>HexGridChunk<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0443\u0433\u043b\u044b \u0432\u043e\u0434\u044b.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateOpenWater ( \t\tHexDirection direction, HexCell cell, HexCell neighbor, Vector3 center \t) { \t\tVector3 c1 = center + HexMetrics.GetFirstWaterCorner(direction); \t\tVector3 c2 = center + HexMetrics.GetSecondWaterCorner(direction);  \t\t\u2026 \t} \t \tvoid TriangulateWaterShore ( \t\tHexDirection direction, HexCell cell, HexCell neighbor, Vector3 center \t) { \t\tEdgeVertices e1 = new EdgeVertices( \t\t\tcenter + HexMetrics.GetFirstWaterCorner(direction), \t\t\tcenter + HexMetrics.GetSecondWaterCorner(direction) \t\t); \t\t\u2026 \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/123\/b85\/fcf\/123b85fcffde7ae313f177f76f882ef5.png\"><\/div>\n<p>  <i>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0433\u043b\u043e\u0432 \u0432\u043e\u0434\u044b.<\/i><\/p>\n<p>  \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0448\u0435\u0441\u0442\u0438\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\u043c\u0438 \u0432\u043e\u0434\u044b \u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0443\u0434\u0432\u043e\u0438\u043b\u043e\u0441\u044c. \u0422\u0435\u043f\u0435\u0440\u044c <code>HexMetrics<\/code> \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0441\u0442\u043e\u0432 \u0432 \u0432\u043e\u0434\u0435.<\/p>\n<pre><code class=\"cs\">\tpublic const float waterBlendFactor = 1f - waterFactor; \t \tpublic static Vector3 GetWaterBridge (HexDirection direction) { \t\treturn (corners[(int)direction] + corners[(int)direction + 1]) * \t\t\twaterBlendFactor; \t}<\/code><\/pre>\n<p>  \u0418\u0437\u043c\u0435\u043d\u0438\u043c <code>HexGridChunk<\/code> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateOpenWater ( \t\tHexDirection direction, HexCell cell, HexCell neighbor, Vector3 center \t) { \t\t\u2026  \t\tif (direction &lt;= HexDirection.SE &amp;&amp; neighbor != null) { \t\t\tVector3 bridge = HexMetrics.GetWaterBridge(direction); \t\t\t\u2026  \t\t\tif (direction &lt;= HexDirection.E) { \t\t\t\t\u2026 \t\t\t\twater.AddTriangle( \t\t\t\t\tc2, e2, c2 + HexMetrics.GetWaterBridge(direction.Next()) \t\t\t\t); \t\t\t} \t\t} \t}  \tvoid TriangulateWaterShore ( \t\tHexDirection direction, HexCell cell, HexCell neighbor, Vector3 center \t) { \t\t\u2026 \t\t \t\tVector3 bridge = HexMetrics.GetWaterBridge(direction); \t\t\u2026  \t\tHexCell nextNeighbor = cell.GetNeighbor(direction.Next()); \t\tif (nextNeighbor != null) { \t\t\twaterShore.AddTriangle( \t\t\t\te1.v5, e2.v5, e1.v5 + \t\t\t\t\tHexMetrics.GetWaterBridge(direction.Next()) \t\t\t); \t\t\t\u2026 \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/99b\/756\/1fa\/99b7561fad8556733ea1f10b2dcdd233.png\"><\/div>\n<p>  <i>\u0414\u043b\u0438\u043d\u043d\u044b\u0435 \u043c\u043e\u0441\u0442\u044b \u0432 \u0432\u043e\u0434\u0435.<\/i><\/p>\n<h3>\u041c\u0435\u0436\u0434\u0443 \u0440\u0451\u0431\u0440\u0430\u043c\u0438 \u0432\u043e\u0434\u044b \u0438 \u0441\u0443\u0448\u0438<\/h3>\n<p>  \u0425\u043e\u0442\u044f \u044d\u0442\u043e \u0438 \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043f\u0435\u043d\u044b, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434 \u0440\u0435\u043b\u044c\u0435\u0444\u043e\u043c \u0441\u043a\u0440\u044b\u0442\u0430 \u0435\u0449\u0451 \u0431\u041e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0431\u0440\u043e \u0432\u043e\u0434\u044b \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043e\u0434\u044b, \u0438 \u0440\u0435\u0431\u0440\u043e \u0441\u0443\u0448\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0443\u0448\u0438.<\/p>\n<p>  \u041c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u043e\u0441\u0442 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0440\u0435\u0431\u0440\u0430 \u0441\u0443\u0448\u0438, \u0435\u0441\u043b\u0438 \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u0443\u0433\u043b\u043e\u0432 \u0432\u043e\u0434\u044b. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0434\u0442\u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u0441\u043e\u0441\u0435\u0434\u0430. \u0418\u0437\u043c\u0435\u043d\u0438\u043c <code>TriangulateWaterShore<\/code> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<pre><code class=\"cs\">\/\/\t\tVector3 bridge = HexMetrics.GetWaterBridge(direction); \t\tVector3 center2 = neighbor.Position; \t\tcenter2.y = center.y; \t\tEdgeVertices e2 = new EdgeVertices( \t\t\tcenter2 + HexMetrics.GetSecondSolidCorner(direction.Opposite()), \t\t\tcenter2 + HexMetrics.GetFirstSolidCorner(direction.Opposite()) \t\t); \t\t\u2026  \t\tHexCell nextNeighbor = cell.GetNeighbor(direction.Next()); \t\tif (nextNeighbor != null) { \t\t\tVector3 center3 = nextNeighbor.Position; \t\t\tcenter3.y = center.y; \t\t\twaterShore.AddTriangle( \t\t\t\te1.v5, e2.v5, center3 + \t\t\t\t\tHexMetrics.GetFirstSolidCorner(direction.Previous()) \t\t\t); \t\t\t\u2026 \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b29\/3f2\/01f\/b293f201f065b7921f1098484e3b725d.png\"><\/div>\n<p>  <i>\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0443\u0433\u043b\u044b \u0440\u0451\u0431\u0435\u0440.<\/i><\/p>\n<p>  \u042d\u0442\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u0441\u043d\u043e\u0432\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u044f \u0434\u043b\u044f \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432.<\/p>\n<pre><code class=\"cs\">\t\tHexCell nextNeighbor = cell.GetNeighbor(direction.Next()); \t\tif (nextNeighbor != null) { \/\/\t\t\tVector3 center3 = nextNeighbor.Position; \/\/\t\t\tcenter3.y = center.y; \t\t\tVector3 v3 = nextNeighbor.Position + (nextNeighbor.IsUnderwater ? \t\t\t\tHexMetrics.GetFirstWaterCorner(direction.Previous()) : \t\t\t\tHexMetrics.GetFirstSolidCorner(direction.Previous())); \t\t\tv3.y = center.y; \t\t\twaterShore.AddTriangle(e1.v5, e2.v5, v3); \t\t\twaterShore.AddTriangleUV( \t\t\t\tnew Vector2(0f, 0f), \t\t\t\tnew Vector2(0f, 1f), \t\t\t\tnew Vector2(0f, nextNeighbor.IsUnderwater ? 0f : 1f) \t\t\t); \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4e1\/f64\/db1\/4e1f64db1a34a8e6cff0f402f5fc6bd8.png\"><\/div>\n<p>  <i>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0443\u0433\u043b\u044b \u0440\u0451\u0431\u0435\u0440.<\/i><\/p>\n<p>  \u042d\u0442\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0432\u0438\u0434\u043d\u0430 \u0431\u041e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u043d\u044b, \u043e\u043d\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0439. \u0427\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e, \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u0430\u0431\u0435\u0435, \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0432 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0435.<\/p>\n<pre><code>\tshore = sqrt(shore) * 0.9;<\/code><\/pre>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 58.0653%;\"><iframe src=\"https:\/\/gfycat.com\/ifr\/FragrantGrandioseKangaroo\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <i>\u0413\u043e\u0442\u043e\u0432\u0430\u044f \u043f\u0435\u043d\u0430.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-8\/more-shore-water\/more-shore-water.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u041f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u0440\u0435\u043a\u0438<\/h2>\n<p>  \u0421 \u0432\u043e\u0434\u043e\u0439 \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0432 \u0442\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u0433\u0434\u0435 \u0432 \u043d\u0435\u0451 \u043d\u0435 \u0432\u0442\u0435\u043a\u0430\u044e\u0442 \u0440\u0435\u043a\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u043e\u0434\u0430 \u0438 \u0440\u0435\u043a\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u0440\u0435\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0442\u0435\u0447\u044c \u0441\u043a\u0432\u043e\u0437\u044c \u0432\u043e\u0434\u0443 \u0438 \u043f\u043e\u0434 \u043d\u0435\u0439.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/051\/1ee\/bc5\/0511eebc5420c9203475b65ce5c478b3.png\"><\/div>\n<p>  <i>\u0420\u0435\u043a\u0438, \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0432 \u0432\u043e\u0434\u0435.<\/i><\/p>\n<p>  \u041f\u043e\u0440\u044f\u0434\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0438\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e \u043a\u0430\u043c\u0435\u0440\u044b. \u0411\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0432\u0435\u0440\u0445\u0443. \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0440\u0435\u043a\u0438, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u043e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c. \u0420\u0435\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0432\u043e\u0434\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u044b. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0448\u0435\u0439\u0434\u0435\u0440\u0430 <em>River<\/em>.<\/p>\n<pre><code>\t\tTags { \"RenderType\"=\"Transparent\" \"Queue\"=\"Transparent+1\" }<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4bc\/74e\/d91\/4bc74ed9179598f5b9e82c3ff0cde851.png\"><\/div>\n<p>  <i>\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438.<\/i><\/p>\n<h3>\u041f\u0440\u044f\u0447\u0435\u043c \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u0440\u0435\u043a\u0438<\/h3>\n<p>  \u0425\u043e\u0442\u044f \u043b\u043e\u0436\u0435 \u0440\u0435\u043a\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439, \u0438 \u0432\u043e\u0434\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0442\u0435\u0447\u044c \u043f\u043e \u043d\u0435\u043c\u0443, \u043c\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u044d\u0442\u0443 \u0432\u043e\u0434\u0443. \u0418 \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043e\u043d\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0434\u044b. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u043e\u0434\u044b \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u0440\u0435\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0440\u0435\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateWithRiverBeginOrEnd ( \t\tHexDirection direction, HexCell cell, Vector3 center, EdgeVertices e \t) { \t\t\u2026  \t\tif (!cell.IsUnderwater) { \t\t\tbool reversed = cell.HasIncomingRiver; \t\t\t\u2026 \t\t} \t} \t \tvoid TriangulateWithRiver ( \t\tHexDirection direction, HexCell cell, Vector3 center, EdgeVertices e \t) { \t\t\u2026  \t\tif (!cell.IsUnderwater) { \t\t\tbool reversed = cell.IncomingRiver == direction; \t\t\t\u2026 \t\t} \t}<\/code><\/pre>\n<p>  \u0414\u043b\u044f <code>TriangulateConnection<\/code> \u043d\u0430\u0447\u043d\u0451\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0440\u0435\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u044f, \u043d\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439.<\/p>\n<pre><code class=\"cs\">\t\tif (cell.HasRiverThroughEdge(direction)) { \t\t\te2.v3.y = neighbor.StreamBedY;  \t\t\tif (!cell.IsUnderwater &amp;&amp; !neighbor.IsUnderwater) { \t\t\t\tTriangulateRiverQuad( \t\t\t\t\te1.v2, e1.v4, e2.v2, e2.v4, \t\t\t\t\tcell.RiverSurfaceY, neighbor.RiverSurfaceY, 0.8f, \t\t\t\t\tcell.HasIncomingRiver &amp;&amp; cell.IncomingRiver == direction \t\t\t\t); \t\t\t} \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/899\/0c7\/cf6\/8990c7cf6af7bf25596b4ffc05204817.png\"><\/div>\n<p>  <i>\u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u0440\u0435\u043a.<\/i><\/p>\n<h3>\u0412\u043e\u0434\u043e\u043f\u0430\u0434\u044b<\/h3>\n<p>  \u041f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u0440\u0435\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u044b\u0440\u044b \u0432 \u0442\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0440\u0435\u043a, \u0433\u0434\u0435 \u043e\u043d\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043e\u0434\u044b. \u0420\u0435\u043a\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441 \u0432\u043e\u0434\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u044b\u0440\u044b \u0438\u043b\u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u043e \u0441\u0430\u043c\u044b\u043c\u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u044b \u0434\u043b\u044f \u0440\u0435\u043a, \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0432\u044b\u0441\u043e\u0442\u044b. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u0438\u043c\u0438.<\/p>\n<p>  \u0421\u0435\u0433\u043c\u0435\u043d\u0442 \u0440\u0435\u043a\u0438 \u0441 \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u043e\u043c \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0434\u044b. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u043d \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043d\u0430\u0434, \u0430 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0434 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043e\u0434\u044b, \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0432 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0443\u0434\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>  \u041d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0432\u0435\u0440\u0448\u0438\u043d, \u0434\u0432\u0443\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0440\u0435\u043a \u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u043e\u0434\u044b. \u041c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0435\u0433\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0442\u0435\u0447\u0435\u043d\u0438\u044f, \u0432\u043d\u0438\u0437 \u043f\u043e \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u043b\u0435\u0432\u0430\u044f \u0438 \u043f\u0440\u0430\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0431\u0443\u0434\u0443\u0442 \u0441\u0432\u0435\u0440\u0445\u0443, \u0430 \u0437\u0430 \u043d\u0438\u043c\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043d\u0438\u0436\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateWaterfallInWater ( \t\tVector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, \t\tfloat y1, float y2, float waterY \t) { \t\tv1.y = v2.y = y1; \t\tv3.y = v4.y = y2; \t\trivers.AddQuad(v1, v2, v3, v4); \t\trivers.AddQuadUV(0f, 1f, 0.8f, 1f); \t}<\/code><\/pre>\n<p>  \u0412\u044b\u0437\u043e\u0432\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432 <code>TriangulateConnection<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0441\u0435\u0434 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439 \u0438 \u0443 \u043d\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u043e\u0434\u043e\u043f\u0430\u0434.<\/p>\n<pre><code class=\"cs\">\t\t\tif (!cell.IsUnderwater) { \t\t\t\tif (!neighbor.IsUnderwater) { \t\t\t\t\tTriangulateRiverQuad( \t\t\t\t\t\te1.v2, e1.v4, e2.v2, e2.v4, \t\t\t\t\t\tcell.RiverSurfaceY, neighbor.RiverSurfaceY, 0.8f, \t\t\t\t\t\tcell.HasIncomingRiver &amp;&amp; cell.IncomingRiver == direction \t\t\t\t\t); \t\t\t\t} \t\t\t\telse if (cell.Elevation &gt; neighbor.WaterLevel) { \t\t\t\t\tTriangulateWaterfallInWater( \t\t\t\t\t\te1.v2, e1.v4, e2.v2, e2.v4, \t\t\t\t\t\tcell.RiverSurfaceY, neighbor.RiverSurfaceY, \t\t\t\t\t\tneighbor.WaterSurfaceY \t\t\t\t\t); \t\t\t\t} \t\t\t}<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u044b \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439, \u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f \u2014 \u043d\u0435\u0442.<\/p>\n<pre><code class=\"cs\">\t\t\tif (!cell.IsUnderwater) { \t\t\t\t\u2026 \t\t\t} \t\t\telse if ( \t\t\t\t!neighbor.IsUnderwater &amp;&amp; \t\t\t\tneighbor.Elevation &gt; cell.WaterLevel \t\t\t) { \t\t\t\tTriangulateWaterfallInWater( \t\t\t\t\te2.v4, e2.v2, e1.v4, e1.v2, \t\t\t\t\tneighbor.RiverSurfaceY, cell.RiverSurfaceY, \t\t\t\t\tcell.WaterSurfaceY \t\t\t\t); \t\t\t}<\/code><\/pre>\n<p>  \u0422\u0430\u043a \u043c\u044b \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043c quad \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u043a\u0438. \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c <code>TriangulateWaterfallInWater<\/code> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043b \u043d\u0438\u0436\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u043e\u0434\u044b. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 Y \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u043e\u0434\u043e\u043f\u0430\u0434 \u043e\u0442 \u043e\u0431\u0440\u044b\u0432\u0430, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u044b\u0440\u044b. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0438\u0436\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a \u0432\u0435\u0440\u0445\u043d\u0438\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/942\/11b\/250\/94211b250d95b614a5d6be6ff52c9e9e.png\"><\/div>\n<p>  <i>\u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u043c.<\/i><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0438\u0436\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432\u0432\u0435\u0440\u0445, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u0438\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0434\u044b \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0443 \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u0430. \u042d\u0442\u043e \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0442\u043e\u0440\u0430.<\/p>\n<pre><code class=\"cs\">\t\tv1.y = v2.y = y1; \t\tv3.y = v4.y = y2; \t\tfloat t = (waterY - y2) \/ (y1 - y2); \t\tv3 = Vector3.Lerp(v3, v1, t); \t\tv4 = Vector3.Lerp(v4, v2, t); \t\trivers.AddQuad(v1, v2, v3, v4); \t\trivers.AddQuadUV(0f, 1f, 0.8f, 1f);<\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0443\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u0434\u043e\u043f\u0430\u0434, \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0438\u0436\u043d\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c, \u043e\u043d\u0438 \u0438\u0441\u043a\u0430\u0437\u044f\u0442\u0441\u044f \u043d\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u043e\u043c. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u0441\u043a\u0430\u0437\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0435\u0440\u0435\u0434 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u0439 quad.<\/p>\n<pre><code class=\"cs\">\t\tv1.y = v2.y = y1; \t\tv3.y = v4.y = y2; \t\tv1 = HexMetrics.Perturb(v1); \t\tv2 = HexMetrics.Perturb(v2); \t\tv3 = HexMetrics.Perturb(v3); \t\tv4 = HexMetrics.Perturb(v4); \t\tfloat t = (waterY - y2) \/ (y1 - y2); \t\tv3 = Vector3.Lerp(v3, v1, t); \t\tv4 = Vector3.Lerp(v4, v2, t); \t\trivers.AddQuadUnperturbed(v1, v2, v3, v4); \t\trivers.AddQuadUV(0f, 1f, 0.8f, 1f);<\/code><\/pre>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u043d\u0430\u043c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f quad-\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>HexMesh.AddQuadUnperturbed<\/code>.<\/p>\n<pre><code class=\"cs\">\tpublic void AddQuadUnperturbed ( \t\tVector3 v1, Vector3 v2, Vector3 v3, Vector3 v4 \t) { \t\tint vertexIndex = vertices.Count; \t\tvertices.Add(v1); \t\tvertices.Add(v2); \t\tvertices.Add(v3); \t\tvertices.Add(v4); \t\ttriangles.Add(vertexIndex); \t\ttriangles.Add(vertexIndex + 2); \t\ttriangles.Add(vertexIndex + 1); \t\ttriangles.Add(vertexIndex + 1); \t\ttriangles.Add(vertexIndex + 2); \t\ttriangles.Add(vertexIndex + 3); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/dc4\/605\/bdd\/dc4605bdd24ed9460b0ca3a310a11fb5.png\"><\/div>\n<p>  <i>\u0412\u043e\u0434\u043e\u043f\u0430\u0434\u044b \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0434\u044b.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-8\/underwater-rivers\/underwater-rivers.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0423\u0441\u0442\u044c\u044f<\/h2>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0440\u0435\u043a\u0438 \u0442\u0435\u043a\u0443\u0442 \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u0432\u044b\u0441\u043e\u0442\u0435, \u0447\u0442\u043e \u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0434\u044b, \u043c\u0435\u0448 \u0440\u0435\u043a\u0438 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0448\u0430 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f. \u0415\u0441\u043b\u0438 \u0431\u044b \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u0440\u0435\u043a\u0430, \u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0430\u044f \u0432 \u043c\u043e\u0440\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043a\u0435\u0430\u043d, \u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0431\u044b \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043f\u0440\u0438\u0431\u043e\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0443\u0441\u0442\u044c\u044f\u043c\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ddd\/27b\/efa\/ddd27befa12ec543e2969505365b0d91.png\"><\/div>\n<p>  <i>\u0420\u0435\u043a\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435\u043c \u0431\u0435\u0437 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d.<\/i><\/p>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0443\u0441\u0442\u044c\u044f\u043c\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, quad-\u044b \u0440\u0435\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442 \u0432\u0442\u043e\u0440\u0443\u044e \u0438 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0440\u0451\u0431\u0435\u0440, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u0442\u0440\u0435\u0442\u044c\u044e. \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435 \u0432\u043e\u0434\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0440\u0435\u0442\u044c\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443, \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u044b\u0440\u0443 \u0438\u043b\u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0443\u0441\u0442\u044c\u0435\u0432.<\/p>\n<p>  \u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0437\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438 \u043f\u0435\u043d\u044b \u0438 \u0440\u0435\u043a\u0438. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0435\u0451, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043a\u0438 \u0438 \u0432\u043e\u0434\u044b.<\/p>\n<p>  \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0443\u0441\u0442\u044c\u044f \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u043d\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 <code>TriangulateWaterShore<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u043a\u0430, \u0434\u0432\u0438\u0436\u0443\u0449\u0430\u044f\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateWaterShore ( \t\tHexDirection direction, HexCell cell, HexCell neighbor, Vector3 center \t) { \t\t\u2026  \t\tif (cell.HasRiverThroughEdge(direction)) { \t\t\tTriangulateEstuary(e1, e2); \t\t} \t\telse { \t\t\twaterShore.AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); \t\t\twaterShore.AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); \t\t\twaterShore.AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); \t\t\twaterShore.AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); \t\t\twaterShore.AddQuadUV(0f, 0f, 0f, 1f); \t\t\twaterShore.AddQuadUV(0f, 0f, 0f, 1f); \t\t\twaterShore.AddQuadUV(0f, 0f, 0f, 1f); \t\t\twaterShore.AddQuadUV(0f, 0f, 0f, 1f); \t\t}  \t\t\u2026 \t}  \tvoid TriangulateEstuary (EdgeVertices e1, EdgeVertices e2) { \t}<\/code><\/pre>\n<p>  \u0420\u0435\u0433\u0438\u043e\u043d, \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043e\u0431\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u044e \u043f\u043e\u043b\u043e\u0441\u0443. \u041d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0444\u043e\u0440\u043c\u044b \u0442\u0440\u0430\u043f\u0435\u0446\u043e\u0438\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f \u043f\u043e \u0431\u043e\u043a\u0430\u043c.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateEstuary (EdgeVertices e1, EdgeVertices e2) { \t\twaterShore.AddTriangle(e2.v1, e1.v2, e1.v1); \t\twaterShore.AddTriangle(e2.v5, e1.v5, e1.v4); \t\twaterShore.AddTriangleUV( \t\t\tnew Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 0f) \t\t); \t\twaterShore.AddTriangleUV( \t\t\tnew Vector2(0f, 1f), new Vector2(0f, 0f), new Vector2(0f, 0f) \t\t); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ece\/ca1\/fc9\/ececa1fc9852f7350a54e00fa71df0b3.png\"><\/div>\n<p>  <i>\u0422\u0440\u0430\u043f\u0435\u0446\u043e\u0438\u0434\u043d\u0430\u044f \u0434\u044b\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u044f.<\/i><\/p>\n<h3>UV2-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b<\/h3>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0440\u0435\u043a\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041d\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u0435\u043d\u044b \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u044b UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 \u0438\u0445 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0438 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u043d\u0430\u0431\u043e\u0440\u0430 UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043c\u0435\u0448\u0438 \u0434\u0432\u0438\u0436\u043a\u0430 Unity \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 UV. \u041d\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 <code>HexMesh<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430.<\/p>\n<pre><code class=\"cs\">\tpublic bool useCollider, useColors, useUVCoordinates, useUV2Coordinates;  \t[NonSerialized] List&lt;Vector2&gt; uvs, uv2s; \t \tpublic void Clear () { \t\t\u2026 \t\tif (useUVCoordinates) { \t\t\tuvs = ListPool&lt;Vector2&gt;.Get(); \t\t} \t\tif (useUV2Coordinates) { \t\t\tuv2s = ListPool&lt;Vector2&gt;.Get(); \t\t} \t\ttriangles = ListPool&lt;int&gt;.Get(); \t}  \tpublic void Apply () { \t\t\u2026 \t\tif (useUVCoordinates) { \t\t\thexMesh.SetUVs(0, uvs); \t\t\tListPool&lt;Vector2&gt;.Add(uvs); \t\t} \t\tif (useUV2Coordinates) { \t\t\thexMesh.SetUVs(1, uv2s); \t\t\tListPool&lt;Vector2&gt;.Add(uv2s); \t\t} \t\t\u2026 \t}<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 UV, \u043c\u044b \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 UV \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u043c \u043d\u0430\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<pre><code class=\"cs\">\tpublic void AddTriangleUV2 (Vector2 uv1, Vector2 uv2, Vector3 uv3) { \t\tuv2s.Add(uv1); \t\tuv2s.Add(uv2); \t\tuv2s.Add(uv3); \t} \t \tpublic void AddQuadUV2 (Vector2 uv1, Vector2 uv2, Vector3 uv3, Vector3 uv4) { \t\tuv2s.Add(uv1); \t\tuv2s.Add(uv2); \t\tuv2s.Add(uv3); \t\tuv2s.Add(uv4); \t}  \tpublic void AddQuadUV2 (float uMin, float uMax, float vMin, float vMax) { \t\tuv2s.Add(new Vector2(uMin, vMin)); \t\tuv2s.Add(new Vector2(uMax, vMin)); \t\tuv2s.Add(new Vector2(uMin, vMax)); \t\tuv2s.Add(new Vector2(uMax, vMax)); \t}<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0440\u0435\u043a\u0438<\/h3>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u0440\u0435\u043a\u0438 \u0432 \u0434\u0432\u0443\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043c \u043a\u043e\u0434 \u0438\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 <em>River<\/em> \u0432 \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e include-\u0444\u0430\u0439\u043b\u0430 <em>Water<\/em>.<\/p>\n<pre><code>float River (float2 riverUV, sampler2D noiseTex) { \tfloat2 uv = riverUV; \tuv.x = uv.x * 0.0625 + _Time.y * 0.005; \tuv.y -= _Time.y * 0.25; \tfloat4 noise = tex2D(noiseTex, uv);  \tfloat2 uv2 = riverUV; \tuv2.x = uv2.x * 0.0625 - _Time.y * 0.0052; \tuv2.y -= _Time.y * 0.23; \tfloat4 noise2 = tex2D(noiseTex, uv2); \t \treturn noise.x * noise2.w; }<\/code><\/pre>\n<p>  \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u0448\u0435\u0439\u0434\u0435\u0440 <em>River<\/em> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<pre><code>\t\t#include \"Water.cginc\"  \t\tsampler2D _MainTex;  \t\t\u2026  \t\tvoid surf (Input IN, inout SurfaceOutputStandard o) { \t\t\tfloat river = River(IN.uv_MainTex, _MainTex); \t\t\t \t\t\tfixed4 c = saturate(_Color + river); \t\t\t\u2026 \t\t}<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0443\u0441\u0442\u044c\u044f<\/h3>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexGridChunk<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u0435\u0448\u0430 \u0443\u0441\u0442\u044c\u044f.<\/p>\n<pre><code class=\"cs\">\tpublic HexMesh terrain, rivers, roads, water, waterShore, estuaries; \t \tpublic void Triangulate () { \t\tterrain.Clear(); \t\trivers.Clear(); \t\troads.Clear(); \t\twater.Clear(); \t\twaterShore.Clear(); \t\testuaries.Clear(); \t\tfor (int i = 0; i &lt; cells.Length; i++) { \t\t\tTriangulate(cells[i]); \t\t} \t\tterrain.Apply(); \t\trivers.Apply(); \t\troads.Apply(); \t\twater.Apply(); \t\twaterShore.Apply(); \t\testuaries.Apply(); \t}<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0448\u0435\u0439\u0434\u0435\u0440, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0441\u0442\u044c\u044f, \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0432 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u0435 \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0435\u0433\u043e. \u0421\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0435\u0433\u043e \u0441 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u043c, \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b UV \u0438 UV2.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/540\/77a\/7fc\/54077a7fc8653228cd723ca855330fed.png\"><\/div>\n<p>  <i>\u041e\u0431\u044a\u0435\u043a\u0442 Estuarties.<\/i><\/p>\n<h3>\u0422\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u044f \u0443\u0441\u0442\u044c\u044f<\/h3>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u044b\u0440\u044b \u0438\u043b\u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0432 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0446\u043e\u043c \u0440\u0435\u043a\u0438 \u0438 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u043e\u0439 \u0440\u0435\u0431\u0440\u0430 \u0432\u043e\u0434\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448 \u0448\u0435\u0439\u0434\u0435\u0440 \u0443\u0441\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f, \u0437\u0430\u0434\u0430\u0434\u0438\u043c UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u043f\u0435\u043d\u044b.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateEstuary (EdgeVertices e1, EdgeVertices e2) { \t\t\u2026  \t\testuaries.AddTriangle(e1.v3, e2.v2, e2.v4); \t\testuaries.AddTriangleUV( \t\t\tnew Vector2(0f, 0f), new Vector2(0f, 1f), new Vector2(0f, 1f) \t\t); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f02\/bb6\/f76\/f02bb6f768f915d39c05296055cc0b83.png\"><\/div>\n<p>  <i>\u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a.<\/i><\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0442\u0440\u0430\u043f\u0435\u0446\u043e\u0438\u0434, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 quad \u0441 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u043e\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430.<\/p>\n<pre><code class=\"cs\">\t\testuaries.AddQuad(e1.v2, e1.v3, e2.v1, e2.v2); \t\testuaries.AddTriangle(e1.v3, e2.v2, e2.v4); \t\testuaries.AddQuad(e1.v3, e1.v4, e2.v4, e2.v5); \t\t \t\testuaries.AddQuadUV(0f, 0f, 0f, 1f); \t\testuaries.AddTriangleUV( \t\t\tnew Vector2(0f, 0f), new Vector2(0f, 1f), new Vector2(0f, 1f) \t\t); \t\testuaries.AddQuadUV(0f, 0f, 0f, 1f);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ef2\/672\/e7e\/ef2672e7e62b9d66463e4fc44dc43b7a.png\"><\/div>\n<p>  <i>\u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0442\u0440\u0430\u043f\u0435\u0446\u043e\u0438\u0434.<\/i><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0451\u043c \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e quad-\u0430 \u0432\u043b\u0435\u0432\u043e, \u0447\u0442\u043e\u0431\u044b \u0443 \u043d\u0435\u0433\u043e \u0431\u044b\u043b\u043e \u0443\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u043e\u0435 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0443\u044e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e.<\/p>\n<pre><code class=\"cs\">\t\testuaries.AddQuad(e2.v1, e1.v2, e2.v2, e1.v3); \t\testuaries.AddTriangle(e1.v3, e2.v2, e2.v4); \t\testuaries.AddQuad(e1.v3, e1.v4, e2.v4, e2.v5); \t\t \t\testuaries.AddQuadUV( \t\t\tnew Vector2(0f, 1f), new Vector2(0f, 0f), \t\t\tnew Vector2(0f, 1f), new Vector2(0f, 0f) \t\t); \/\/\t\testuaries.AddQuadUV(0f, 0f, 0f, 1f);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cd5\/dd0\/7d1\/cd5dd07d1b9f1fb8126e6a5a7c1bc29b.png\"><\/div>\n<p>  <i>\u041f\u043e\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0439 quad, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f<\/i><\/p>\n<h3>\u0422\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u0438<\/h3>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0440\u0435\u043a\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c UV2-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041d\u0438\u0437 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0440\u0435\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 U \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0.5. \u0422\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u043a\u0430 \u0442\u0435\u0447\u0451\u0442 \u043f\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043a \u0432\u043e\u0434\u0435, \u043b\u0435\u0432\u0430 \u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 U, \u0440\u0430\u0432\u043d\u0443\u044e 1, \u0430 \u043f\u0440\u0430\u0432\u0430\u044f \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 U \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0. \u0417\u0430\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c Y \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 0 \u0438 1, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0442\u0435\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cs\">\t\testuaries.AddTriangleUV2( \t\t\tnew Vector2(0.5f, 1f), new Vector2(1f, 0f), new Vector2(0f, 0f) \t\t);<\/code><\/pre>\n<p>  \u0427\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0441 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439. \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0442\u0435 \u0436\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b U \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u043a, \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0448\u0438\u0440\u0438\u043d\u0443 \u0440\u0435\u043a\u0438.<\/p>\n<pre><code class=\"cs\">\t\testuaries.AddQuadUV2( \t\t\tnew Vector2(1f, 0f), new Vector2(1f, 1f), \t\t\tnew Vector2(1f, 0f), new Vector2(0.5f, 1f) \t\t); \t\testuaries.AddTriangleUV2( \t\t\tnew Vector2(0.5f, 1f), new Vector2(1f, 0f), new Vector2(0f, 0f) \t\t); \t\testuaries.AddQuadUV2( \t\t\tnew Vector2(0.5f, 1f), new Vector2(0f, 1f), \t\t\tnew Vector2(0f, 0f), new Vector2(0f, 0f) \t\t);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a98\/475\/d50\/a98475d50fe84d16eeeff5397f6aa43f.png\"><\/div>\n<p>  <i>UV2 \u0442\u0440\u0430\u043f\u0435\u0446\u043e\u0438\u0434\u0430.<\/i><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u0434\u0430\u043b\u0438 UV2-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u043d\u043e, \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043c \u0448\u0435\u0439\u0434\u0435\u0440 <em>Estuary<\/em> \u0438\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>float2 uv2_MainTex<\/code>.<\/p>\n<pre><code>\t\tstruct Input { \t\t\tfloat2 uv_MainTex; \t\t\tfloat2 uv2_MainTex; \t\t\tfloat3 worldPos; \t\t};  \t\t\u2026  \t\tvoid surf (Input IN, inout SurfaceOutputStandard o) { \t\t\tfloat shore = IN.uv_MainTex.y; \t\t\tfloat foam = Foam(shore, IN.worldPos.xz, _MainTex); \t\t\tfloat waves = Waves(IN.worldPos.xz, _MainTex); \t\t\twaves *= 1 - shore;  \t\t\tfixed4 c = fixed4(IN.uv2_MainTex, 1, 1); \t\t\t\u2026 \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/efd\/416\/d95\/efd416d95c7827f264f2f0e8360e6fde.png\"><\/div>\n<p>  <i>UV2-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.<\/i><\/p>\n<p>  \u0412\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0435\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0440\u0435\u043a\u0438.<\/p>\n<pre><code>\t\tvoid surf (Input IN, inout SurfaceOutputStandard o) { \t\t\t\u2026  \t\t\tfloat river = River(IN.uv2_MainTex, _MainTex);  \t\t\tfixed4 c = saturate(_Color + river); \t\t\t\u2026 \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0e3\/2c9\/fda\/0e32c9fda58b356534c2070d0b74adae.png\"><\/div>\n<p>  <i>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c UV2 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0440\u0435\u043a\u0438.<\/i><\/p>\n<p>  \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0440\u0435\u043a\u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b V \u0440\u0435\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0442 0.8 \u0434\u043e 1. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b, \u0430 \u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 0 \u0434\u043e 1. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f \u043d\u0430 50% \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u044f\u0447\u0435\u0435\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u043a\u0438 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 0.8 \u0434\u043e 1.1.<\/p>\n<pre><code class=\"cs\">\t\testuaries.AddQuadUV2( \t\t\tnew Vector2(1f, 0.8f), new Vector2(1f, 1.1f), \t\t\tnew Vector2(1f, 0.8f), new Vector2(0.5f, 1.1f) \t\t); \t\testuaries.AddTriangleUV2( \t\t\tnew Vector2(0.5f, 1.1f), \t\t\tnew Vector2(1f, 0.8f), \t\t\tnew Vector2(0f, 0.8f) \t\t); \t\testuaries.AddQuadUV2( \t\t\tnew Vector2(0.5f, 1.1f), new Vector2(0f, 1.1f), \t\t\tnew Vector2(0f, 0.8f), new Vector2(0f, 0.8f) \t\t);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/27d\/beb\/7c6\/27dbeb7c67553163422fd560e64ddb03.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b0c\/4d9\/2e3\/b0c4d92e3797274e2534a6921334d184.png\"><\/div>\n<p>  <i>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u0438 \u0438 \u0443\u0441\u0442\u044c\u044f.<\/i><\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0442\u0435\u0447\u0435\u043d\u0438\u044f<\/h3>\n<p>  \u041f\u043e\u043a\u0430 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u0438 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u044f\u043c\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0434\u0430 \u0432\u0442\u0435\u043a\u0430\u0435\u0442 \u0432 \u0431\u041e\u043b\u044c\u0448\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u043e\u043d\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f. \u0422\u0435\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0440\u0438\u0432\u043b\u044f\u0442\u044c\u0441\u044f. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e, \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044f UV2-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.<\/p>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b U \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0448\u0438\u0440\u0438\u043d\u044b \u0440\u0435\u043a\u0438, \u0441\u0434\u0432\u0438\u043d\u0435\u043c \u0438\u0445 \u043d\u0430 0.5. \u0421\u0430\u043c\u0430\u044f \u043b\u0435\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1.5, \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u0430\u0432\u0430\u044f \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u22120.5.<\/p>\n<p>  \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043c \u0442\u0435\u0447\u0435\u043d\u0438\u0435, \u0441\u0434\u0432\u0438\u043d\u0443\u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b U \u043b\u0435\u0432\u043e\u0439 \u0438 \u043f\u0440\u0430\u0432\u043e\u0439 \u0442\u043e\u0447\u0435\u043a \u043d\u0438\u0437\u0430. \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u043b\u0435\u0432\u0443\u044e \u0441 1 \u043d\u0430 0.7, \u0430 \u043f\u0440\u0430\u0432\u0443\u044e \u2014 \u0441 0 \u043d\u0430 0.3.<\/p>\n<pre><code class=\"cs\">\t\testuaries.AddQuadUV2( \t\t\tnew Vector2(1.5f, 0.8f), new Vector2(0.7f, 1.1f), \t\t\tnew Vector2(1f, 0.8f), new Vector2(0.5f, 1.1f) \t\t); \t\t\u2026 \t\testuaries.AddQuadUV2( \t\t\tnew Vector2(0.5f, 1.1f), new Vector2(0.3f, 1.1f), \t\t\tnew Vector2(0f, 0.8f), new Vector2(-0.5f, 0.8f) \t\t);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/850\/99d\/976\/85099d97610434a630621e9e06f885ad.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0c1\/567\/f72\/0c1567f72c979734719b298c7850b59e.png\"><\/div>\n<p>  <i>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0442\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u0438.<\/i><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u0438\u0441\u043a\u0440\u0438\u0432\u043b\u0435\u043d\u0438\u044f, \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b V \u0442\u0435\u0445 \u0436\u0435 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0442\u043e\u0447\u0435\u043a. \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u043e\u0434\u0430 \u0442\u0435\u0447\u0451\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043e\u0442 \u043a\u043e\u043d\u0446\u0430 \u0440\u0435\u043a\u0438, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b V \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0434\u043e 1. \u0418 \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043a\u0440\u0438\u0432\u0443\u044e, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b V \u0434\u0432\u0443\u0445 \u043d\u0438\u0436\u043d\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0434\u043e 1.15.<\/p>\n<pre><code class=\"cs\">\t\testuaries.AddQuadUV2( \t\t\tnew Vector2(1.5f, 1f), new Vector2(0.7f, 1.15f), \t\t\tnew Vector2(1f, 0.8f), new Vector2(0.5f, 1.1f) \t\t); \t\testuaries.AddTriangleUV2( \t\t\tnew Vector2(0.5f, 1.1f), \t\t\tnew Vector2(1f, 0.8f), \t\t\tnew Vector2(0f, 0.8f) \t\t); \t\testuaries.AddQuadUV2( \t\t\tnew Vector2(0.5f, 1.1f), new Vector2(0.3f, 1.15f), \t\t\tnew Vector2(0f, 0.8f), new Vector2(-0.5f, 1f) \t\t);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1fa\/86d\/320\/1fa86d32037da7fab579ce9a195d1e71.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b07\/edb\/dfe\/b07edbdfeb3615b1a597712a6bda5c8e.png\"><\/div>\n<p>  <i>\u0418\u0441\u043a\u0440\u0438\u0432\u043b\u0451\u043d\u043d\u043e\u0435 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u0438.<\/i><\/p>\n<h3>\u0421\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u0438 \u0438 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f<\/h3>\n<p>  \u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u2014 \u0441\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f \u0438 \u0440\u0435\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043b\u0438\u043d\u0435\u0439\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044e, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0442\u043e\u0440\u0430 \u0432\u0437\u044f\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f.<\/p>\n<pre><code>\t\t\tfloat shoreWater = max(foam, waves);  \t\t\tfloat river = River(IN.uv2_MainTex, _MainTex);  \t\t\tfloat water = lerp(shoreWater, river, IN.uv_MainTex.x);  \t\t\tfixed4 c = saturate(_Color + water);<\/code><\/pre>\n<p>  \u0425\u043e\u0442\u044f \u044d\u0442\u043e \u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0436\u0430\u043b\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code>_MainTex_ST<\/code>. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 Unity, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>uv_MainTex<\/code> \u0438 <code>uv2_MainTex<\/code>. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0442\u044c.<\/p>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>uv2_MainTex<\/code> \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0435 UV-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c <code>uv2_MainTex<\/code> \u0432 <code>riverUV<\/code>. \u0417\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0448\u0435\u0439\u0434\u0435\u0440 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.<\/p>\n<pre><code>\t\t#pragma surface surf Standard alpha vertex:vert \t\t\u2026 \t\t \t\tstruct Input { \t\t\tfloat2 uv_MainTex; \t\t\tfloat2 riverUV; \t\t\tfloat3 worldPos; \t\t};  \t\t\u2026  \t\tvoid vert (inout appdata_full v, out Input o) { \t\t\tUNITY_INITIALIZE_OUTPUT(Input, o); \t\t\to.riverUV = v.texcoord1.xy; \t\t}  \t\tvoid surf (Input IN, inout SurfaceOutputStandard o) { \t\t\t\u2026  \t\t\tfloat river = River(IN.riverUV, _MainTex);  \t\t\t\u2026 \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/904\/b40\/c98\/904b40c98323b2e9f32bd16513344181.png\"><\/div>\n<p>  <i>\u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f.<\/i><\/p>\n<p>  \u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043b\u0435\u0432\u043e\u0439 \u0438 \u043f\u0440\u0430\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043d\u0430\u0432\u0435\u0440\u0445\u0443. \u0412 \u044d\u0442\u0438\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u0440\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f. \u041d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u0445 \u0440\u0430\u0432\u043d\u043e 0. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0443 \u043d\u0430\u0441 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 U \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 UV, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u043c.<\/p>\n<pre><code class=\"cs\">\t\testuaries.AddQuadUV( \t\t\tnew Vector2(0f, 1f), new Vector2(0f, 0f), \t\t\tnew Vector2(1f, 1f), new Vector2(0f, 0f) \t\t); \t\testuaries.AddTriangleUV( \t\t\tnew Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(1f, 1f) \t\t); \t\testuaries.AddQuadUV( \t\t\tnew Vector2(0f, 0f), new Vector2(0f, 0f), \t\t\tnew Vector2(1f, 1f), new Vector2(0f, 1f) \t\t); \/\/\t\testuaries.AddQuadUV(0f, 0f, 0f, 1f);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b34\/e93\/432\/b34e93432248fb7be818b53aca4d8b20.png\"><\/div>\n<p>  <i>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u0435.<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0441\u0442\u044c\u044f \u0438\u043c\u0435\u044e\u0442 \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0449\u0435\u0439\u0441\u044f \u0440\u0435\u043a\u043e\u0439, \u0432\u043e\u0434\u043e\u0439 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f \u0438 \u043f\u0435\u043d\u043e\u0439. \u0425\u043e\u0442\u044f \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0441 \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u0430\u043c\u0438, \u044d\u0442\u043e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u0441 \u0432\u043e\u0434\u043e\u043f\u0430\u0434\u0430\u043c\u0438.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 58.0653%;\"><iframe src=\"https:\/\/gfycat.com\/ifr\/PointlessSafeGermanspaniel\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <i>\u0423\u0441\u0442\u044c\u044f \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-8\/estuaries\/estuaries.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0420\u0435\u043a\u0438, \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u0432\u043e\u0434\u043e\u0451\u043c\u043e\u0432<\/h2>\n<p>  \u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0440\u0435\u043a\u0438, \u0432\u0442\u0435\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u0432\u043e\u0434\u043e\u0451\u043c\u044b, \u043d\u043e \u043d\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0435\u043a, \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u0415\u0441\u0442\u044c \u043e\u0437\u0451\u0440\u0430, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u043a\u0438 \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u0442\u043e\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0440\u0435\u043a\u0430 \u0432\u044b\u0442\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 \u0432\u043e\u0434\u043e\u0451\u043c\u0430, \u043e\u043d\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u0435\u0447\u0451\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0432\u044b\u0441\u043e\u0442\u044b. \u0412 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e\u0434\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u044b\u0441\u043e\u0442\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexCell<\/code> \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u043d\u043e\u0432\u043e\u043c\u0443 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043e\u0441\u0435\u0434 \u0432\u0435\u0440\u043d\u043e\u0439 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0434\u043b\u044f \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0440\u0435\u043a\u0438.<\/p>\n<pre><code class=\"cs\">\tbool IsValidRiverDestination (HexCell neighbor) { \t\treturn neighbor &amp;&amp; ( \t\t\televation &gt;= neighbor.elevation || waterLevel == neighbor.elevation \t\t); \t}<\/code><\/pre>\n<p>  \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u0430\u0448\u0438\u043c \u043d\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0440\u0435\u043a\u0443.<\/p>\n<pre><code class=\"cs\">\tpublic void SetOutgoingRiver (HexDirection direction) { \t\tif (hasOutgoingRiver &amp;&amp; outgoingRiver == direction) { \t\t\treturn; \t\t}  \t\tHexCell neighbor = GetNeighbor(direction); \/\/\t\tif (!neighbor || elevation &lt; neighbor.elevation) { \t\tif (!IsValidRiverDestination(neighbor)) { \t\t\treturn; \t\t}  \t\tRemoveOutgoingRiver(); \t\t\u2026 \t}<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0442\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0435\u043a\u0438 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0432\u044b\u0441\u043e\u0442\u044b \u044f\u0447\u0435\u0439\u043a\u0438 \u0438\u043b\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u043e\u0434\u044b. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0439\u043c\u0451\u0442\u0441\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439.<\/p>\n<pre><code class=\"cs\">\tvoid ValidateRivers () { \t\tif ( \t\t\thasOutgoingRiver &amp;&amp; \t\t\t!IsValidRiverDestination(GetNeighbor(outgoingRiver)) \t\t) { \t\t\tRemoveOutgoingRiver(); \t\t} \t\tif ( \t\t\thasIncomingRiver &amp;&amp; \t\t\t!GetNeighbor(incomingRiver).IsValidRiverDestination(this) \t\t) { \t\t\tRemoveIncomingRiver(); \t\t} \t}<\/code><\/pre>\n<p>  \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u044d\u0442\u0438\u043c \u043d\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 <code>Elevation<\/code> \u0438 <code>WaterLevel<\/code>.<\/p>\n<pre><code class=\"cs\">\tpublic int Elevation { \t\t\u2026 \t\tset { \t\t\t\u2026  \/\/\t\t\tif ( \/\/\t\t\t\thasOutgoingRiver &amp;&amp; \/\/\t\t\t\televation &lt; GetNeighbor(outgoingRiver).elevation \/\/\t\t\t) { \/\/\t\t\t\tRemoveOutgoingRiver(); \/\/\t\t\t} \/\/\t\t\tif ( \/\/\t\t\t\thasIncomingRiver &amp;&amp; \/\/\t\t\t\televation &gt; GetNeighbor(incomingRiver).elevation \/\/\t\t\t) { \/\/\t\t\t\tRemoveIncomingRiver(); \/\/\t\t\t} \t\t\tValidateRivers();  \t\t\t\u2026 \t\t} \t}  \tpublic int WaterLevel { \t\t\u2026 \t\tset { \t\t\tif (waterLevel == value) { \t\t\t\treturn; \t\t\t} \t\t\twaterLevel = value; \t\t\tValidateRivers(); \t\t\tRefresh(); \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c04\/ca4\/b49\/c04ca4b49ccff20e71dba70dc1a2bea7.png\"><\/div>\n<p>  <i>\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432 \u043e\u0437\u0451\u0440\u0430 \u0440\u0435\u043a\u0438.<\/i><\/p>\n<h3>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 <code>HexGridChunk.TriangulateEstuary<\/code>, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f, \u0447\u0442\u043e \u0440\u0435\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0442\u0435\u043a\u0430\u0442\u044c \u0432 \u0432\u043e\u0434\u043e\u0451\u043c\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0433\u0434\u0430 \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0440\u0435\u043a\u043e\u0439, \u0438\u0441\u0442\u0435\u043a\u0430\u044e\u0449\u0435\u0439 \u0438\u0437 \u0432\u043e\u0434\u043e\u0451\u043c\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b <code>TriangulateEstuary<\/code> \u0437\u043d\u0430\u043b \u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0442\u0435\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u0431\u0443\u043b\u0435\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439, \u0438\u043c\u0435\u0435\u043c \u043b\u0438 \u043c\u044b \u0434\u0435\u043b\u043e \u0441\u043e \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0440\u0435\u043a\u043e\u0439.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateEstuary ( \t\tEdgeVertices e1, EdgeVertices e2, bool incomingRiver \t) { \t\u2026 }<\/code><\/pre>\n<p>  \u0411\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u0437 <code>TriangulateWaterShore<\/code>.<\/p>\n<pre><code class=\"cs\">\t\tif (cell.HasRiverThroughEdge(direction)) { \t\t\tTriangulateEstuary(e1, e2, cell.IncomingRiver == direction); \t\t}<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u043a\u0438, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b UV2. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b U \u0434\u043b\u044f \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0440\u0435\u043a \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0437\u0435\u0440\u043a\u0430\u043b\u0438\u0442\u044c: \u22120.5 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 1.5, 0 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 1, 1 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 0, \u0430 1.5 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u22120.5.<\/p>\n<p>  \u0421 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 V \u0432\u0441\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 \u043f\u0435\u0440\u0435\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u043c\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0435\u043a, \u0442\u043e 0.8 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0442\u0430\u0442\u044c 0, \u0430 1 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0442\u0430\u0442\u044c \u22120.2. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e 1.1 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u22120.3, \u0430 1.15 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u22120.35.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b UV2 \u043e\u0447\u0435\u043d\u044c \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u043b\u044f \u043d\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateEstuary ( \t\tEdgeVertices e1, EdgeVertices e2, bool incomingRiver \t) { \t\t\u2026  \t\tif (incomingRiver) { \t\t\testuaries.AddQuadUV2( \t\t\t\tnew Vector2(1.5f, 1f), new Vector2(0.7f, 1.15f), \t\t\t\tnew Vector2(1f, 0.8f), new Vector2(0.5f, 1.1f) \t\t\t); \t\t\testuaries.AddTriangleUV2( \t\t\t\tnew Vector2(0.5f, 1.1f), \t\t\t\tnew Vector2(1f, 0.8f), \t\t\t\tnew Vector2(0f, 0.8f) \t\t\t); \t\t\testuaries.AddQuadUV2( \t\t\t\tnew Vector2(0.5f, 1.1f), new Vector2(0.3f, 1.15f), \t\t\t\tnew Vector2(0f, 0.8f), new Vector2(-0.5f, 1f) \t\t\t); \t\t} \t\telse { \t\t\testuaries.AddQuadUV2( \t\t\t\tnew Vector2(-0.5f, -0.2f), new Vector2(0.3f, -0.35f), \t\t\t\tnew Vector2(0f, 0f), new Vector2(0.5f, -0.3f) \t\t\t); \t\t\testuaries.AddTriangleUV2( \t\t\t\tnew Vector2(0.5f, -0.3f), \t\t\t\tnew Vector2(0f, 0f), \t\t\t\tnew Vector2(1f, 0f) \t\t\t); \t\t\testuaries.AddQuadUV2( \t\t\t\tnew Vector2(0.5f, -0.3f), new Vector2(0.7f, -0.35f), \t\t\t\tnew Vector2(1f, 0f), new Vector2(1.5f, -0.2f) \t\t\t); \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 59.9988%;\"><iframe src=\"https:\/\/gfycat.com\/ifr\/PotableWideeyedIrishwolfhound\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <i>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u043a.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-8\/rivers-flowing-out-of-water-bodies\/rivers-flowing-out-of-water-bodies.unitypackage\">unitypackage<\/a><\/p>\n<h1>\u0427\u0430\u0441\u0442\u044c 9: \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043b\u044c\u0435\u0444\u0430<\/h1>\n<p>  <\/p>\n<ul>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u0440\u0435\u043b\u044c\u0435\u0444 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/li>\n<li>\u0421\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0442\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/li>\n<\/ul>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u0430 \u0440\u0435\u043b\u044c\u0435\u0444 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u0430\u043a \u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b8b\/1ec\/f84\/b8b1ecf8496a03d50c881bbd47c262ad.jpg\"><\/div>\n<p>  <i>\u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u043c\u0435\u0436\u0434\u0443 \u043b\u0435\u0441\u0430\u043c\u0438, \u0441\u0435\u043b\u044c\u0441\u043a\u043e\u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0435\u043c\u043b\u044f\u043c\u0438 \u0438 \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/i><\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h2>\n<p>  \u0425\u043e\u0442\u044f \u0444\u043e\u0440\u043c\u0430 \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438, \u043f\u043e\u043a\u0430 \u043d\u0430 \u043d\u0451\u043c \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u042d\u0442\u043e \u0431\u0435\u0437\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u0430\u044f \u0437\u0435\u043c\u043b\u044f. \u0427\u0442\u043e\u0431\u044b \u0432\u0434\u043e\u0445\u043d\u0443\u0442\u044c \u0432 \u043d\u0435\u0451 \u0436\u0438\u0437\u043d\u044c, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u043a\u0430\u043a \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0438 \u0434\u043e\u043c\u0430. \u042d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u043c\u0435\u0448\u0430 \u0440\u0435\u043b\u044c\u0435\u0444\u0430, \u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u0435\u0442 \u043d\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u043f\u0440\u0438 \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u0440\u0435\u043b\u044c\u0435\u0444\u0430.<\/p>\n<p>  <code>HexGridChunk<\/code> \u043d\u0435 \u0432\u043e\u043b\u043d\u0443\u0435\u0442, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0448. \u041e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 <code>HexMesh<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0438\u043b\u0438 quad. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0443 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<h3>\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h3>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>HexFeatureManager<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0439\u043c\u0451\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u043e\u0439 \u0436\u0435 \u0441\u0445\u0435\u043c\u043e\u0439, \u0447\u0442\u043e \u0438 \u0432 <code>HexMesh<\/code> \u2014 \u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u044b <code>Clear<\/code>, <code>Apply<\/code> \u0438 <code>AddFeature<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0443\u0436\u043d\u043e \u0433\u0434\u0435-\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c, \u043c\u0435\u0442\u043e\u0434 <code>AddFeature<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<p>  \u041c\u044b \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438-\u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<pre><code class=\"cs\">using UnityEngine;  public class HexFeatureManager : MonoBehaviour {  \tpublic void Clear () {}  \tpublic void Apply () {}  \tpublic void AddFeature (Vector3 position) {} }<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432 <code>HexGridChunk<\/code>. \u0417\u0430\u0442\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b <code>HexMesh<\/code>.<\/p>\n<pre><code class=\"cs\">\tpublic HexFeatureManager features;  \tpublic void Triangulate () { \t\tterrain.Clear(); \t\trivers.Clear(); \t\troads.Clear(); \t\twater.Clear(); \t\twaterShore.Clear(); \t\testuaries.Clear(); \t\tfeatures.Clear(); \t\tfor (int i = 0; i &lt; cells.Length; i++) { \t\t\tTriangulate(cells[i]); \t\t} \t\tterrain.Apply(); \t\trivers.Apply(); \t\troads.Apply(); \t\twater.Apply(); \t\twaterShore.Apply(); \t\testuaries.Apply(); \t\tfeatures.Apply(); \t}<\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438<\/p>\n<pre><code class=\"cs\">\tvoid Triangulate (HexCell cell) { \t\tfor (HexDirection d = HexDirection.NE; d &lt;= HexDirection.NW; d++) { \t\t\tTriangulate(d, cell); \t\t} \t\tfeatures.AddFeature(cell.Position); \t}<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u0440\u0435\u0444\u0430\u0431 <em>Hex Grid Chunk<\/em> \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>HexFeatureManager<\/code>. \u0417\u0430\u0442\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441 \u043d\u0438\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/eeb\/1f4\/626\/eeb1f462652650c6dfe5e3cb34a2ec12.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/51b\/7ec\/8f2\/51b7ec8f20b4a79589fd2b464744230b.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/620\/c6f\/8cd\/620c6f8cd7c54c52597fcc289b160c57.png\"><\/div>\n<p>  <i>\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0440\u0435\u0444\u0430\u0431 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430.<\/i><\/p>\n<h3>\u041f\u0440\u0435\u0444\u0430\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h3>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c? \u0414\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043a\u0443\u0431. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0443\u0431, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0441 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u043c (3, 3, 3), \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u0435\u0433\u043e \u0432 \u043f\u0440\u0435\u0444\u0430\u0431. \u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441 \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c. \u0423\u0434\u0430\u043b\u0438\u043c \u0435\u0433\u043e \u043a\u043e\u043b\u043b\u0430\u0439\u0434\u0435\u0440, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a7a\/1b1\/315\/a7a1b1315e7f2756ac2940dac661f95a.png\"><\/div>\n<p>  <i>\u041f\u0440\u0435\u0444\u0430\u0431 \u043a\u0443\u0431\u0430.<\/i><\/p>\n<p>  \u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u0440\u0435\u0444\u0430\u0431, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0451 \u0432 <code>HexFeatureManager<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0438\u0445. \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 transform, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430 \u0441\u0441\u044b\u043b\u043a\u0438.<\/p>\n<pre><code class=\"cs\">\tpublic Transform featurePrefab;<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cfc\/34d\/e84\/cfc34de84fbc12ac5fde17d7d1d09b58.png\"><\/div>\n<p>  <i>\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u043c.<\/i><\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h3>\n<p>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0433\u043e\u0442\u043e\u0432\u0430, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430! \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0440\u0435\u0444\u0430\u0431\u0430 \u0432 <code>HexFeatureManager.AddFeature<\/code> \u0438 \u0437\u0430\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044e.<\/p>\n<pre><code class=\"cs\">\tpublic void AddFeature (Vector3 position) { \t\tTransform instance = Instantiate(featurePrefab); \t\tinstance.localPosition = position; \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/dd8\/59c\/ae5\/dd859cae56fa9439e91d0ccb5d659f62.png\"><\/div>\n<p>  <i>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430.<\/i><\/p>\n<p>  \u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0440\u0435\u043b\u044c\u0435\u0444 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u043a\u0443\u0431\u0430\u043c\u0438. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0432\u0435\u0440\u0445\u043d\u0438\u043c\u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430\u043c\u0438 \u043a\u0443\u0431\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0434\u043b\u044f \u043c\u0435\u0448\u0430 \u043a\u0443\u0431\u0430 \u0432 Unity \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u043a\u0443\u0431\u0430, \u0438 \u043d\u0438\u0436\u043d\u044f\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u043b\u044c\u0435\u0444\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u0443\u0431\u044b \u043d\u0430 \u0440\u0435\u043b\u044c\u0435\u0444, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0432\u0435\u0440\u0445 \u0438\u0445 \u043d\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438\u0445 \u0432\u044b\u0441\u043e\u0442\u044b.<\/p>\n<pre><code class=\"cs\">\tpublic void AddFeature (Vector3 position) { \t\tTransform instance = Instantiate(featurePrefab); \t\tposition.y += instance.localScale.y * 0.5f; \t\tinstance.localPosition = position; \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bb0\/6be\/89b\/bb06be89b647d5ff29f1894bfdcf199b.png\"><\/div>\n<p>  <i>\u041a\u0443\u0431\u044b \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043b\u044c\u0435\u0444\u0430.<\/i><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0427\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u0448?<\/b><\/p>\n<div class=\"spoiler_text\">\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043a\u0443\u0431\u0430. \u0415\u0441\u043b\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0448\u0438, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432\u043d\u0438\u0437\u0443. \u0422\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u044e.<\/div>\n<\/div>\n<p>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043d\u0430\u0448\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0437\u0438\u0442\u044c \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0422\u0430\u043a \u043c\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u043a\u0438.<\/p>\n<pre><code class=\"cs\">\t\tinstance.localPosition = HexMetrics.Perturb(position);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9e5\/7ec\/a43\/9e57eca43cf9127691cb5eb11bc6a11a.png\"><\/div>\n<p>  <i>\u0418\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/i><\/p>\n<h3>\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430<\/h3>\n<p>  \u041f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043b\u044c\u0435\u0444\u0430. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0445. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u0442\u0430\u0440\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>  \u0411\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0441\u043e\u0437\u0434\u0430\u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0432 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u0432 \u0435\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>Clear<\/code> \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439. \u0421\u0430\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u0432\u043e\u0435\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430.<\/p>\n<pre><code class=\"cs\">\tTransform container;  \tpublic void Clear () { \t\tif (container) { \t\t\tDestroy(container.gameObject); \t\t} \t\tcontainer = new GameObject(\"Features Container\").transform; \t\tcontainer.SetParent(transform, false); \t} \t \t\u2026 \t \tpublic void AddFeature (Vector3 position) { \t\tTransform instance = Instantiate(featurePrefab); \t\tposition.y += instance.localScale.y * 0.5f; \t\tinstance.localPosition = HexMetrics.Perturb(position); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0430\u0432\u0435\u0440\u043d\u043e, \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043b\u044c\u0435\u0444\u0430.<\/b><\/p>\n<div class=\"spoiler_text\">\u0414\u0430, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a. \u041d\u043e \u043f\u043e\u043a\u0430 \u043d\u0430\u0441 \u044d\u0442\u043e \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0420\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 \u044d\u0442\u0438\u043c, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u043e\u0431 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0439\u0442\u0438 \u0438 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>HexFeatureManager.Apply<\/code>. \u041d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0432\u0441\u0451 \u043d\u0435 \u0442\u0430\u043a \u043f\u043b\u043e\u0445\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u0438 \u0440\u0435\u043b\u044c\u0435\u0444 \u043d\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b.<\/div>\n<\/div>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-9\/adding-support-for-features\/adding-support-for-features.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430<\/h2>\n<p>  \u041f\u043e\u043a\u0430 \u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438. \u0414\u043b\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u044f\u0447\u0435\u0435\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0430\u0445, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0440\u0435\u043a\u0438 \u0438 \u0434\u043e\u0440\u043e\u0433\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043b\u0438\u0442\u044b\u0445 \u0432\u043e\u0434\u043e\u0439, \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/01d\/e88\/ab8\/01de88ab8777d38afeb4ca374571a2f1.png\"><\/div>\n<p>  <i>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043f\u043e\u0432\u0441\u044e\u0434\u0443.<\/i><\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432 <code>HexGridChunk.Triangulate<\/code>, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0439.<\/p>\n<pre><code class=\"cs\">\t\tif (!cell.IsUnderwater &amp;&amp; !cell.HasRiver &amp;&amp; !cell.HasRoads) { \t\t\tfeatures.AddFeature(cell.Position); \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5db\/b98\/75f\/5dbb9875f8510c7f9224f8ba10465ae4.png\"><\/div>\n<p>  <i>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435.<\/i><\/p>\n<h3>\u041f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043d\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0422\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0443 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0435\u0449\u0451 \u0434\u043b\u044f \u043a\u0443\u0447\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0446\u0435\u043d\u0442\u0440 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0448\u0435\u0441\u0442\u0438 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u044f\u0447\u0435\u0439\u043a\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 <code>Triangulate<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u043a\u0438 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u043d\u0435\u0442. \u041d\u0430\u043c \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043b\u0438 \u043c\u044b \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439, \u0438 \u0435\u0441\u0442\u044c \u043b\u0438 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0434\u043e\u0440\u043e\u0433\u0430. \u041d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0440\u043e\u0433\u0438, \u0438\u0434\u0443\u0449\u0438\u0435 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438.<\/p>\n<pre><code class=\"cs\">\tvoid Triangulate (HexDirection direction, HexCell cell) { \t\t\u2026  \t\tif (cell.HasRiver) { \t\t\t\u2026 \t\t} \t\telse { \t\t\tTriangulateWithoutRiver(direction, cell, center, e);  \t\t\tif (!cell.IsUnderwater &amp;&amp; !cell.HasRoadThroughEdge(direction)) { \t\t\t\tfeatures.AddFeature((center + e.v1 + e.v5) * (1f \/ 3f)); \t\t\t} \t\t}  \t\t\u2026 \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7e7\/b60\/d4b\/7e7b60d4b54d2f9a7b3119e78554507a.png\"><\/div>\n<p>  <i>\u041c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u043e \u043d\u0435\u0442 \u043f\u043e \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443 \u0441 \u0440\u0435\u043a\u0430\u043c\u0438.<\/i><\/p>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432! \u041e\u043d\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u0434\u043e\u0440\u043e\u0433\u0430\u043c\u0438, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043a\u0430 \u0438\u0437\u0431\u0435\u0433\u0430\u044e\u0442 \u0440\u0435\u043a. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432\u0434\u043e\u043b\u044c \u0440\u0435\u043a, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u044c <code>TriangulateAdjacentToRiver<\/code>. \u041d\u043e \u0441\u043d\u043e\u0432\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043d\u0435 \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439 \u0438 \u043d\u0430 \u043d\u0451\u043c \u043d\u0435\u0442 \u0434\u043e\u0440\u043e\u0433\u0438.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateAdjacentToRiver ( \t\tHexDirection direction, HexCell cell, Vector3 center, EdgeVertices e \t) { \t\t\u2026  \t\tif (!cell.IsUnderwater &amp;&amp; !cell.HasRoadThroughEdge(direction)) { \t\t\tfeatures.AddFeature((center + e.v1 + e.v5) * (1f \/ 3f)); \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/30c\/90a\/f9f\/30c90af9ffb31cec360ea027fc4f1815.png\"><\/div>\n<p>  <i>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0440\u044f\u0434\u043e\u043c \u0441 \u0440\u0435\u043a\u0430\u043c\u0438.<\/i><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432?<\/b><\/p>\n<div class=\"spoiler_text\">\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 dynamic batching \u0434\u0432\u0438\u0436\u043a\u0430 Unity. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u0430\u043b\u044b, \u0438\u0445 \u043c\u0435\u0448\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0448\u0438\u043d. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0432 \u043e\u0434\u0438\u043d batch. \u041d\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u00ab\u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c\u00bb, \u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c instancing, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043c\u0435\u043b\u043a\u0438\u0445 \u043c\u0435\u0448\u0435\u0439 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0441 dynamic batching.<\/div>\n<\/div>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-9\/feature-placement\/feature-placement.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0420\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h2>\n<p>  \u0412\u0441\u0435 \u043d\u0430\u0448\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0447\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u0434\u0430\u0434\u0438\u043c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442.<\/p>\n<pre><code class=\"cs\">\tpublic void AddFeature (Vector3 position) { \t\tTransform instance = Instantiate(featurePrefab); \t\tposition.y += instance.localScale.y * 0.5f; \t\tinstance.localPosition = HexMetrics.Perturb(position); \t\tinstance.localRotation = Quaternion.Euler(0f, 360f * Random.value, 0f); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b42\/8bd\/0bc\/b428bd0bcb9b27676853f7bb1e491165.png\"><\/div>\n<p>  <i>\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u044b.<\/i><\/p>\n<p>  \u0422\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u0435\u0439. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442. \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<p>  \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0448\u0443\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0443\u043c \u041f\u0435\u0440\u043b\u0438\u043d\u0430, \u0430 \u043e\u043d \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043d\u0430\u043c \u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445. \u041d\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438. \u0412\u0441\u0435 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0441 \u043d\u0435\u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u0431\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438. \u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0445\u0435\u0448\u0435\u0439 (hash grid), \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0430\u044f \u043e\u0441\u043d\u043e\u0432\u0443 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0445\u0435\u0448\u0435\u0439<\/h3>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0445\u0435\u0448\u0435\u0439 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 float \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0451 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043d\u0430\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0451 \u0432 <code>HexMetrics<\/code>. \u0420\u0430\u0437\u043c\u0435\u0440\u0430 256 \u043d\u0430 256 \u0445\u0432\u0430\u0442\u0438\u0442 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<pre><code class=\"cs\">\tpublic const int hashGridSize = 256;  \tstatic float[] hashGrid;  \tpublic static void InitializeHashGrid () { \t\thashGrid = new float[hashGridSize * hashGridSize]; \t\tfor (int i = 0; i &lt; hashGrid.Length; i++) { \t\t\thashGrid[i] = Random.value; \t\t} \t}<\/code><\/pre>\n<p>  \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435, \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0430\u044e\u0449\u0435\u0439 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0447\u0438\u0441\u043b\u0430 seed, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0432\u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 seed \u0432 \u043c\u0435\u0442\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cs\">\tpublic static void InitializeHashGrid (int seed) { \t\thashGrid = new float[hashGridSize * hashGridSize]; \t\tRandom.InitState(seed); \t\tfor (int i = 0; i &lt; hashGrid.Length; i++) { \t\t\thashGrid[i] = Random.value; \t\t} \t}<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0442\u043e\u043a \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0443\u0449\u0438\u0435\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0440\u0442\u044b, \u0442\u043e\u0436\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043f\u0435\u0440\u0435\u0434 \u0435\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439. \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0432 \u0440\u0430\u0431\u043e\u0442\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u0441\u0442\u0430\u0440\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cs\">\t\tRandom.State currentState = Random.state; \t\tRandom.InitState(seed); \t\tfor (int i = 0; i &lt; hashGrid.Length; i++) { \t\t\thashGrid[i] = Random.value; \t\t} \t\tRandom.state = currentState;<\/code><\/pre>\n<p>  \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0445\u0435\u0448\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <code>HexGrid<\/code> \u0432 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0448\u0443\u043c\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 <code>HexGrid.Start<\/code> \u0438 <code>HexGrid.Awake<\/code>. \u0421\u0434\u0435\u043b\u0430\u0435\u043c, \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u0447\u0430\u0449\u0435, \u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e.<\/p>\n<pre><code class=\"cs\">\tpublic int seed;  \tvoid Awake () { \t\tHexMetrics.noiseSource = noiseSource; \t\tHexMetrics.InitializeHashGrid(seed);  \t\t\u2026 \t}  \tvoid OnEnable () { \t\tif (!HexMetrics.noiseSource) { \t\t\tHexMetrics.noiseSource = noiseSource; \t\t\tHexMetrics.InitializeHashGrid(seed); \t\t} \t}<\/code><\/pre>\n<p>  \u041e\u0431\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f seed \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 seed \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u044b. \u041f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043b\u044e\u0431\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u042f \u0432\u044b\u0431\u0440\u0430\u043b 1234.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/60c\/8b3\/5a3\/60c8b35a3b6a92b61165ed3a00473076.png\"><\/div>\n<p>  <i>\u0412\u044b\u0431\u043e\u0440 seed.<\/i><\/p>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0445\u0435\u0448\u0435\u0439<\/h3>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0445\u0435\u0448\u0435\u0439, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexMetrics<\/code> \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434. \u041a\u0430\u043a \u0438 <code>SampleNoise<\/code>, \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b XZ \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0418\u043d\u0434\u0435\u043a\u0441 \u0445\u0435\u0448\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0434\u043e \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043e\u0442 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<pre><code class=\"cs\">\tpublic static float SampleHashGrid (Vector3 position) { \t\tint x = (int)position.x % hashGridSize; \t\tint z = (int)position.z % hashGridSize; \t\treturn hashGrid[x + z * hashGridSize]; \t}<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 %?<\/b><\/p>\n<div class=\"spoiler_text\">\u042d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0434\u0443\u043b\u044f, \u043e\u043d \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u044f\u0434 \u22124, \u22123, \u22122, \u22121, 0, 1, 2, 3, 4 modulo 3 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u22121, 0, \u22122, \u22121, 0, 1, 2, 0, 1.<\/div>\n<\/div>\n<p>  \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u043d\u043e \u043d\u0435 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0447\u0438\u0441\u0435\u043b \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e, \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0432 \u043a \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<pre><code class=\"cs\">\t\tint x = (int)position.x % hashGridSize; \t\tif (x &lt; 0) { \t\t\tx += hashGridSize; \t\t} \t\tint z = (int)position.z % hashGridSize; \t\tif (z &lt; 0) { \t\t\tz += hashGridSize; \t\t}<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0439 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0432\u043e\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0442\u0430\u043a\u0430\u044f \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0434\u0430\u043b\u044c\u0448\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0432 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u041d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 4 \u043d\u0430 4.<\/p>\n<pre><code class=\"cs\">\tpublic const float hashGridScale = 0.25f;  \tpublic static float SampleHashGrid (Vector3 position) { \t\tint x = (int)(position.x * hashGridScale) % hashGridSize; \t\tif (x &lt; 0) { \t\t\tx += hashGridSize; \t\t} \t\tint z = (int)(position.z * hashGridScale) % hashGridSize; \t\tif (z &lt; 0) { \t\t\tz += hashGridSize; \t\t} \t\treturn hashGrid[x + z * hashGridSize]; \t}<\/code><\/pre>\n<p>  \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a <code>HexFeatureManager.AddFeature<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430\u0448\u0443 \u043d\u043e\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0445\u0435\u0448\u0435\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0435\u0451 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0440\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u043c\u0438.<\/p>\n<pre><code class=\"cs\">\tpublic void AddFeature (Vector3 position) { \t\tfloat hash = HexMetrics.SampleHashGrid(position); \t\tTransform instance = Instantiate(featurePrefab); \t\tposition.y += instance.localScale.y * 0.5f; \t\tinstance.localPosition = HexMetrics.Perturb(position); \t\tinstance.localRotation = Quaternion.Euler(0f, 360f * hash, 0f); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u043e\u0440\u043e\u0433 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f<\/h3>\n<p>  \u0425\u043e\u0442\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u0432 \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0435\u043d \u043f\u0430\u0442\u0442\u0435\u0440\u043d. \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u0435\u0441\u0442\u044c \u043f\u043e \u0441\u0435\u043c\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u044d\u0442\u0443 \u0441\u0445\u0435\u043c\u0443 \u0445\u0430\u043e\u0441, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041a\u0430\u043a \u043d\u0430\u043c \u0440\u0435\u0448\u0430\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442, \u0438\u043b\u0438 \u043d\u0435\u0442? \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435!<\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0445\u0435\u0448\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u0432\u0430. \u0418\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0445\u0435\u0448\u0435\u0439 \u0432\u043c\u0435\u0441\u0442\u043e <code>float<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>Vector2<\/code>. \u041d\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0445\u0435\u0448\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0415\u0439 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f float. \u0418 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u044b \u0440\u0430\u043d\u0434\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<pre><code class=\"cs\">using UnityEngine;  public struct HexHash {  \tpublic float a, b;  \tpublic static HexHash Create () { \t\tHexHash hash; \t\thash.a = Random.value; \t\thash.b = Random.value; \t\treturn hash; \t} }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0437\u0432\u0435 \u0435\u0451 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c?<\/b><\/p>\n<div class=\"spoiler_text\">\u041c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u044d\u0442\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0445\u0435\u0448\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0432\u0438\u0436\u043a\u043e\u043c Unity. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u043d\u0430 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u043e\u0439.<\/div>\n<\/div>\n<p>  \u0418\u0437\u043c\u0435\u043d\u0438\u043c <code>HexMetrics<\/code> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<\/p>\n<pre><code class=\"cs\">\tstatic HexHash[] hashGrid;  \tpublic static void InitializeHashGrid (int seed) { \t\thashGrid = new HexHash[hashGridSize * hashGridSize]; \t\tRandom.State currentState = Random.state; \t\tRandom.InitState(seed); \t\tfor (int i = 0; i &lt; hashGrid.Length; i++) { \t\t\thashGrid[i] = HexHash.Create(); \t\t} \t\tRandom.state = currentState; \t}  \tpublic static HexHash SampleHashGrid (Vector3 position) { \t\t\u2026 \t}<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c <code>HexFeatureManager.AddFeature<\/code> \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0432\u0443\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c \u0445\u0435\u0448\u0435\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0430\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442, \u0438\u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 0.5, \u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0412\u0442\u043e\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430.<\/p>\n<pre><code class=\"cs\">\tpublic void AddFeature (Vector3 position) { \t\tHexHash hash = HexMetrics.SampleHashGrid(position); \t\tif (hash.a &gt;= 0.5f) { \t\t\treturn; \t\t} \t\tTransform instance = Instantiate(featurePrefab); \t\tposition.y += instance.localScale.y * 0.5f; \t\tinstance.localPosition = HexMetrics.Perturb(position); \t\tinstance.localRotation = Quaternion.Euler(0f, 360f * hash.b, 0f); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e89\/e69\/761\/e89e697613f8eef3d149b07720e8a26a.png\"><\/div>\n<p>  <i>\u041f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043d\u0438\u0436\u0435\u043d\u0430 \u043d\u0430 50%.<\/i><\/p>\n<p>  <a href=\"http:\/\/feature-variety\/feature-variety.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0420\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h2>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0432\u0441\u044e\u0434\u0443, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438. \u041d\u043e \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u042d\u0442\u043e\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u043b\u044e, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u043a\u0443\u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043b\u044c\u0435\u0444\u0435 \u043d\u0435 \u043a\u0430\u043a \u043f\u0440\u0438\u0440\u043e\u0434\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0438\u0445 \u0437\u0434\u0430\u043d\u0438\u044f\u043c\u0438. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexCell<\/code> \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cs\">\tpublic int UrbanLevel { \t\tget { \t\t\treturn urbanLevel; \t\t} \t\tset { \t\t\tif (urbanLevel != value) { \t\t\t\turbanLevel = value; \t\t\t\tRefreshSelfOnly(); \t\t\t} \t\t} \t}  \tint urbanLevel;<\/code><\/pre>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0431\u044b\u043b \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e, \u043d\u043e \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u044b \u0438 \u0442\u0430\u043a \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0418 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0434\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0434\u043e\u043a\u0438 \u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<h3>\u041f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>  \u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexMapEditor<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u0430.<\/p>\n<pre><code class=\"cs\">\tint activeUrbanLevel; \t \t\u2026 \t \tbool applyUrbanLevel; \t \t\u2026 \t \tpublic void SetApplyUrbanLevel (bool toggle) { \t\tapplyUrbanLevel = toggle; \t} \t \tpublic void SetUrbanLevel (float level) { \t\tactiveUrbanLevel = (int)level; \t}  \tvoid EditCell (HexCell cell) { \t\tif (cell) { \t\t\t\u2026 \t\t\tif (applyWaterLevel) { \t\t\t\tcell.WaterLevel = activeWaterLevel; \t\t\t} \t\t\tif (applyUrbanLevel) { \t\t\t\tcell.UrbanLevel = activeUrbanLevel; \t\t\t} \t\t\tif (riverMode == OptionalToggle.No) { \t\t\t\tcell.RemoveRiver(); \t\t\t} \t\t\t\u2026 \t\t} \t}<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a UI \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0435\u0433\u043e \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438. \u042f \u0440\u0430\u0437\u043c\u0435\u0449\u0443 \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c \u0432 \u043f\u0440\u0430\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044d\u043a\u0440\u0430\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043b\u0435\u0432\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.<\/p>\n<p>  \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0451\u0445, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0445 \u043d\u0443\u043b\u0435\u0432\u043e\u0439, \u043d\u0438\u0437\u043a\u0438\u0439, \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/02f\/e64\/996\/02fe649968954603df834d2a3b5f633b.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/95e\/9e4\/6f5\/95e9e46f5ff83a9b7d713e85db86d67a.png\"><\/div>\n<p>  <i>\u041f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/i><\/p>\n<h3>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u043e\u0433\u0430<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 <code>HexFeatureManager.AddFeature<\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u0443 \u044f\u0447\u0435\u0439\u043a\u0443. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043d\u0430\u043c \u0442\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>  \u0411\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e, \u0443\u043c\u043d\u043e\u0436\u0438\u0432 \u0435\u0433\u043e \u043d\u0430 0.25 \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0433\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043d\u0430 25%.<\/p>\n<pre><code class=\"cs\">\tpublic void AddFeature (HexCell cell, Vector3 position) { \t\tHexHash hash = HexMetrics.SampleHashGrid(position); \t\tif (hash.a &gt;= cell.UrbanLevel * 0.25f) { \t\t\treturn; \t\t} \t\t\u2026 \t}<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 <code>HexGridChunk<\/code>.<\/p>\n<pre><code class=\"cs\">\tvoid Triangulate (HexCell cell) { \t\t\u2026 \t\tif (!cell.IsUnderwater &amp;&amp; !cell.HasRiver &amp;&amp; !cell.HasRoads) { \t\t\tfeatures.AddFeature(cell,  cell.Position); \t\t} \t}  \tvoid Triangulate (HexDirection direction, HexCell cell) { \t\t\u2026 \t\t\tif (!cell.IsUnderwater &amp;&amp; !cell.HasRoadThroughEdge(direction)) { \t\t\t\tfeatures.AddFeature(cell, (center + e.v1 + e.v5) * (1f \/ 3f)); \t\t\t} \t\t\u2026 \t} \t \t\u2026 \t \tvoid TriangulateAdjacentToRiver ( \t\tHexDirection direction, HexCell cell, Vector3 center, EdgeVertices e \t) { \t\t\u2026  \t\tif (!cell.IsUnderwater &amp;&amp; !cell.HasRoadThroughEdge(direction)) { \t\t\tfeatures.AddFeature(cell, (center + e.v1 + e.v5) * (1f \/ 3f)); \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fd8\/7e9\/de5\/fd87e9de5b6b6ea4b4b490549ae5cbf5.png\"><\/div>\n<p>  <i>\u0420\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-9\/painting-features\/painting-features.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430<\/h2>\n<p>  \u0420\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u0432 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0447\u0451\u0442\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u0437\u043a\u0438\u043c \u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0447\u0435\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u0434\u0430\u043d\u0438\u0439. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u0447\u0451\u0442\u0447\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0430\u0431.<\/p>\n<p>  \u0418\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u043f\u043e\u043b\u044f <code>featurePrefab<\/code> \u0432 <code>HexFeatureManager<\/code> \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0435\u0433\u043e \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u0432 \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0444\u0430\u0431\u0430 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u0443\u0440\u043e\u0432\u043d\u044f \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0438\u043d\u0434\u0435\u043a\u0441.<\/p>\n<pre><code class=\"cs\">&lt;del&gt;\/\/\tpublic Transform featurePrefab;&lt;\/del&gt; \tpublic Transform[] urbanPrefabs; \t \tpublic void AddFeature (HexCell cell, Vector3 position) { \t\t\u2026 \t\tTransform instance = Instantiate(urbanPrefabs[cell.UrbanLevel - 1]); \t\t\u2026 \t}<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0430 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0430 \u043f\u0440\u0435\u0444\u0430\u0431\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0438\u0445 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u043b\u0438 \u0442\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u044f \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0423\u0440\u043e\u0432\u0435\u043d\u044c 1 \u2014 \u044d\u0442\u043e \u043d\u0438\u0437\u043a\u0430\u044f \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u0443\u0431 \u0441 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043e\u0439 \u0440\u0435\u0431\u0440\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043b\u0430\u0447\u0443\u0433\u0443. \u042f \u0438\u0437\u043c\u0435\u043d\u044e \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043f\u0440\u0435\u0444\u0430\u0431\u0430 \u0443\u0440\u043e\u0432\u043d\u044f 2 \u043d\u0430 (1.5, 2, 1.5), \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u043e\u0445\u043e\u0434\u0438\u043b\u043e \u043d\u0430 \u0434\u0432\u0443\u0445\u044d\u0442\u0430\u0436\u043d\u043e\u0435 \u0437\u0434\u0430\u043d\u0438\u0435. \u0414\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0437\u0434\u0430\u043d\u0438\u0439 \u0443\u0440\u043e\u0432\u043d\u044f 3 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043c\u0430\u0441\u0448\u0442\u0430\u0431 (2, 5, 2).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b83\/4ad\/cb6\/b834adcb61a34d1e30cdec28925f066f.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d4f\/41d\/552\/d4f41d5529d4716924345520ffc36280.png\"><\/div>\n<p>  <i>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/i><\/p>\n<h3>\u0421\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u0432<\/h3>\n<p>  \u041c\u044b \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u0438\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432 \u0437\u0434\u0430\u043d\u0438\u0439. \u041c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0445 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435. \u0412\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0433\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0440\u0438, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0437\u0434\u0430\u043d\u0438\u0439.<\/p>\n<p>  \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 1 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043b\u0430\u0447\u0443\u0433 \u0432 40% \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u0414\u0440\u0443\u0433\u0438\u0445 \u0437\u0434\u0430\u043d\u0438\u0439 \u0442\u0443\u0442 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435. \u0414\u043b\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0440\u043e\u0439\u043a\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (0.4, 0, 0).<\/p>\n<p>  \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 2 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u043b\u0430\u0447\u0443\u0433\u0438 \u0437\u0434\u0430\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c 20% \u0434\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043b\u0430\u0447\u0443\u0433. \u0412\u044b\u0441\u043e\u043a\u0438\u0445 \u0437\u0434\u0430\u043d\u0438\u0439 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u0443\u044e \u0442\u0440\u043e\u0439\u043a\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (0.2, 0.4, 0).<\/p>\n<p>  \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 3 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0441\u0440\u0435\u0434\u043d\u0438\u0435 \u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u0438\u0435, \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u043b\u0430\u0447\u0443\u0433\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c 20% \u043b\u0430\u0447\u0443\u0433. \u041f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0432\u043d\u044b (0.2, 0.2, 0.4).<\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432 \u043f\u0443\u0441\u0442\u044b\u0435 \u043c\u0435\u0441\u0442\u0430. \u0414\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0445\u0435\u0448\u0435\u0439. \u0415\u0441\u043b\u0438 \u0445\u0435\u0448\u0438 \u043c\u0435\u0436\u0434\u0443 0 \u0438 0.4 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 1 \u0431\u044b\u043b\u0438 \u043b\u0430\u0447\u0443\u0433\u0430\u043c\u0438, \u0442\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 3 \u0442\u043e\u0442 \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u0438\u0435 \u0437\u0434\u0430\u043d\u0438\u044f. \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 3 \u0432\u044b\u0441\u043e\u043a\u0438\u0435 \u0437\u0434\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0445\u0435\u0448\u0435\u0439 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 0\u20130.4, \u0434\u0432\u0443\u0445\u044d\u0442\u0430\u0436\u043d\u044b\u0435 \u0437\u0434\u0430\u043d\u0438\u044f \u2014 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 0.4\u20130.6, \u0430 \u043b\u0430\u0447\u0443\u0433\u0438 \u2014 \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 0.6\u20130.8. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u0445 \u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445, \u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432 (0.4, 0.6, 0.8). \u041f\u043e\u0440\u043e\u0433\u0438 \u0443\u0440\u043e\u0432\u043d\u044f 2 \u0442\u043e\u0433\u0434\u0430 \u0441\u0442\u0430\u043d\u0443\u0442 (0, 0.4, 0.6), \u0430 \u043f\u043e\u0440\u043e\u0433\u0438 \u0443\u0440\u043e\u0432\u043d\u044f 1 \u0441\u0442\u0430\u043d\u0443\u0442 (0, 0, 0.4).<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u044d\u0442\u0438 \u043f\u043e\u0440\u043e\u0433\u0438 \u0432 <code>HexMetrics<\/code> \u043a\u0430\u043a \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u043e\u0440\u043e\u0433\u0438 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0443\u0440\u043e\u0432\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u043c\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c 0.<\/p>\n<pre><code class=\"cs\">\tstatic float[][] featureThresholds = { \t\tnew float[] {0.0f, 0.0f, 0.4f}, \t\tnew float[] {0.0f, 0.4f, 0.6f}, \t\tnew float[] {0.4f, 0.6f, 0.8f} \t}; \t\t\t\t\t\t \tpublic static float[] GetFeatureThresholds (int level) { \t\treturn featureThresholds[level]; \t}<\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexFeatureManager<\/code> \u043c\u0435\u0442\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0435\u0448\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0440\u0435\u0444\u0430\u0431\u0430. \u0415\u0441\u043b\u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0443\u043b\u044f, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0440\u043e\u0433\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u043e \u043f\u043e\u0440\u043e\u0433\u0430\u043c, \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u043f\u0440\u0435\u0432\u0437\u043e\u0439\u0434\u0451\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0435\u0448\u0430. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043f\u0440\u0435\u0444\u0430\u0431. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u043c, \u0442\u043e \u0432\u0435\u0440\u043d\u0451\u043c null.<\/p>\n<pre><code class=\"cs\">\tTransform PickPrefab (int level, float hash) { \t\tif (level &gt; 0) { \t\t\tfloat[] thresholds = HexMetrics.GetFeatureThresholds(level - 1); \t\t\tfor (int i = 0; i &lt; thresholds.Length; i++) { \t\t\t\tif (hash &lt; thresholds[i]) { \t\t\t\t\treturn urbanPrefabs[i]; \t\t\t\t} \t\t\t} \t\t} \t\treturn null; \t}<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043f\u0440\u0435\u0444\u0430\u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0448\u043b\u0438 \u043e\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043a \u043d\u0438\u0437\u043a\u043e\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4dc\/eb5\/80e\/4dceb580e2410400a003b2ecad72d5c5.png\"><\/div>\n<p>  <i>\u041f\u0435\u0440\u0435\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u0432.<\/i><\/p>\n<p>  \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u0430\u0448\u0438\u043c \u043d\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0432 <code>AddFeature<\/code> \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0440\u0435\u0444\u0430\u0431\u0430. \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0435\u0433\u043e, \u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0435\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435.<\/p>\n<pre><code class=\"cs\">\tpublic void AddFeature (HexCell cell, Vector3 position) { \t\tHexHash hash = HexMetrics.SampleHashGrid(position); \/\/\t\tif (hash.a &gt;= cell.UrbanLevel * 0.25f) { \/\/\t\t\treturn; \/\/\t\t} \/\/\t\tTransform instance = Instantiate(urbanPrefabs[cell.UrbanLevel - 1]); \t\tTransform prefab = PickPrefab(cell.UrbanLevel, hash.a); \t\tif (!prefab) { \t\t\treturn; \t\t} \t\tTransform instance = Instantiate(prefab); \t\tposition.y += instance.localScale.y * 0.5f; \t\tinstance.localPosition = HexMetrics.Perturb(position); \t\tinstance.localRotation = Quaternion.Euler(0f, 360f * hash.b, 0f); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d33\/6f0\/fcb\/d336f0fcbf85285b38bb9c3de27ad77f.png\"><\/div>\n<p>  <i>\u0421\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u0435\u0444\u0430\u0431\u044b.<\/i><\/p>\n<h3>\u0412\u0430\u0440\u0438\u0430\u0446\u0438\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0435 \u0437\u0434\u0430\u043d\u0438\u044f, \u043d\u043e \u043f\u043e\u043a\u0430 \u0438\u0445 \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0438. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u0432 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0443\u0440\u043e\u0432\u043d\u044e \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0440\u0435\u0442\u044c\u0435 \u0432 <code>HexHash<\/code>.<\/p>\n<pre><code class=\"cs\">\tpublic float a, b, c;  \tpublic static HexHash Create () { \t\tHexHash hash; \t\thash.a = Random.value; \t\thash.b = Random.value; \t\thash.c = Random.value; \t\treturn hash; \t}<\/code><\/pre>\n<p>  \u041f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c <code>HexFeatureManager.urbanPrefabs<\/code> \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043c\u0435\u0442\u043e\u0434\u0443 <code>PickPrefab<\/code> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>choice<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0443\u043c\u043d\u043e\u0436\u0438\u0432 \u0435\u0433\u043e \u043d\u0430 \u0434\u043b\u0438\u043d\u0443 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0432 \u0432 integer.<\/p>\n<pre><code class=\"cs\">\tpublic Transform[][] urbanPrefabs; \t \t\u2026  \tTransform PickPrefab (int level, float hash, float choice) { \t\tif (level &gt; 0) { \t\t\tfloat[] thresholds = HexMetrics.GetFeatureThresholds(level - 1); \t\t\tfor (int i = 0; i &lt; thresholds.Length; i++) { \t\t\t\tif (hash &lt; thresholds[i]) { \t\t\t\t\treturn urbanPrefabs[i][(int)(choice * urbanPrefabs[i].Length)]; \t\t\t\t} \t\t\t} \t\t} \t\treturn null; \t}<\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u043e\u0441\u043d\u0443\u0435\u043c \u043d\u0430\u0448 \u0432\u044b\u0431\u043e\u0440 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0445\u0435\u0448\u0430 (B). \u0422\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0441\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u0441 B \u043d\u0430 C.<\/p>\n<pre><code class=\"cs\">\tpublic void AddFeature (HexCell cell, Vector3 position) { \t\tHexHash hash = HexMetrics.SampleHashGrid(position); \t\tTransform prefab = PickPrefab(cell.UrbanLevel, hash.a, hash.b); \t\tif (!prefab) { \t\t\treturn; \t\t} \t\tTransform instance = Instantiate(prefab); \t\tposition.y += instance.localScale.y * 0.5f; \t\tinstance.localPosition = HexMetrics.Perturb(position); \t\tinstance.localRotation = Quaternion.Euler(0f, 360f * hash.c, 0f); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e <code>Random.value<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0439\u0442\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0445\u0435\u0448\u0435\u0439. \u041f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u0432\u0441\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u043d\u0430\u043c\u0438.<\/p>\n<pre><code class=\"cs\">\tpublic static HexHash Create () { \t\tHexHash hash; \t\thash.a = Random.value * 0.999f; \t\thash.b = Random.value * 0.999f; \t\thash.c = Random.value * 0.999f; \t\treturn hash; \t}<\/code><\/pre>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0414\u0430\u0434\u0438\u043c \u0435\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 choice \u0432 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0444\u0430\u0431.<\/p>\n<pre><code class=\"cs\">using UnityEngine;  [System.Serializable] public struct HexFeatureCollection {  \tpublic Transform[] prefabs;  \tpublic Transform Pick (float choice) { \t\treturn prefabs[(int)(choice * prefabs.Length)]; \t} }<\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 <code>HexFeatureManager<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"cs\">\/\/\tpublic Transform[][] urbanPrefabs; \tpublic HexFeatureCollection[] urbanCollections;  \t\u2026  \tTransform PickPrefab (int level, float hash, float choice) { \t\tif (level &gt; 0) { \t\t\tfloat[] thresholds = HexMetrics.GetFeatureThresholds(level - 1); \t\t\tfor (int i = 0; i &lt; thresholds.Length; i++) { \t\t\t\tif (hash &lt; thresholds[i]) { \t\t\t\t\treturn urbanCollections[i].Pick(choice); \t\t\t\t} \t\t\t} \t\t} \t\treturn null; \t}<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0443\u0440\u043e\u0432\u043d\u044e \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0430\u043d\u0438\u0439. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b, \u043d\u0430\u043c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043e \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u043d\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0434\u043b\u044f \u043d\u0438\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u044b (3.5, 3, 2), (2.75, 1.5, 1.5) \u0438 (1.75, 1, 1).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b71\/a6e\/c9f\/b71a6ec9f2c379c223e007dda071c94b.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a72\/618\/81d\/a7261881d23703b54aaf22ba59942d2a.png\"><\/div>\n<p>  <i>\u041f\u043e \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0437\u0434\u0430\u043d\u0438\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-9\/multiple-feature-prefabs\/multiple-feature-prefabs.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h2>\n<p>  \u0412 \u0438\u043c\u0435\u044e\u0449\u0435\u0439\u0441\u044f \u0441\u0445\u0435\u043c\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b\u0435 \u0443\u0440\u0431\u0430\u043d\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041d\u043e \u0440\u0435\u043b\u044c\u0435\u0444 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0430\u043d\u0438\u044f. \u041a\u0430\u043a \u043d\u0430\u0441\u0447\u0451\u0442 \u0444\u0435\u0440\u043c \u0438\u043b\u0438 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexCell<\/code> \u0443\u0440\u043e\u0432\u043d\u0438 \u0438 \u0434\u043b\u044f \u043d\u0438\u0445. \u041e\u043d\u0438 \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"cs\">\tpublic int FarmLevel { \t\tget { \t\t\treturn farmLevel; \t\t} \t\tset { \t\t\tif (farmLevel != value) { \t\t\t\tfarmLevel = value; \t\t\t\tRefreshSelfOnly(); \t\t\t} \t\t} \t}  \tpublic int PlantLevel { \t\tget { \t\t\treturn plantLevel; \t\t} \t\tset { \t\t\tif (plantLevel != value) { \t\t\t\tplantLevel = value; \t\t\t\tRefreshSelfOnly(); \t\t\t} \t\t} \t}  \tint urbanLevel, farmLevel, plantLevel;<\/code><\/pre>\n<p>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432 <code>HexMapEditor<\/code> \u0434\u0432\u0443\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u043e\u0432.<\/p>\n<pre><code class=\"cs\">\tint activeUrbanLevel, activeFarmLevel, activePlantLevel;  \tbool applyUrbanLevel, applyFarmLevel, applyPlantLevel;  \t\u2026  \tpublic void SetApplyFarmLevel (bool toggle) { \t\tapplyFarmLevel = toggle; \t}  \tpublic void SetFarmLevel (float level) { \t\tactiveFarmLevel = (int)level; \t}  \tpublic void SetApplyPlantLevel (bool toggle) { \t\tapplyPlantLevel = toggle; \t}  \tpublic void SetPlantLevel (float level) { \t\tactivePlantLevel = (int)level; \t}  \t\u2026  \tvoid EditCell (HexCell cell) { \t\tif (cell) { \t\t\t\u2026 \t\t\tif (applyUrbanLevel) { \t\t\t\tcell.UrbanLevel = activeUrbanLevel; \t\t\t} \t\t\tif (applyFarmLevel) { \t\t\t\tcell.FarmLevel = activeFarmLevel; \t\t\t} \t\t\tif (applyPlantLevel) { \t\t\t\tcell.PlantLevel = activePlantLevel; \t\t\t} \t\t\t\u2026 \t\t} \t}<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u0445 \u0432 UI.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/956\/70b\/f35\/95670bf35594faa69fe46201b78080f7.png\"><\/div>\n<p>  <i>\u0422\u0440\u0438 \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u0430.<\/i><\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f <code>HexFeatureManager<\/code>.<\/p>\n<pre><code class=\"cs\">\tpublic HexFeatureCollection[] \t\turbanCollections, farmCollections, plantCollections;<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f5d\/001\/cec\/f5d001cecb2bee3c60a0dad637de7dc9.png\"><\/div>\n<p>  <i>\u0422\u0440\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430.<\/i><\/p>\n<p>  \u042f \u0441\u043e\u0437\u0434\u0430\u043b \u0438 \u0434\u043b\u044f \u0444\u0435\u0440\u043c, \u0438 \u0434\u043b\u044f \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439 \u043f\u043e \u0434\u0432\u0430 \u043f\u0440\u0435\u0444\u0430\u0431\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0437\u0434\u0430\u043d\u0438\u0439. \u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0438\u0445 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043a\u0443\u0431\u044b. \u0424\u0435\u0440\u043c\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u0435\u0442\u043b\u043e-\u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f \u2014 \u0442\u0451\u043c\u043d\u043e-\u0437\u0435\u043b\u0451\u043d\u044b\u0439.<\/p>\n<p>  \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u043a\u0443\u0431\u044b \u0444\u0435\u0440\u043c \u0432\u044b\u0441\u043e\u0442\u043e\u0439 \u0432 0.1 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0435 \u043d\u0430\u0434\u0435\u043b\u044b \u0441\u0435\u043b\u044c\u0441\u043a\u043e\u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0437\u0435\u043c\u0435\u043b\u044c. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u044f \u0432\u044b\u0431\u0440\u0430\u043b (2.5, 0.1, 2.5) \u0438 (3.5, 0.1, 2). \u0412 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 \u043f\u043b\u043e\u0449\u0430\u0434\u044c 1.75 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 2.5 \u043d\u0430 1.25. \u041d\u0438\u0437\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043f\u043b\u043e\u0449\u0430\u0434\u044c 1 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 1.5 \u043d\u0430 0.75.<\/p>\n<p>  \u041f\u0440\u0435\u0444\u0430\u0431\u044b \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u0432\u044b\u0441\u043e\u043a\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043a\u0443\u0441\u0442\u0430\u0440\u043d\u0438\u043a\u0438. \u041f\u0440\u0435\u0444\u0430\u0431\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435, (1.25, 4.5, 1.25) \u0438 (1.5, 3, 1.5). \u0421\u0440\u0435\u0434\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u044b \u2014 (0.75, 3, 0.75) \u0438 (1, 1.5, 1). \u0421\u0430\u043c\u044b\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b (0.5, 1.5, 0.5) \u0438 (0.75, 1, 0.75).<\/p>\n<h3>\u0412\u044b\u0431\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430<\/h3>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0435\u0448\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0438\u043c\u0435\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0445 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexHash<\/code> \u0434\u0432\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cs\">\tpublic float a, b, c, d, e;  \tpublic static HexHash Create () { \t\tHexHash hash; \t\thash.a = Random.value * 0.999f; \t\thash.b = Random.value * 0.999f; \t\thash.c = Random.value * 0.999f; \t\thash.d = Random.value * 0.999f; \t\thash.e = Random.value * 0.999f; \t\treturn hash; \t}<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c <code>HexFeatureManager.PickPrefab<\/code> \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0422\u0430\u043a\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0445\u0435\u0448, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0444\u0430\u0431\u0430 \u043d\u0430 D, \u0430 \u0445\u0435\u0448 \u0434\u043b\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u2014 \u043d\u0430 E.<\/p>\n<pre><code class=\"cs\">\tTransform PickPrefab ( \t\tHexFeatureCollection[] collection, \t\tint level, float hash, float choice \t) { \t\tif (level &gt; 0) { \t\t\tfloat[] thresholds = HexMetrics.GetFeatureThresholds(level - 1); \t\t\tfor (int i = 0; i &lt; thresholds.Length; i++) { \t\t\t\tif (hash &lt; thresholds[i]) { \t\t\t\t\treturn collection[i].Pick(choice); \t\t\t\t} \t\t\t} \t\t} \t\treturn null; \t}  \tpublic void AddFeature (HexCell cell, Vector3 position) { \t\tHexHash hash = HexMetrics.SampleHashGrid(position); \t\tTransform prefab = PickPrefab( \t\t\turbanCollections, cell.UrbanLevel, hash.a, hash.d \t\t); \t\t\u2026 \t\tinstance.localRotation = Quaternion.Euler(0f, 360f * hash.e, 0f); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  \u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 <code>AddFeature<\/code> \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u0435\u0444\u0430\u0431 \u0443\u0440\u0431\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0440\u0435\u0444\u0430\u0431 \u0438\u0437 \u0444\u0435\u0440\u043c. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0445\u0435\u0448\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c B. \u0412\u044b\u0431\u043e\u0440 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0441\u043d\u043e\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 D.<\/p>\n<pre><code class=\"cs\">\t\tTransform prefab = PickPrefab( \t\t\turbanCollections, cell.UrbanLevel, hash.a, hash.d \t\t); \t\tTransform otherPrefab = PickPrefab( \t\t\tfarmCollections, cell.FarmLevel, hash.b, hash.d \t\t); \t\tif (!prefab) { \t\t\treturn; \t\t}<\/code><\/pre>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u0436\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0440\u0435\u0444\u0430\u0431 \u043c\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c? \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f null, \u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0431\u0430, \u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0435\u0444\u0430\u0431 \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0445\u0435\u0448\u0430.<\/p>\n<pre><code class=\"cs\">\t\tTransform otherPrefab = PickPrefab( \t\t\tfarmCollections, cell.FarmLevel, hash.b, hash.d \t\t); \t\tif (prefab) { \t\t\tif (otherPrefab &amp;&amp; hash.b &lt; hash.a) { \t\t\t\tprefab = otherPrefab; \t\t\t} \t\t} \t\telse if (otherPrefab) { \t\t\tprefab = otherPrefab; \t\t} \t\telse { \t\t\treturn; \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/baf\/369\/d71\/baf369d71420a1ded309880b38d94c53.png\"><\/div>\n<p>  <i>\u0421\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0438\u0445 \u0438 \u0441\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/i><br \/>  \u0414\u0430\u043b\u0435\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0445\u0435\u0448\u0430 C.<\/p>\n<pre><code class=\"cs\">\t\tif (prefab) { \t\t\tif (otherPrefab &amp;&amp; hash.b &lt; hash.a) { \t\t\t\tprefab = otherPrefab; \t\t\t} \t\t} \t\telse if (otherPrefab) { \t\t\tprefab = otherPrefab; \t\t} \t\totherPrefab = PickPrefab( \t\t\tplantCollections, cell.PlantLevel, hash.c, hash.d \t\t); \t\tif (prefab) { \t\t\tif (otherPrefab &amp;&amp; hash.c &lt; hash.a) { \t\t\t\tprefab = otherPrefab; \t\t\t} \t\t} \t\telse if (otherPrefab) { \t\t\tprefab = otherPrefab; \t\t} \t\telse { \t\t\treturn; \t\t}<\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u0433\u043e\u0440\u043e\u0434\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0435\u043b\u044c\u0441\u043a\u0438\u0439, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0445\u0435\u0448 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439 \u0441 \u0445\u0435\u0448\u0435\u043c \u0444\u0435\u0440\u043c, \u0430 \u043d\u0435 \u0441 \u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0438\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0445\u0435\u0448, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c, \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 \u043d\u0438\u043c.<\/p>\n<pre><code class=\"cs\">\t\tfloat usedHash = hash.a; \t\tif (prefab) { \t\t\tif (otherPrefab &amp;&amp; hash.b &lt; hash.a) { \t\t\t\tprefab = otherPrefab; \t\t\t\tusedHash = hash.b; \t\t\t} \t\t} \t\telse if (otherPrefab) { \t\t\tprefab = otherPrefab; \t\t\tusedHash = hash.b; \t\t} \t\totherPrefab = PickPrefab( \t\t\tplantCollections, cell.PlantLevel, hash.c, hash.d \t\t); \t\tif (prefab) { \t\t\tif (otherPrefab &amp;&amp; hash.c &lt; usedHash) { \t\t\t\tprefab = otherPrefab; \t\t\t} \t\t} \t\telse if (otherPrefab) { \t\t\tprefab = otherPrefab; \t\t} \t\telse { \t\t\treturn; \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8eb\/2e2\/215\/8eb2e2215e6219b08e8bc42612b31493.png\"><\/div>\n<p>  <i>\u0421\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0438\u0445, \u0441\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438 \u0440\u0430\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-9\/multiple-feature-types\/multiple-feature-types.unitypackage\">unitypackage<\/a><\/p>\n<h1>\u0427\u0430\u0441\u0442\u044c 10: \u0441\u0442\u0435\u043d\u044b<\/h1>\n<p>  <\/p>\n<ul>\n<li>\u041e\u0433\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0438.<\/li>\n<li>\u0421\u0442\u0440\u043e\u0438\u043c \u0441\u0442\u0435\u043d\u044b \u0432\u0434\u043e\u043b\u044c \u0440\u0451\u0431\u0435\u0440 \u044f\u0447\u0435\u0435\u043a.<\/li>\n<li>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u0441\u043a\u0432\u043e\u0437\u044c \u0440\u0435\u043a\u0430\u043c \u0438 \u0434\u043e\u0440\u043e\u0433\u0430\u043c.<\/li>\n<li>\u0418\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u0432\u043e\u0434\u0443 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0441 \u043e\u0431\u0440\u044b\u0432\u0430\u043c\u0438.<\/li>\n<\/ul>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438 \u0441\u0442\u0435\u043d\u044b.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/924\/d07\/0cd\/924d070cd67c3baccf02a0284ef9cdc4.jpg\"><\/div>\n<p>  <i>\u041d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0433\u043e\u0441\u0442\u0435\u043f\u0440\u0438\u0438\u043c\u043d\u043e\u0433\u043e, \u0447\u0435\u043c \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u0442\u0435\u043d\u0430.<\/i><\/p>\n<h2>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0435\u043d<\/h2>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u0442\u0435\u043d \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c. \u041c\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438, \u0432\u0434\u043e\u043b\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0445 \u0438\u0445 \u0440\u0451\u0431\u0435\u0440. \u0422\u0430\u043a \u043a\u0430\u043a \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f\u0447\u0435\u0435\u043a, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0442\u0435\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043a\u0432\u043e\u0437\u044c \u043d\u0438\u0445.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7a1\/bbb\/c11\/7a1bbbc1158301bb0091638858fa79fd.png\"><\/div>\n<p>  <i>\u0421\u0442\u0435\u043d\u044b, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u0434\u043e\u043b\u044c \u0440\u0451\u0431\u0435\u0440.<\/i><\/p>\n<p>  \u0421\u0442\u0435\u043d\u044b \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043b\u044c\u0435\u0444\u0430, \u0445\u043e\u0442\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0435. \u041a\u0430\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0435\u043d, \u0430 \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u043e\u0433\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u044f\u0447\u0435\u0435\u043a \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<h3>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e Walled<\/h3>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0433\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u044f\u0447\u0435\u0435\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexCell<\/code> \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>Walled<\/code>. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0435\u043d\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438, \u0438 \u0438\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439.<\/p>\n<pre><code class=\"cs\">\tpublic bool Walled { \t\tget { \t\t\treturn walled; \t\t} \t\tset { \t\t\tif (walled != value) { \t\t\t\twalled = value; \t\t\t\tRefresh(); \t\t\t} \t\t} \t} \t \tbool walled;<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430<\/h3>\n<p>  \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u00ab\u043e\u0433\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00bb \u044f\u0447\u0435\u0435\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 <code>HexMapEditor<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 <code>OptionalToggle<\/code> \u0438 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cs\">\tOptionalToggle riverMode, roadMode, walledMode; \t \t\u2026 \t \tpublic void SetWalledMode (int mode) { \t\twalledMode = (OptionalToggle)mode; \t}<\/code><\/pre>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0440\u0435\u043a \u0438 \u0434\u043e\u0440\u043e\u0433, \u0441\u0442\u0435\u043d\u044b \u043d\u0435 \u0438\u0434\u0443\u0442 \u043e\u0442 \u044f\u0447\u0435\u0439\u043a\u0438 \u043a \u044f\u0447\u0435\u0439\u043a\u0435, \u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0438. \u041a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043d\u044b \u0430\u043a\u0442\u0438\u0432\u0435\u043d, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0451\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u00ab\u043e\u0433\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00bb \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"cs\">\tvoid EditCell (HexCell cell) { \t\tif (cell) { \t\t\t\u2026 \t\t\tif (roadMode == OptionalToggle.No) { \t\t\t\tcell.RemoveRoads(); \t\t\t} \t\t\tif (walledMode != OptionalToggle.Ignore) { \t\t\t\tcell.Walled = walledMode == OptionalToggle.Yes; \t\t\t} \t\t\tif (isDrag) { \t\t\t\t\u2026 \t\t\t} \t\t} \t}<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 UI \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0438\u0445 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u00ab\u043e\u0433\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00bb. \u042f \u043f\u043e\u043c\u0435\u0449\u0443 \u0438\u0445 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c UI \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0ac\/f7f\/0ca\/0acf7f0caaaae171e31d42141fa75947.png\"><\/div>\n<p>  <i>\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u00ab\u043e\u0433\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00bb.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-10\/editing-walls\/editing-walls.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0435\u043d<\/h2>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0435\u043d\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442 \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u044f\u0447\u0435\u0435\u043a, \u043e\u043d\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0438\u0445 \u043f\u0440\u0435\u0444\u0430\u0431, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0440\u0435\u043b\u044c\u0435\u0444\u0430. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u0435\u0448, \u043a\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0441 \u0440\u0435\u043b\u044c\u0435\u0444\u043e\u043c. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0435\u0444\u0430\u0431\u0443 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043d\u0443\u0436\u0435\u043d \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>HexMesh<\/code>. \u041f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043c\u0435\u0448\u0435\u0439 \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b <em>Walls<\/em> \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0438 \u0442\u0435\u043d\u0438. \u0418\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u043e\u043f\u0446\u0438\u0438 <code>HexMesh<\/code> \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/615\/387\/31d\/61538731d2eed271c9348c4da2f5d844.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2bf\/c6e\/af5\/2bfc6eaf5ff31f5467ab252c00b7bcce.png\"><\/div>\n<p>  <i>\u0414\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043f\u0440\u0435\u0444\u0430\u0431 Walls.<\/i><\/p>\n<p>  \u0411\u0443\u0434\u0435\u0442 \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0447\u0442\u043e \u0441\u0442\u0435\u043d\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u0440\u0431\u0430\u043d\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0438\u0445 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0437\u0434\u0430\u043d\u0438\u0439.<\/p>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0430\u043c\u0438<\/h3>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0435\u043d\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0440\u0435\u043b\u044c\u0435\u0444\u0430, \u0438\u043c\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f <code>HexFeatureManager<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0434\u0438\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 <em>Walls<\/em>, \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u043b \u043c\u0435\u0442\u043e\u0434\u044b <code>Clear<\/code> \u0438 <code>Apply<\/code>.<\/p>\n<pre><code class=\"cs\">\tpublic HexMesh walls;  \t\u2026  \tpublic void Clear () { \t\t\u2026 \t\twalls.Clear(); \t}  \tpublic void Apply () { \t\twalls.Apply(); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/31d\/8f9\/0f3\/31d8f90f315c7aa43910c67aab6b73cb.png\"><\/div>\n<p>  <i>\u0421\u0442\u0435\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u0441 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430.<\/i><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0437\u0432\u0435 Walls \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c Features?<\/b><\/p>\n<div class=\"spoiler_text\">\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u043e \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043e\u043a\u043d\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u0432, \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <em>Walls<\/em> \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c <em>Hex Grid Chunk<\/em>.<\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043c\u0435\u0442\u043e\u0434, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0441\u0442\u0435\u043d\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0435\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u0434\u043e\u043b\u044c \u0440\u0451\u0431\u0435\u0440 \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0440\u0451\u0431\u0435\u0440 \u0438 \u044f\u0447\u0435\u0439\u043a\u0438. <code>HexGridChunk<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 <code>TriangulateConnection<\/code>, \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0435\u0451 \u0441\u043e\u0441\u0435\u0434\u0435\u0439. \u0421 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u0431\u043b\u0438\u0436\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0442\u0435\u043d\u044b, \u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u2014 \u043d\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439.<\/p>\n<pre><code class=\"cs\">\tpublic void AddWall ( \t\tEdgeVertices near, HexCell nearCell, \t\tEdgeVertices far, HexCell farCell \t) { \t}<\/code><\/pre>\n<p>  \u0412\u044b\u0437\u043e\u0432\u0435\u043c \u044d\u0442\u043e\u0442 \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 <code>HexGridChunk.TriangulateConnection<\/code> \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043a \u0443\u0433\u043b\u043e\u0432\u043e\u043c\u0443 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0443. \u041c\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u0441\u0430\u043c\u043e\u043c\u0443 \u0440\u0435\u0448\u0430\u0442\u044c, \u0433\u0434\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0435\u043d\u0430.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateConnection ( \t\tHexDirection direction, HexCell cell, EdgeVertices e1 \t) { \t\t\u2026  \t\tif (cell.GetEdgeType(direction) == HexEdgeType.Slope) { \t\t\t\u2026 \t\t} \t\telse { \t\t\t\u2026 \t\t}  \t\tfeatures.AddWall(e1, cell, e2, neighbor);  \t\tHexCell nextNeighbor = cell.GetNeighbor(direction.Next()); \t\tif (direction &lt;= HexDirection.E &amp;&amp; nextNeighbor != null) { \t\t\t\u2026 \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0435\u043d\u044b<\/h3>\n<p>  \u0412\u0441\u044f \u0441\u0442\u0435\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0451\u0431\u0435\u0440 \u044f\u0447\u0435\u0435\u043a. \u041a\u0430\u0436\u0434\u043e\u0435 \u0440\u0435\u0431\u0440\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0435\u043d\u044b. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u043b\u0438\u0436\u043d\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043b\u0435\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0431\u0440\u0430 \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexFeatureManager<\/code> \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0443\u0433\u043b\u0430\u0445 \u0440\u0435\u0431\u0440\u0430.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallSegment ( \t\tVector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight \t) { \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f32\/2a0\/d7b\/f322a0d7bc325b13f65c62cfb76b2d0c.png\"><\/div>\n<p>  <i>\u0411\u043b\u0438\u0436\u043d\u044f\u044f \u0438 \u0434\u0430\u043b\u044c\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/i><\/p>\n<p>  <code>AddWall<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \u0440\u0451\u0431\u0435\u0440. \u041d\u043e \u0441\u0442\u0435\u043d\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0433\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u043e\u0439 \u0438 \u043d\u0435\u043e\u0433\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u043e\u0439. \u041d\u0435 \u0432\u0430\u0436\u043d\u043e, \u043a\u0430\u043a\u0430\u044f \u0438\u0437 \u044f\u0447\u0435\u0435\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438, \u0430 \u043a\u0430\u043a\u0430\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/p>\n<pre><code class=\"cs\">\tpublic void AddWall ( \t\tEdgeVertices near, HexCell nearCell, \t\tEdgeVertices far, HexCell farCell \t) { \t\tif (nearCell.Walled != farCell.Walled) { \t\t\tAddWallSegment(near.v1, far.v1, near.v5, far.v5); \t\t} \t}<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u0442\u0435\u043d\u044b \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d quad, \u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0440\u0435\u0431\u0440\u0430. \u041c\u044b \u043d\u0430\u0439\u0434\u0451\u043c \u0435\u0433\u043e \u043d\u0438\u0436\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043f\u0440\u043e\u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0432 \u0434\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b \u043e\u0442 \u0431\u043b\u0438\u0436\u043d\u0438\u0445 \u043a \u0434\u0430\u043b\u044c\u043d\u0438\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallSegment ( \t\tVector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight \t) { \t\tVector3 left = Vector3.Lerp(nearLeft, farLeft, 0.5f); \t\tVector3 right = Vector3.Lerp(nearRight, farRight, 0.5f); \t}<\/code><\/pre>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0442\u0435\u043d\u0430? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0435\u0451 \u0432\u044b\u0441\u043e\u0442\u0443 \u0432 <code>HexMetrics<\/code>. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u0442\u044b \u044f\u0447\u0435\u0435\u043a.<\/p>\n<pre><code class=\"cs\">\tpublic const float wallHeight = 3f;<\/code><\/pre>\n<p>  <code>HexFeatureManager.AddWallSegment<\/code> \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0432\u044b\u0441\u043e\u0442\u0443 \u0434\u043b\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0438 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b quad-\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u0432 \u043c\u0435\u0448 <code>walls<\/code>.<\/p>\n<pre><code class=\"cs\">\t\tVector3 left = Vector3.Lerp(nearLeft, farLeft, 0.5f); \t\tVector3 right = Vector3.Lerp(nearRight, farRight, 0.5f);  \t\tVector3 v1, v2, v3, v4; \t\tv1 = v3 = left; \t\tv2 = v4 = right; \t\tv3.y = v4.y = left.y + HexMetrics.wallHeight; \t\twalls.AddQuad(v1, v2, v3, v4);<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043d\u044b \u0438 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u043b\u043e\u0441\u044b quad-\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0443\u044e \u0441\u0442\u0435\u043d\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 quad \u0432\u0438\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0415\u0433\u043e \u0433\u0440\u0430\u043d\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u044f\u0447\u0435\u0439\u043a\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e5a\/2f0\/442\/e5a2f0442a2d1812b73dd2977d80d565.png\"><\/div>\n<p>  <i>\u041e\u0434\u043d\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 quad-\u044b \u0441\u0442\u0435\u043d.<\/i><\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432\u0442\u043e\u0440\u043e\u0439 quad, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443.<\/p>\n<pre><code class=\"cs\">\t\twalls.AddQuad(v1, v2, v3, v4); \t\twalls.AddQuad(v2, v1, v4, v3);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/302\/e53\/129\/302e53129e87c3432848772688e9d896.png\"><\/div>\n<p>  <i>\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u044b.<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0441\u0442\u0435\u043d\u044b \u0432\u0438\u0434\u043d\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u0443\u0433\u043b\u0430\u0445 \u044f\u0447\u0435\u0435\u043a, \u0433\u0434\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u0440\u0438 \u044f\u0447\u0435\u0439\u043a\u0438, \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0434\u044b\u0440\u044b. \u041c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0438\u0445 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<h3>\u0422\u043e\u043b\u0441\u0442\u044b\u0435 \u0441\u0442\u0435\u043d\u044b<\/h3>\n<p>  \u0425\u043e\u0442\u044f \u0441\u0442\u0435\u043d\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0438\u043c\u044b \u0441 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d, \u0443 \u043d\u0438\u0445 \u043d\u0435\u0442 \u0442\u043e\u043b\u0449\u0438\u043d\u044b. \u041f\u043e \u0441\u0443\u0442\u0438, \u0441\u0442\u0435\u043d\u044b \u0442\u043e\u043d\u043a\u0438\u0435, \u043a\u0430\u043a \u0431\u0443\u043c\u0430\u0433\u0430, \u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b \u043f\u043e\u0434 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u0443\u0433\u043b\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u0445 \u0446\u0435\u043b\u044c\u043d\u044b\u043c\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0442\u043e\u043b\u0449\u0438\u043d\u0443. \u0417\u0430\u0434\u0430\u0434\u0438\u043c \u0438\u0445 \u0442\u043e\u043b\u0449\u0438\u043d\u0443 \u0432 <code>HexMetrics<\/code>. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0.75 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u043c\u043d\u0435 \u043e\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c.<\/p>\n<pre><code class=\"cs\">\tpublic const float wallThickness = 0.75f;<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0435 \u0441\u0442\u0435\u043d\u044b \u0442\u043e\u043b\u0441\u0442\u044b\u043c\u0438, \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0441\u0442\u0438 \u0434\u0432\u0430 quad-\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u041e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445. \u041e\u0434\u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0431\u043b\u0438\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0431\u0440\u0443, \u0434\u0440\u0443\u0433\u0430\u044f \u2014 \u043a \u0434\u0430\u043b\u044c\u043d\u0435\u043c\u0443. \u0412\u0435\u043a\u0442\u043e\u0440 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0432\u0435\u043d <code>far - near<\/code>, \u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0435\u043d\u044b \u043f\u043b\u043e\u0441\u043a\u043e\u0439, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 Y \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439, \u0438 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0435\u043d\u044b, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexMetrics<\/code> \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cs\">\tpublic static Vector3 WallThicknessOffset (Vector3 near, Vector3 far) { \t\tVector3 offset; \t\toffset.x = far.x - near.x; \t\toffset.y = 0f; \t\toffset.z = far.z - near.z; \t\treturn offset; \t}<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u0442\u0435\u043d\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u0440\u0435\u0431\u0440\u0430, \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0442\u043e\u043b\u0449\u0438\u043d\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d. \u0418 \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043d\u0443\u0436\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u0435\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/p>\n<pre><code class=\"cs\">\t\treturn offset.normalized * (wallThickness * 0.5f);<\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432 <code>HexFeatureManager.AddWallSegment<\/code> \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 quad-\u043e\u0432. \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0434\u0451\u0442 \u043e\u0442 \u0431\u043b\u0438\u0436\u043d\u0435\u0439 \u043a \u0434\u0430\u043b\u044c\u043d\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0435, \u0432\u044b\u0447\u0442\u0435\u043c \u0435\u0433\u043e \u0438\u0437 \u0431\u043b\u0438\u0436\u043d\u0435\u0433\u043e quad \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043c \u043a \u0434\u0430\u043b\u044c\u043d\u0435\u043c\u0443.<\/p>\n<pre><code class=\"cs\">\t\tVector3 left = Vector3.Lerp(nearLeft, farLeft, 0.5f); \t\tVector3 right = Vector3.Lerp(nearRight, farRight, 0.5f); \t\t \t\tVector3 leftThicknessOffset = \t\t\tHexMetrics.WallThicknessOffset(nearLeft, farLeft); \t\tVector3 rightThicknessOffset = \t\t\tHexMetrics.WallThicknessOffset(nearRight, farRight);  \t\tVector3 v1, v2, v3, v4; \t\tv1 = v3 = left - leftThicknessOffset; \t\tv2 = v4 = right - rightThicknessOffset; \t\tv3.y = v4.y = left.y + HexMetrics.wallHeight; \t\twalls.AddQuad(v1, v2, v3, v4);  \t\tv1 = v3 = left + leftThicknessOffset; \t\tv2 = v4 = right + rightThicknessOffset; \t\tv3.y = v4.y = left.y + HexMetrics.wallHeight; \t\twalls.AddQuad(v2, v1, v4, v3);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/df7\/746\/08b\/df774608b2b06114b4afbc6ec2904e61.png\"><\/div>\n<p>  <i>\u0421\u0442\u0435\u043d\u044b \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u043c\u0438.<\/i><\/p>\n<p>  Quad-\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u044b, \u0445\u043e\u0442\u044f \u044d\u0442\u043e \u0438 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u043d\u043e.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u0442\u043e\u043b\u0449\u0438\u043d\u0430 \u0441\u0442\u0435\u043d \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430?<\/b><\/p>\n<div class=\"spoiler_text\">\u041e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430, \u0435\u0441\u043b\u0438 \u0431\u044b \u0432\u0441\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u00ab\u0431\u043b\u0438\u0437\u043a\u043e-\u0434\u0430\u043b\u0435\u043a\u043e\u00bb \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0431\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0435\u043d\u044b \u0438\u0441\u043a\u0440\u0438\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u044f\u0447\u0435\u0435\u043a, \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0412\u0435\u043a\u0442\u043e\u0440\u044b \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e \u0438\u043b\u0438 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0435\u043d\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u0440\u0430\u043f\u0435\u0446\u043e\u0438\u0434\u043e\u043c, \u0430 \u043d\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0435\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043d\u0430\u043c\u0438 \u0442\u043e\u043b\u0449\u0438\u043d\u0430. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0438\u0437-\u0437\u0430 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u044f\u0447\u0435\u0435\u043a \u0443\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0439 \u0442\u043e\u043b\u0449\u0438\u043d\u0435. \u041c\u044b \u0440\u0435\u0448\u0438\u043c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/div>\n<\/div>\n<p>  <\/p>\n<h3>\u0412\u0435\u0440\u0445\u0443\u0448\u043a\u0438 \u0441\u0442\u0435\u043d<\/h3>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0442\u043e\u043b\u0449\u0438\u043d\u0430 \u0441\u0442\u0435\u043d \u0431\u044b\u043b\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u0430 \u0441\u0432\u0435\u0440\u0445\u0443, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c quad \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0435\u043d\u044b. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0432 \u0434\u0432\u0435 \u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e quad \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0432 \u0438\u0445 \u0441 \u0434\u0432\u0443\u043c\u044f \u0432\u0435\u0440\u0445\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e quad.<\/p>\n<pre><code class=\"cs\">\t\tVector3 v1, v2, v3, v4; \t\tv1 = v3 = left - leftThicknessOffset; \t\tv2 = v4 = right - rightThicknessOffset; \t\tv3.y = v4.y = left.y + HexMetrics.wallHeight; \t\twalls.AddQuad(v1, v2, v3, v4);  \t\tVector3 t1 = v3, t2 = v4;  \t\tv1 = v3 = left + leftThicknessOffset; \t\tv2 = v4 = right + rightThicknessOffset; \t\tv3.y = v4.y = left.y + HexMetrics.wallHeight; \t\twalls.AddQuad(v2, v1, v4, v3);  \t\twalls.AddQuad(t1, t2, v3, v4);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1d7\/15d\/627\/1d715d627770a9e7a17bf135a461833d.png\"><\/div>\n<p>  <i>\u0421\u0442\u0435\u043d\u044b \u0441 \u0432\u0435\u0440\u0445\u0443\u0448\u043a\u0430\u043c\u0438.<\/i><\/p>\n<h3>\u041f\u043e\u0432\u043e\u0440\u043e\u0442\u044b \u043d\u0430 \u0443\u0433\u043b\u0430\u0445<\/h3>\n<p>  \u0423 \u043d\u0430\u0441 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0434\u044b\u0440\u044b \u043d\u0430 \u0443\u0433\u043b\u0430\u0445 \u044f\u0447\u0435\u0435\u043a. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0432 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0433\u043e\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0442\u0440\u0438 \u044f\u0447\u0435\u0439\u043a\u0438. \u041a\u0430\u0436\u0434\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0438\u043b\u0438 \u043d\u0435 \u0438\u043c\u0435\u0442\u044c \u0441\u0442\u0435\u043d\u0443. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0432\u043e\u0441\u0435\u043c\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ed9\/277\/8ee\/ed92778ee39106d3a448892a124d366c.png\"><\/div>\n<p>  <i>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0443\u0433\u043b\u043e\u0432.<\/i><\/p>\n<p>  \u041c\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u0442\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u00ab\u043e\u0433\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00bb. \u042d\u0442\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0434\u043e \u0448\u0435\u0441\u0442\u0438. \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0434\u043d\u0430 \u0438\u0437 \u044f\u0447\u0435\u0435\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0440\u0438\u0432\u043e\u0439 \u0441\u0442\u0435\u043d. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u0443 \u044f\u0447\u0435\u0439\u043a\u0443 \u043e\u043f\u043e\u0440\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439, \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u043a\u0440\u0438\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0435\u043d\u0430. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u0442\u0435\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0440\u0435\u0431\u0440\u0430, \u043e\u0431\u0449\u0435\u0433\u043e \u0441 \u043b\u0435\u0432\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u043e\u0439, \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0431\u0440\u043e\u043c, \u043e\u0431\u0449\u0438\u043c \u0441 \u043f\u0440\u0430\u0432\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u043e\u0439.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/48e\/f68\/19a\/48ef6819a839339a17d1513f7ca546b5.png\"><\/div>\n<p>  <i>\u0420\u043e\u043b\u0438 \u044f\u0447\u0435\u0435\u043a.<\/i><\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>AddWallSegment<\/code>, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0442\u0440\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0443\u0433\u043b\u0430. \u0425\u043e\u0442\u044c \u043c\u044b \u0438 \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0430 <code>AddWallSegment<\/code>. \u041e\u043f\u043e\u0440\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u043e\u0431\u0435\u0438\u0445 \u0431\u043b\u0438\u0436\u043d\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallSegment ( \t\tVector3 pivot, HexCell pivotCell, \t\tVector3 left, HexCell leftCell, \t\tVector3 right, HexCell rightCell \t) { \t\tAddWallSegment(pivot, left, pivot, right); \t}<\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 <code>AddWall<\/code> \u0434\u043b\u044f \u0442\u0440\u0451\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0443\u0433\u043b\u0430 \u0438 \u0438\u0445 \u044f\u0447\u0435\u0435\u043a. \u0417\u0430\u0434\u0430\u0447\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0443\u0433\u043b\u0430, \u044f\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043e\u043f\u043e\u0440\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0441\u0435\u043c\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>AddWallSegment<\/code> \u0434\u043b\u044f \u0448\u0435\u0441\u0442\u0438 \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<pre><code class=\"cs\">\tpublic void AddWall ( \t\tVector3 c1, HexCell cell1, \t\tVector3 c2, HexCell cell2, \t\tVector3 c3, HexCell cell3 \t) { \t\tif (cell1.Walled) { \t\t\tif (cell2.Walled) { \t\t\t\tif (!cell3.Walled) { \t\t\t\t\tAddWallSegment(c3, cell3, c1, cell1, c2, cell2); \t\t\t\t} \t\t\t} \t\t\telse if (cell3.Walled) { \t\t\t\tAddWallSegment(c2, cell2, c3, cell3, c1, cell1); \t\t\t} \t\t\telse { \t\t\t\tAddWallSegment(c1, cell1, c2, cell2, c3, cell3); \t\t\t} \t\t} \t\telse if (cell2.Walled) { \t\t\tif (cell3.Walled) { \t\t\t\tAddWallSegment(c1, cell1, c2, cell2, c3, cell3); \t\t\t} \t\t\telse { \t\t\t\tAddWallSegment(c2, cell2, c3, cell3, c1, cell1); \t\t\t} \t\t} \t\telse if (cell3.Walled) { \t\t\tAddWallSegment(c3, cell3, c1, cell1, c2, cell2); \t\t} \t}<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0446\u0435 <code>HexGridChunk.TriangulateCorner<\/code>.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateCorner ( \t\tVector3 bottom, HexCell bottomCell, \t\tVector3 left, HexCell leftCell, \t\tVector3 right, HexCell rightCell \t) { \t\t\u2026 \t\t \t\tfeatures.AddWall(bottom, bottomCell, left, leftCell, right, rightCell); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a8e\/e63\/304\/a8ee63304fce04d4db9dcdf46076b3a9.png\"><\/div>\n<p>  <i>\u0421\u0442\u0435\u043d\u044b \u0441 \u0443\u0433\u043b\u0430\u043c\u0438, \u043d\u043e \u0434\u044b\u0440\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c.<\/i><\/p>\n<h3>\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0434\u044b\u0440\u044b<\/h3>\n<p>  \u0412 \u0441\u0442\u0435\u043d\u0430\u0445 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0435\u0441\u0442\u044c \u0434\u044b\u0440\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b\u0441\u043e\u0442\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0435\u043d \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430. \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0432\u0434\u043e\u043b\u044c \u0440\u0451\u0431\u0435\u0440 \u0438\u043c\u0435\u044e\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u0432\u044b\u0441\u043e\u0442\u0443, \u0443\u0433\u043b\u043e\u0432\u044b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0440\u0451\u0431\u0440\u0430\u043c\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u043e\u0435 \u0440\u0435\u0431\u0440\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0432\u043e\u044e \u0432\u044b\u0441\u043e\u0442\u0443, \u043d\u0430 \u0443\u0433\u043b\u0430\u0445 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u044b\u0440\u044b.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e, \u0438\u0437\u043c\u0435\u043d\u0438\u043c <code>AddWallSegment<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0445\u0440\u0430\u043d\u0438\u043b \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b Y \u043b\u0435\u0432\u043e\u0439 \u0438 \u043f\u0440\u0430\u0432\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d.<\/p>\n<pre><code class=\"cs\">\t\tfloat leftTop = left.y + HexMetrics.wallHeight; \t\tfloat rightTop = right.y + HexMetrics.wallHeight;  \t\tVector3 v1, v2, v3, v4; \t\tv1 = v3 = left - leftThicknessOffset; \t\tv2 = v4 = right - rightThicknessOffset; \t\tv3.y = leftTop; \t\tv4.y = rightTop; \t\twalls.AddQuad(v1, v2, v3, v4);  \t\tVector3 t1 = v3, t2 = v4;  \t\tv1 = v3 = left + leftThicknessOffset; \t\tv2 = v4 = right + rightThicknessOffset; \t\tv3.y = leftTop; \t\tv4.y = rightTop; \t\twalls.AddQuad(v2, v1, v4, v3);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9cd\/f1d\/a88\/9cdf1da889ce427e1d519a284532d6a8.png\"><\/div>\n<p>  <i>\u0417\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0435 \u0441\u0442\u0435\u043d\u044b.<\/i><\/p>\n<p>  \u0421\u0442\u0435\u043d\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b, \u043d\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0432\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u0438\u0434\u0438\u0442\u0435 \u0434\u044b\u0440\u044b \u0432 \u0442\u0435\u043d\u044f\u0445 \u0441\u0442\u0435\u043d\u044b. \u042d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <em>Normal Bias<\/em> \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0442\u0435\u043d\u0435\u0439 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430. \u041a\u043e\u0433\u0434\u0430 \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0443\u043b\u044f, \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0442\u0435\u043d\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u0432\u0434\u043e\u043b\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u044b\u0440\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u044b\u0440\u044b \u0432 \u0442\u0435\u043d\u044f\u0445 \u0442\u043e\u043d\u043a\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u043a \u043d\u0430\u0448\u0438 \u0441\u0442\u0435\u043d\u044b.<\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u044d\u0442\u0438\u0445 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0442\u0435\u043d\u0435\u0439, \u0441\u043d\u0438\u0437\u0438\u0432 normal bias \u0434\u043e \u043d\u0443\u043b\u044f. \u0418\u043b\u0438 \u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c <em>Cast Shadows<\/em> mesh renderer \u0441\u0442\u0435\u043d\u044b \u043d\u0430 <em>Two Sided<\/em>. \u042d\u0442\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u043d\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0441\u0442\u0435\u043d\u044b, \u0447\u0442\u043e \u0437\u0430\u043a\u0440\u043e\u0435\u0442 \u0432\u0441\u0435 \u0434\u044b\u0440\u044b.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b14\/9d5\/d0b\/b149d5d0bb36f049faa5ca9d49261618.png\"><\/div>\n<p>  <i>\u0411\u043e\u043b\u044c\u0448\u0435 \u0434\u044b\u0440 \u0432 \u0442\u0435\u043d\u044f\u0445 \u043d\u0435\u0442.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-10\/creating-walls\/creating-walls.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0421\u0442\u0435\u043d\u044b \u043d\u0430 \u0443\u0441\u0442\u0443\u043f\u0430\u0445<\/h2>\n<p>  \u041f\u043e\u043a\u0430 \u043d\u0430\u0448\u0438 \u0441\u0442\u0435\u043d\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u044f\u043c\u044b\u0435. \u0414\u043b\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0433\u043e \u0440\u0435\u043b\u044c\u0435\u0444\u0430 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043f\u043b\u043e\u0445\u043e, \u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0435\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u0443\u0441\u0442\u0443\u043f\u0430\u043c\u0438. \u0422\u0430\u043a\u043e\u0435 \u0431\u044b\u0432\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u0445 \u0441\u0442\u0435\u043d\u044b \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/065\/481\/c1a\/065481c1a0859ced22d0ae6568acbe86.png\"><\/div>\n<p>  <i>\u041f\u0440\u044f\u043c\u044b\u0435 \u0441\u0442\u0435\u043d\u044b \u043d\u0430 \u0443\u0441\u0442\u0443\u043f\u0430\u0445.<\/i><\/p>\n<h3>\u0421\u043b\u0435\u0434\u0443\u0435\u043c \u0437\u0430 \u0440\u0435\u0431\u0440\u043e\u043c<\/h3>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0431\u0440\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u043b\u043e\u0441\u044b \u0440\u0435\u0431\u0440\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u0430 <code>AddWallSegment<\/code> \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 <code>AddWall<\/code> \u0434\u043b\u044f \u0440\u0451\u0431\u0435\u0440.<\/p>\n<pre><code class=\"cs\">\tpublic void AddWall ( \t\tEdgeVertices near, HexCell nearCell, \t\tEdgeVertices far, HexCell farCell \t) { \t\tif (nearCell.Walled != farCell.Walled) { \t\t\tAddWallSegment(near.v1, far.v1, near.v2, far.v2); \t\t\tAddWallSegment(near.v2, far.v2, near.v3, far.v3); \t\t\tAddWallSegment(near.v3, far.v3, near.v4, far.v4); \t\t\tAddWallSegment(near.v4, far.v4, near.v5, far.v5); \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a96\/8aa\/0f9\/a968aa0f984b31e81dc9edb12e8d31bb.png\"><\/div>\n<p>  <i>\u0418\u0437\u0433\u0438\u0431\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0442\u0435\u043d\u044b.<\/i><\/p>\n<p>  \u0421\u0442\u0435\u043d\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442 \u0444\u043e\u0440\u043c\u044b \u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440. \u0412 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 \u0443\u0441\u0442\u0443\u043f\u0430\u043c\u0438 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u044b \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u043c \u0440\u0435\u043b\u044c\u0435\u0444\u0435.<\/p>\n<h3>\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d \u043d\u0430 \u0437\u0435\u043c\u043b\u0435<\/h3>\n<p>  \u041f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u0432\u0448\u0438\u0441\u044c \u043a \u0441\u0442\u0435\u043d\u0430\u043c \u043d\u0430 \u0443\u0441\u0442\u0443\u043f\u0430\u0445, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0421\u0442\u0435\u043d\u044b \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0438\u0441\u044f\u0449\u0438\u043c\u0438 \u043d\u0430\u0434 \u0437\u0435\u043c\u043b\u0451\u0439! \u042d\u0442\u043e \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0438 \u0434\u043b\u044f \u043d\u0430\u043a\u043b\u043e\u043d\u043d\u044b\u0445 \u043f\u043b\u043e\u0441\u043a\u0438\u0445 \u0440\u0451\u0431\u0435\u0440, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0442\u0430\u043a \u0437\u0430\u043c\u0435\u0442\u043d\u043e.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/039\/8f0\/a59\/0398f0a59aca756824e162c3fba5a891.png\"><\/div>\n<p>  <i>\u0412\u0438\u0441\u044f\u0449\u0438\u0435 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435 \u0441\u0442\u0435\u043d\u044b.<\/i><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u044b. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u044e \u0441\u0442\u0435\u043d\u0443, \u0447\u0442\u043e\u0431\u044b \u0435\u0451 \u0432\u0435\u0440\u0445\u0443\u0448\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u043b\u043e\u0441\u043a\u043e\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0435\u043d\u044b \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u043b\u044c\u0435\u0444, \u043d\u043e \u044d\u0442\u043e \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u043e\u0438\u0442.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u0443, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d \u043d\u0438\u0436\u043d\u044f\u044f \u2014 \u0431\u043b\u0438\u0436\u043d\u044f\u044f \u0438\u043b\u0438 \u0434\u0430\u043b\u044c\u043d\u044f\u044f. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0439 \u043d\u0438\u0437\u043a\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043d\u043e \u0442\u0430\u043a \u043d\u0438\u0437\u043a\u043e \u043d\u0430\u043c \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 Y \u043e\u0442 \u043d\u0438\u0437\u043a\u043e\u0439 \u043a \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 0.5. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u0440\u0435\u0434\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432\u044b\u0448\u0435 \u043d\u0438\u0436\u043d\u0435\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u044c\u043a\u0438 \u0443\u0441\u0442\u0443\u043f\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u0443\u0441\u0442\u0443\u043f\u0430. \u0414\u0440\u0443\u0433\u0430\u044f \u0442\u043e\u043b\u0449\u0438\u043d\u0430 \u0441\u0442\u0435\u043d \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0443\u043f\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/960\/61c\/817\/96061c817bfdc69db9682e0799ba3751.png\"><\/div>\n<p>  <i>\u041e\u043f\u0443\u0449\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0435\u043d\u0430.<\/i><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexMetrics<\/code> \u043c\u0435\u0442\u043e\u0434 <code>WallLerp<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0439\u043c\u0451\u0442\u0441\u044f \u044d\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439, \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u0443\u0441\u0440\u0435\u0434\u043d\u0435\u043d\u0438\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 X \u0438 Z \u0431\u043b\u0438\u0436\u043d\u0438\u0445 \u0438 \u0434\u0430\u043b\u044c\u043d\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d. \u041e\u043d \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u0435 <code>TerraceLerp<\/code>.<\/p>\n<pre><code class=\"cs\">\tpublic const float wallElevationOffset = verticalTerraceStepSize; \t\t\t\t\t\t \t\u2026 \t\t\t\t\t\t \tpublic static Vector3 WallLerp (Vector3 near, Vector3 far) { \t\tnear.x += (far.x - near.x) * 0.5f; \t\tnear.z += (far.z - near.z) * 0.5f; \t\tfloat v = \t\t\tnear.y &lt; far.y ? wallElevationOffset : (1f - wallElevationOffset); \t\tnear.y += (far.y - near.y) * v; \t\treturn near; \t}<\/code><\/pre>\n<p>  \u0417\u0430\u0441\u0442\u0430\u0432\u0438\u043c <code>HexFeatureManager<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043b\u0435\u0432\u044b\u0445 \u0438 \u043f\u0440\u0430\u0432\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallSegment ( \t\tVector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight \t) { \t\tVector3 left = HexMetrics.WallLerp(nearLeft, farLeft); \t\tVector3 right = HexMetrics.WallLerp(nearRight, farRight);  \t\t\u2026 \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/957\/a4c\/b49\/957a4cb498eb8a712064a0b99a4041be.png\"><\/div>\n<p>  <i>\u0421\u0442\u043e\u044f\u0449\u0438\u0435 \u043d\u0430 \u0437\u0435\u043c\u043b\u0435 \u0441\u0442\u0435\u043d\u044b.<\/i><\/p>\n<h3>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043d<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0438 \u0441\u0442\u0435\u043d\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f\u043c \u0432 \u0432\u044b\u0441\u043e\u0442\u0430\u0445. \u041d\u043e \u043e\u043d\u0438 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u043c \u0440\u0451\u0431\u0440\u0430\u043c, \u0445\u043e\u0442\u044f \u0438 \u0431\u043b\u0438\u0437\u043a\u0438 \u043a \u043d\u0438\u043c. \u0422\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u0442\u0435\u043d, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u0438\u0441\u043a\u0430\u0436\u0430\u0435\u043c \u0438\u0445. \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0433\u0434\u0435-\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \u0431\u043b\u0438\u0436\u043d\u0435\u0433\u043e \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0433\u043e \u0440\u0451\u0431\u0435\u0440, \u0442\u043e \u0438\u0445 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0433\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0422\u043e, \u0447\u0442\u043e \u0441\u0442\u0435\u043d\u044b \u043d\u0435\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0437\u0430 \u0440\u0451\u0431\u0440\u0430\u043c\u0438, \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u0442\u0435\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u0443\u044e \u0442\u043e\u043b\u0449\u0438\u043d\u0443. \u0415\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0441\u0442\u0435\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u0435 quad, \u0438\u0445 \u0442\u043e\u043b\u0449\u0438\u043d\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallSegment ( \t\tVector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight \t) { \t\tnearLeft = HexMetrics.Perturb(nearLeft); \t\tfarLeft = HexMetrics.Perturb(farLeft); \t\tnearRight = HexMetrics.Perturb(nearRight); \t\tfarRight = HexMetrics.Perturb(farRight);  \t\t\u2026 \t\twalls.AddQuadUnperturbed(v1, v2, v3, v4);  \t\t\u2026 \t\twalls.AddQuadUnperturbed(v2, v1, v4, v3);  \t\twalls.AddQuadUnperturbed(t1, t2, v3, v4); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b10\/fa3\/03d\/b10fa303dc91a50665bf92b47feed5e7.png\"><\/div>\n<p>  <i>\u041d\u0435\u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u0442\u0435\u043d.<\/i><\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443 \u0441\u0442\u0435\u043d\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0437\u0430 \u0440\u0451\u0431\u0440\u0430\u043c\u0438 \u0442\u0430\u043a \u0436\u0435 \u0442\u043e\u0447\u043d\u043e, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435. \u041d\u043e \u0432\u0437\u0430\u043c\u0435\u043d \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u043c\u0435\u043d\u0435\u0435 \u0438\u0437\u043b\u043e\u043c\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u0442\u043e\u043b\u0449\u0438\u043d\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d38\/7f6\/b6f\/d387f6b6f1c4fed424d2582a8ef5c12c.png\"><\/div>\n<p>  <i>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0442\u043e\u043b\u0449\u0438\u043d\u0430 \u0441\u0442\u0435\u043d.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-10\/walls-on-terraces\/walls-on-terraces.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u041e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044f \u0432 \u0441\u0442\u0435\u043d\u0430\u0445<\/h2>\n<p>  \u041f\u043e\u043a\u0430 \u043c\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0442\u0435\u043d\u0443 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u044c \u0440\u0435\u043a\u0430 \u0438\u043b\u0438 \u0434\u043e\u0440\u043e\u0433\u0430. \u041a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0441\u0442\u0435\u043d\u0435 \u0434\u044b\u0440\u0443, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0440\u0435\u043a\u0430 \u0438\u043b\u0438 \u0434\u043e\u0440\u043e\u0433\u0430.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>AddWall<\/code> \u0434\u0432\u0430 \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0435, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0431\u0440\u043e \u0440\u0435\u043a\u0430 \u0438\u043b\u0438 \u0434\u043e\u0440\u043e\u0433\u0430. \u0425\u043e\u0442\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0434\u0432\u0430 \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"cs\">\tpublic void AddWall ( \t\tEdgeVertices near, HexCell nearCell, \t\tEdgeVertices far, HexCell farCell, \t\tbool hasRiver, bool hasRoad \t) { \t\tif (nearCell.Walled != farCell.Walled) { \t\t\tAddWallSegment(near.v1, far.v1, near.v2, far.v2); \t\t\tif (hasRiver || hasRoad) { \t\t\t\t\/\/ Leave a gap. \t\t\t} \t\t\telse { \t\t\t\tAddWallSegment(near.v2, far.v2, near.v3, far.v3); \t\t\t\tAddWallSegment(near.v3, far.v3, near.v4, far.v4); \t\t\t} \t\t\tAddWallSegment(near.v4, far.v4, near.v5, far.v5); \t\t} \t}<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c <code>HexGridChunk.TriangulateConnection<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u0435\u043c\u0443 \u0443\u0436\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0442\u0430 \u0436\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u043c \u0435\u0451 \u0432 \u0431\u0443\u043b\u0435\u0432\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateConnection ( \t\tHexDirection direction, HexCell cell, EdgeVertices e1 \t) { \t\t\u2026  \t\tbool hasRiver = cell.HasRiverThroughEdge(direction); \t\tbool hasRoad = cell.HasRoadThroughEdge(direction);  \t\tif (hasRiver) { \t\t\t\u2026 \t\t}  \t\tif (cell.GetEdgeType(direction) == HexEdgeType.Slope) { \t\t\tTriangulateEdgeTerraces(e1, cell, e2, neighbor, hasRoad); \t\t} \t\telse { \t\t\tTriangulateEdgeStrip(e1, cell.Color, e2, neighbor.Color, hasRoad); \t\t}  \t\tfeatures.AddWall(e1, cell, e2, neighbor, hasRiver, hasRoad); \t\t\u2026 \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/64c\/d05\/425\/64cd0542540b5d9347a071d727fe2fa4.png\"><\/div>\n<p>  <i>\u041e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044f \u0432 \u0441\u0442\u0435\u043d\u0430\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0440\u0435\u043a \u0438 \u0434\u043e\u0440\u043e\u0433.<\/i><\/p>\n<h3>\u041d\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0435\u043d\u044b<\/h3>\n<p>  \u042d\u0442\u0438 \u043d\u043e\u0432\u044b\u0435 \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043c\u0435\u0441\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043d. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 quad-\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043a\u0432\u043e\u0437\u044c \u0431\u043e\u043a\u0430 \u0441\u0442\u0435\u043d. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438 \u0432 <code>HexFeatureManager<\/code> \u043c\u0435\u0442\u043e\u0434 <code>AddWallCap<\/code>. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a <code>AddWallSegment<\/code>, \u043d\u043e \u0435\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043f\u0430\u0440\u0430 \u0431\u043b\u0438\u0436\u043d\u0438\u0445-\u0434\u0430\u043b\u0451\u043a\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d. \u0417\u0430\u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c quad, \u0438\u0434\u0443\u0449\u0438\u0439 \u043e\u0442 \u0431\u043b\u0438\u0436\u043d\u0435\u0439 \u0434\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0442\u0435\u043d\u044b.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallCap (Vector3 near, Vector3 far) { \t\tnear = HexMetrics.Perturb(near); \t\tfar = HexMetrics.Perturb(far);  \t\tVector3 center = HexMetrics.WallLerp(near, far); \t\tVector3 thickness = HexMetrics.WallThicknessOffset(near, far);  \t\tVector3 v1, v2, v3, v4;  \t\tv1 = v3 = center - thickness; \t\tv2 = v4 = center + thickness; \t\tv3.y = v4.y = center.y + HexMetrics.wallHeight; \t\twalls.AddQuadUnperturbed(v1, v2, v3, v4); \t}<\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 <code>AddWall<\/code> \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0435, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0440\u044b\u0448\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 \u0432\u0442\u043e\u0440\u043e\u0439 \u0438 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0438 \u0432\u0435\u0440\u0448\u0438\u043d \u0440\u0451\u0431\u0435\u0440. \u0414\u043b\u044f \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u0439 \u043f\u0430\u0440\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0438\u043d\u0430\u0447\u0435 \u0433\u0440\u0430\u043d\u044c quad-\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c.<\/p>\n<pre><code class=\"cs\">\tpublic void AddWall ( \t\tEdgeVertices near, HexCell nearCell, \t\tEdgeVertices far, HexCell farCell, \t\tbool hasRiver, bool hasRoad \t) { \t\tif (nearCell.Walled != farCell.Walled) { \t\t\tAddWallSegment(near.v1, far.v1, near.v2, far.v2); \t\t\tif (hasRiver || hasRoad) { \t\t\t\tAddWallCap(near.v2, far.v2); \t\t\t\tAddWallCap(far.v4, near.v4); \t\t\t} \t\t\t\u2026 \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/413\/98c\/828\/41398c82892a2c1f706ca85c9230813a.png\"><\/div>\n<p>  <i>\u0417\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044f \u0432 \u0441\u0442\u0435\u043d\u0430\u0445.<\/i><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0410 \u043a\u0430\u043a \u043d\u0430\u0441\u0447\u0451\u0442 \u0434\u044b\u0440 \u043f\u043e \u043a\u0440\u0430\u044f\u043c \u043a\u0430\u0440\u0442\u044b?<\/b><\/p>\n<div class=\"spoiler_text\">\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043c\u0435\u0440\u044b, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0441\u0442\u0435\u043d\u044b \u0438 \u0442\u0430\u043c. \u041b\u0438\u0447\u043d\u043e \u044f \u0438\u0437\u0431\u0435\u0433\u0430\u044e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043d \u043d\u0430 \u043a\u0440\u0430\u044f\u0445 \u043a\u0430\u0440\u0442\u044b. \u041e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043a\u0440\u0430\u044e.<\/div>\n<\/div>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-10\/wall-openings\/wall-openings.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u0418\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u043e\u0431\u0440\u044b\u0432\u043e\u0432 \u0438 \u0432\u043e\u0434\u044b<\/h2>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0451\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043e\u0431\u0440\u044b\u0432\u044b \u0438\u043b\u0438 \u0432\u043e\u0434\u0443. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u0440\u044b\u0432\u044b \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0441\u0442\u0435\u043d\u0430\u043c\u0438, \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0435\u043d\u0443. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043b\u043e\u0445\u043e. \u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043b\u043e\u0433\u0438\u0447\u043d\u044b \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u044b, \u043a\u0430\u043a \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0430\u043c\u0438 \u043f\u043e\u0431\u0435\u0440\u0435\u0436\u044c\u044f.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/45a\/94e\/027\/45a94e027094c6ebdae0763663d6eb8e.png\"><\/div>\n<p>  <i>\u0421\u0442\u0435\u043d\u044b \u043d\u0430 \u043e\u0431\u0440\u044b\u0432\u0430\u0445 \u0438 \u0432 \u0432\u043e\u0434\u0435.<\/i><\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u044b \u0441 \u044d\u0442\u0438\u0445 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 \u0432 <code>AddWall<\/code>. \u0421\u0442\u0435\u043d\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439, \u0438 \u043e\u0431\u0449\u0435\u0435 \u0441 \u043d\u0435\u0439 \u0440\u0435\u0431\u0440\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u0440\u044b\u0432\u043e\u043c.<\/p>\n<pre><code class=\"cs\">\tpublic void AddWall ( \t\tEdgeVertices near, HexCell nearCell, \t\tEdgeVertices far, HexCell farCell, \t\tbool hasRiver, bool hasRoad \t) { \t\tif ( \t\t\tnearCell.Walled != farCell.Walled &amp;&amp; \t\t\t!nearCell.IsUnderwater &amp;&amp; !farCell.IsUnderwater &amp;&amp; \t\t\tnearCell.GetEdgeType(farCell) != HexEdgeType.Cliff \t\t) { \t\t\t\u2026 \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/128\/baf\/75a\/128baf75ace7d0cf4ed5f12ef380eec8.png\"><\/div>\n<p>  <i>\u0423\u0434\u0430\u043b\u0438\u043b\u0438 \u043c\u0435\u0448\u0430\u044e\u0449\u0438\u0435 \u0441\u0442\u0435\u043d\u044b \u0432\u0434\u043e\u043b\u044c \u0440\u0451\u0431\u0435\u0440, \u043d\u043e \u0443\u0433\u043b\u044b \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043c\u0435\u0441\u0442\u0435.<\/i><\/p>\n<h3>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u043e\u0432 \u0441\u0442\u0435\u043d<\/h3>\n<p>  \u0414\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0441\u0438\u043b\u0438\u0439. \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043e\u043f\u043e\u0440\u043d\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439. \u042d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0440\u044f\u0434\u043e\u043c \u043d\u0435\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0435\u043d, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallSegment ( \t\tVector3 pivot, HexCell pivotCell, \t\tVector3 left, HexCell leftCell, \t\tVector3 right, HexCell rightCell \t) { \t\tif (pivotCell.IsUnderwater) { \t\t\treturn; \t\t}  \t\tAddWallSegment(pivot, left, pivot, right); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ecc\/475\/9f3\/ecc4759f38ced7802ad8743626f91d51.png\"><\/div>\n<p>  <i>\u041f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u044f\u0447\u0435\u0435\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442.<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438. \u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439 \u0438\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0430 \u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u043e\u0439 \u043e\u0431\u0440\u044b\u0432\u043e\u043c, \u0442\u043e \u0432\u0434\u043e\u043b\u044c \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0431\u0440\u0430 \u043d\u0435\u0442 \u0441\u0442\u0435\u043d\u044b. \u0415\u0441\u043b\u0438 \u0442\u043e \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0443\u0433\u043b\u0443 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0435\u043d\u044b.<\/p>\n<p>  \u041f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u043b\u0435\u0432\u0430\u044f \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u0430\u044f \u0441\u0442\u0435\u043d\u0430. \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0431\u0443\u043b\u0435\u0432\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0447\u0442\u043e\u0431\u044b \u0441 \u043d\u0438\u043c\u0438 \u043b\u0435\u0433\u0447\u0435 \u0431\u044b\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<pre><code class=\"cs\">\t\tif (pivotCell.IsUnderwater) { \t\t\treturn; \t\t}  \t\tbool hasLeftWall = !leftCell.IsUnderwater &amp;&amp; \t\t\tpivotCell.GetEdgeType(leftCell) != HexEdgeType.Cliff; \t\tbool hasRighWall = !rightCell.IsUnderwater &amp;&amp; \t\t\tpivotCell.GetEdgeType(rightCell) != HexEdgeType.Cliff;  \t\tif (hasLeftWall &amp;&amp; hasRighWall) { \t\t\tAddWallSegment(pivot, left, pivot, right); \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8cd\/f17\/82d\/8cdf1782d522d5b9e19e461ee5253436.png\"><\/div>\n<p>  <i>\u0423\u0434\u0430\u043b\u0438\u043b\u0438 \u0432\u0441\u0435 \u043c\u0435\u0448\u0430\u044e\u0449\u0438\u0435 \u0443\u0433\u043b\u044b.<\/i><\/p>\n<h3>\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0443\u0433\u043b\u044b<\/h3>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043d\u0438 \u043d\u0430 \u043b\u0435\u0432\u043e\u043c, \u043d\u0438 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u043c \u0440\u0435\u0431\u0440\u0435 \u043d\u0435\u0442 \u0441\u0442\u0435\u043d\u044b, \u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u0442\u0435\u043d\u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432 \u0441\u0442\u0435\u043d\u0435 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0434\u044b\u0440\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0435\u0451 \u0437\u0430\u043a\u0440\u044b\u0442\u044c.<\/p>\n<pre><code class=\"cs\">\t\tif (hasLeftWall) { \t\t\tif (hasRighWall) { \t\t\t\tAddWallSegment(pivot, left, pivot, right); \t\t\t} \t\t\telse { \t\t\t\tAddWallCap(pivot, left); \t\t\t} \t\t} \t\telse if (hasRighWall) { \t\t\tAddWallCap(right, pivot); \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/20e\/c4d\/176\/20ec4d17689500d123fc5fd41d447e88.png\"><\/div>\n<p>  <i>\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0435\u043d\u044b.<\/i><\/p>\n<h3>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d \u0441 \u043e\u0431\u0440\u044b\u0432\u0430\u043c\u0438<\/h3>\n<p>  \u0412 \u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0441\u0442\u0435\u043d\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e. \u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043d\u0438\u0437\u0430 \u043e\u0431\u0440\u044b\u0432\u0430, \u043e\u043d\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u0440\u044b\u0432\u044b \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u0437\u043a\u0430\u044f \u0434\u044b\u0440\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0435\u043d\u043e\u0439 \u0438 \u0433\u0440\u0430\u043d\u044c\u044e \u043e\u0431\u0440\u044b\u0432\u0430. \u041d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043e\u0431\u0440\u044b\u0432\u0430 \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/633\/5c6\/9a7\/6335c69a7f45dcd1c2a0609503b2504a.png\"><\/div>\n<p>  <i>\u0414\u044b\u0440\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0435\u043d\u0430\u043c\u0438 \u0438 \u0433\u0440\u0430\u043d\u044f\u043c\u0438 \u043e\u0431\u0440\u044b\u0432\u043e\u0432.<\/i><\/p>\n<p>  \u0411\u044b\u043b\u043e \u0431\u044b \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0431\u044b \u0441\u0442\u0435\u043d\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u0430\u0441\u044c \u0434\u043e \u0441\u0430\u043c\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 \u043e\u0431\u0440\u044b\u0432\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u0442\u0435\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043a\u043e\u043d\u0446\u043e\u043c \u0441\u0442\u0435\u043d\u044b \u0438 \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439 \u043e\u0431\u0440\u044b\u0432\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u0440\u044b\u0432\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043e \u043d\u0443\u043b\u044f \u0442\u043e\u043b\u0449\u0438\u043d\u044b \u0441\u0442\u0435\u043d\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u0440\u044b\u0432\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0438\u043d: \u0434\u0432\u0430 \u0438\u0434\u0443\u0449\u0438\u0445 \u0432 \u0442\u043e\u0447\u043a\u0443 quad-\u0430 \u0438 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0438\u0445. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 <code>AddWallWedge<\/code>. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0432 <code>AddWallCap<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0442\u043e\u0447\u043a\u0443 \u043a\u043b\u0438\u043d\u0430.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallWedge (Vector3 near, Vector3 far, Vector3 point) { \t\tnear = HexMetrics.Perturb(near); \t\tfar = HexMetrics.Perturb(far); \t\tpoint = HexMetrics.Perturb(point);  \t\tVector3 center = HexMetrics.WallLerp(near, far); \t\tVector3 thickness = HexMetrics.WallThicknessOffset(near, far);  \t\tVector3 v1, v2, v3, v4; \t\tVector3 pointTop = point; \t\tpoint.y = center.y;  \t\tv1 = v3 = center - thickness; \t\tv2 = v4 = center + thickness; \t\tv3.y = v4.y = pointTop.y = center.y + HexMetrics.wallHeight;  \/\/\t\twalls.AddQuadUnperturbed(v1, v2, v3, v4); \t\twalls.AddQuadUnperturbed(v1, point, v3, pointTop); \t\twalls.AddQuadUnperturbed(point, v2, pointTop, v4); \t\twalls.AddTriangleUnperturbed(pointTop, v3, v4); \t}<\/code><\/pre>\n<p>  \u0412 <code>AddWallSegment<\/code> \u0434\u043b\u044f \u0443\u0433\u043b\u043e\u0432 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0435\u043d\u0430 \u0438\u0434\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438 \u044d\u0442\u0430 \u0441\u0442\u0435\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u0435, \u0447\u0435\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c\u0441\u044f \u0441 \u0433\u0440\u0430\u043d\u044c\u044e \u043e\u0431\u0440\u044b\u0432\u0430.<\/p>\n<pre><code class=\"cs\">\t\tif (hasLeftWall) { \t\t\tif (hasRighWall) { \t\t\t\tAddWallSegment(pivot, left, pivot, right); \t\t\t} \t\t\telse if (leftCell.Elevation &lt; rightCell.Elevation) { \t\t\t\tAddWallWedge(pivot, left, right); \t\t\t} \t\t\telse { \t\t\t\tAddWallCap(pivot, left); \t\t\t} \t\t} \t\telse if (hasRighWall) { \t\t\tif (rightCell.Elevation &lt; leftCell.Elevation) { \t\t\t\tAddWallWedge(right, pivot, left); \t\t\t} \t\t\telse { \t\t\t\tAddWallCap(right, pivot); \t\t\t} \t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b5c\/30f\/33a\/b5c30f33ac93582e2ce319996d9ed1ac.png\"><\/div>\n<p>  <i>\u041a\u043b\u0438\u043d\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0441\u0442\u0435\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u043e\u0431\u0440\u044b\u0432\u0430\u043c\u0438.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-10\/avoiding-cliffs-and-water\/avoiding-cliffs-and-water.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h1>\u0427\u0430\u0441\u0442\u044c 11: \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043b\u044c\u0435\u0444\u0430<\/h1>\n<p>  <\/p>\n<ul>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u0441\u0442\u0435\u043d\u0430\u043c \u0431\u0430\u0448\u043d\u0438.<\/li>\n<li>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0434\u043e\u0440\u043e\u0433\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043a\u0438 \u043c\u043e\u0441\u0442\u0430\u043c\u0438.<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ef5\/a07\/5ea\/ef5a075ea4c14c810825388be274f817.jpg\"><\/div>\n<p>  <i>\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442.<\/i><\/p>\n<h2>\u0411\u0430\u0448\u043d\u0438 \u043d\u0430 \u0441\u0442\u0435\u043d\u0430\u0445<\/h2>\n<p>  \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u0442\u0435\u043d. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u0440\u044f\u043c\u044b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0435\u043d \u0431\u0435\u0437 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0442\u0435\u043d\u044b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a \u043d\u0438\u043c \u0431\u0430\u0448\u043d\u0438.<\/p>\n<p>  \u0414\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0440\u0435\u043b\u044c\u0435\u0444\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0435\u043d \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e. \u0414\u043b\u044f \u0431\u0430\u0448\u0435\u043d \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0430\u0431.<\/p>\n<p>  \u041f\u0440\u043e\u0441\u0442\u0443\u044e \u0431\u0430\u0448\u043d\u044e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0437 \u0434\u0432\u0443\u0445 \u043a\u0443\u0431\u043e\u0432 \u0441 \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c. \u041e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0430\u0448\u043d\u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 2 \u043d\u0430 2 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 4 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u0430 \u0442\u043e\u043b\u0449\u0435 \u0438 \u0432\u044b\u0448\u0435 \u0441\u0442\u0435\u043d\u044b. \u041d\u0430\u0434 \u044d\u0442\u0438\u043c \u043a\u0443\u0431\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u043a\u0443\u0431 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0445\u0443\u0448\u043a\u0443 \u0431\u0430\u0448\u043d\u0438. \u041a\u0430\u043a \u0438 \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0435\u0444\u0430\u0431\u0430\u043c, \u044d\u0442\u0438\u043c \u043a\u0443\u0431\u0430\u043c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0430\u0439\u0434\u0435\u0440\u044b.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0430\u0448\u043d\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u0438\u0445 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043a\u043e\u0440\u043d\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0430\u0448\u043d\u0438. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0431\u0430\u0448\u043d\u0438, \u043d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u044f\u0441\u044c \u043e\u0431 \u0438\u0445 \u0432\u044b\u0441\u043e\u0442\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2f1\/a54\/335\/2f1a54335d81a6682707e740107362c6.png\"><\/div>\n<p>  <i>\u041f\u0440\u0435\u0444\u0430\u0431 \u0431\u0430\u0448\u043d\u0438.<\/i><\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u0440\u0435\u0444\u0430\u0431 \u0432 <code>HexFeatureManager<\/code> \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0433\u043e.<\/p>\n<pre><code class=\"cs\">\tpublic Transform wallTower;<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f76\/df1\/c7e\/f76df1c7e5b1c808d2ae636f7e823487.png\"><\/div>\n<p>  <i>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0444\u0430\u0431 \u0431\u0430\u0448\u043d\u0438.<\/i><\/p>\n<h3>\u0421\u0442\u0440\u043e\u0438\u043c \u0431\u0430\u0448\u043d\u0438<\/h3>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0431\u0430\u0448\u0435\u043d \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0435\u043d\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u0430\u0448\u043d\u044e \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>AddWallSegment<\/code>. \u0415\u0451 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0438\u043c \u043e\u0442 \u043b\u0435\u0432\u043e\u0439 \u0438 \u043f\u0440\u0430\u0432\u043e\u0439 \u0442\u043e\u0447\u0435\u043a \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallSegment ( \t\tVector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight \t) { \t\t\u2026  \t\tTransform towerInstance = Instantiate(wallTower); \t\ttowerInstance.transform.localPosition = (left + right) * 0.5f; \t\ttowerInstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/559\/541\/487\/559541487b79dd6877b4456dbdf010b1.png\"><\/div>\n<p>  <i>\u041f\u043e \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0448\u043d\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u0442\u0435\u043d\u044b.<\/i><\/p>\n<p>  \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0448\u0435\u043d \u0432\u0434\u043e\u043b\u044c \u0441\u0442\u0435\u043d\u044b, \u043d\u043e \u0438\u0445 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0445 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u043e \u0441\u0442\u0435\u043d\u043e\u0439. \u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u0430\u0432\u0430\u044f \u0438 \u043b\u0435\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0438 \u0441\u0442\u0435\u043d\u044b, \u0442\u043e \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u044b\u043c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u0437\u043d\u0430\u043d\u0438\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0435\u043d\u044b, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0431\u0430\u0448\u043d\u0438.<\/p>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 <code>Transform.right<\/code> \u0432\u0435\u043a\u0442\u043e\u0440. \u041a\u043e\u0434 Unity \u0437\u0430\u0439\u043c\u0451\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 right \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0443.<\/p>\n<pre><code class=\"cs\">\t\tTransform towerInstance = Instantiate(wallTower); \t\ttowerInstance.transform.localPosition = (left + right) * 0.5f; \t\tVector3 rightDirection = right - left; \t\trightDirection.y = 0f; \t\ttowerInstance.transform.right = rightDirection; \t\ttowerInstance.SetParent(container, false);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5d3\/2c3\/777\/5d32c3777d5b63db90ddf9f8fbbf1dee.png\"><\/div>\n<p>  <i>\u0411\u0430\u0448\u043d\u0438 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u044b \u0441\u043e \u0441\u0442\u0435\u043d\u043e\u0439.<\/i><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 Transform.right?<\/b><\/p>\n<div class=\"spoiler_text\">\u0412 \u043d\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>Quaternion.FromToRotation<\/code> \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430. \u0412\u043e\u0442 \u043a\u043e\u0434 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<pre><code class=\"cs\">public Vector3 right { \tget { \t\treturn rotation * Vector3.right; \t} \tset { \t\trotation = Quaternion.FromToRotation(Vector3.right, value); \t} }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h3>\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0448\u0435\u043d<\/h3>\n<p>  \u041f\u043e \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0448\u043d\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u0442\u0435\u043d\u044b \u2014 \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0448\u043d\u0438 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 <code>AddWallSegment<\/code> \u0431\u0443\u043b\u0435\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440. \u0417\u0430\u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>false<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0431\u0430\u0448\u043d\u0438 \u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallSegment ( \t\tVector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight, \t\tbool addTower = false \t) { \t\t\u2026  \t\tif (addTower) { \t\t\tTransform towerInstance = Instantiate(wallTower); \t\t\ttowerInstance.transform.localPosition = (left + right) * 0.5f; \t\t\tVector3 rightDirection = right - left; \t\t\trightDirection.y = 0f; \t\t\ttowerInstance.transform.right = rightDirection; \t\t\ttowerInstance.SetParent(container, false); \t\t} \t}<\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0431\u0430\u0448\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0443\u0433\u043b\u0430\u0445 \u044f\u0447\u0435\u0435\u043a. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0448\u0435\u043d \u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438.<\/p>\n<pre><code class=\"cs\">\tvoid AddWallSegment ( \t\tVector3 pivot, HexCell pivotCell, \t\tVector3 left, HexCell leftCell, \t\tVector3 right, HexCell rightCell \t) { \t\t\u2026 \t\t\t\tAddWallSegment(pivot, left, pivot, right, true); \t\t\u2026 \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d60\/823\/d7b\/d60823d7b381eccaf5916bf2bc636061.png\"><\/div>\n<p>  <i>\u0411\u0430\u0448\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0443\u0433\u043b\u0430\u0445.<\/i><\/p>\n<p>  \u042d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u0435\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0431\u0430\u0448\u0435\u043d. \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0440\u0435\u043b\u044c\u0435\u0444\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0445\u0435\u0448\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0443\u0433\u043e\u043b \u0431\u0430\u0448\u043d\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u0443\u0433\u043b\u0430 \u0434\u043b\u044f \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0445\u0435\u0448\u0430 \u0441 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0431\u0430\u0448\u0435\u043d.<\/p>\n<pre><code class=\"cs\">\t\t\t\tHexHash hash = HexMetrics.SampleHashGrid( \t\t\t\t\t(pivot + left + right) * (1f \/ 3f) \t\t\t\t); \t\t\t\tbool hasTower = hash.e &lt; HexMetrics.wallTowerThreshold; \t\t\t\tAddWallSegment(pivot, left, pivot, right, hasTower);<\/code><\/pre>\n<p>  \u041f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a <code>HexMetrics<\/code>. \u041f\u0440\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 0.5 \u0431\u0430\u0448\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043e\u0434\u043d\u0430\u043a\u043e \u0443 \u043d\u0430\u0441 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0435\u043d\u044b \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0430\u0448\u0435\u043d \u0438\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u0431\u0435\u0437 \u043d\u0438\u0445.<\/p>\n<pre><code class=\"cs\">\tpublic const float wallTowerThreshold = 0.5f;<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b54\/40c\/f0f\/b5440cf0ffa4f615f2dcbf37532bbb0a.png\"><\/div>\n<p>  <i>\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0431\u0430\u0448\u043d\u0438.<\/i><\/p>\n<h3>\u0423\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u0430\u0448\u043d\u0438 \u0441\u043e \u0441\u043a\u043b\u043e\u043d\u043e\u0432<\/h3>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0431\u0430\u0448\u043d\u0438 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u043b\u044c\u0435\u0444\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u0441\u043a\u043b\u043e\u043d\u0430\u0445 \u0431\u0430\u0448\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0435\u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u0417\u0434\u0435\u0441\u044c \u0441\u0442\u0435\u043d\u044b \u0438\u0434\u0443\u0442 \u043f\u043e\u0434 \u0443\u0433\u043b\u043e\u043c \u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0440\u0435\u0437\u0430\u0442\u044c \u0432\u0435\u0440\u0445\u0443\u0448\u043a\u0443 \u0431\u0430\u0448\u043d\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/24c\/c5e\/2dd\/24cc5e2ddb97b83d14e0826bc64e3f20.png\"><\/div>\n<p>  <i>\u0411\u0430\u0448\u043d\u0438 \u043d\u0430 \u0441\u043a\u043b\u043e\u043d\u0430\u0445.<\/i><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0441\u043a\u043b\u043e\u043d\u043e\u0432, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043b\u0438 \u043f\u0440\u0430\u0432\u0430\u044f \u0438 \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u0443\u0433\u043b\u0430 \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u0435. \u0422\u043e\u043b\u044c\u043a\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0431\u0430\u0448\u043d\u0438.<\/p>\n<pre><code class=\"cs\">\t\t\t\tbool hasTower = false; \t\t\t\tif (leftCell.Elevation == rightCell.Elevation) { \t\t\t\t\tHexHash hash = HexMetrics.SampleHashGrid( \t\t\t\t\t\t(pivot + left + right) * (1f \/ 3f) \t\t\t\t\t); \t\t\t\t\thasTower = hash.e &lt; HexMetrics.wallTowerThreshold; \t\t\t\t} \t\t\t\tAddWallSegment(pivot, left, pivot, right, hasTower);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/770\/1b4\/fd9\/7701b4fd9d0a4952fce2a9e00bbb4571.png\"><\/div>\n<p>  <i>\u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0430 \u0441\u0442\u0435\u043d\u0430\u0445 \u0441\u043a\u043b\u043e\u043d\u043e\u0432 \u0431\u0430\u0448\u0435\u043d \u043d\u0435\u0442.<\/i><\/p>\n<h3>\u0421\u0442\u0430\u0432\u0438\u043c \u0441\u0442\u0435\u043d\u044b \u0438 \u0431\u0430\u0448\u043d\u0438 \u043d\u0430 \u0437\u0435\u043c\u043b\u044e<\/h3>\n<p>  \u0425\u043e\u0442\u044f \u043c\u044b \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u0441\u0442\u0435\u043d \u043d\u0430 \u0441\u043a\u043b\u043e\u043d\u0430\u0445, \u0440\u0435\u043b\u044c\u0435\u0444 \u0441 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0441\u0442\u0435\u043d\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u0443\u044e \u0432\u044b\u0441\u043e\u0442\u0443. \u0421\u0442\u0435\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0434\u0442\u0438 \u0432\u0434\u043e\u043b\u044c \u0443\u0441\u0442\u0443\u043f\u043e\u0432, \u0430 \u044f\u0447\u0435\u0439\u043a\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0430\u0448\u043d\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cd2\/4d8\/b10\/cd24d8b1012804af5d073c3901c874ad.png\"><\/div>\n<p>  <i>\u0411\u0430\u0448\u043d\u0438 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435.<\/i><\/p>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0431\u0430\u0448\u043d\u0438 \u043d\u0430 \u0441\u043a\u043b\u043e\u043d\u0430\u0445 \u0442\u043e\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0438\u0441\u0435\u0442\u044c \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u043a\u0430\u043a \u0434\u043b\u044f \u0431\u0430\u0448\u0435\u043d.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8b6\/ae3\/d24\/8b6ae3d2489f253ae1a78593af0abd6c.png\"><\/div>\n<p>  <i>\u0421\u0442\u0435\u043d\u044b \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435.<\/i><\/p>\n<p>  \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0432 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0435\u043d \u0438 \u0431\u0430\u0448\u0435\u043d \u0434\u043e \u0437\u0435\u043c\u043b\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e Y \u0434\u043b\u044f \u0441\u0442\u0435\u043d \u0432 <code>HexMetrics<\/code>. \u041d\u0430 \u043e\u0434\u043d\u0443 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u043d\u0438\u0437 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u0431\u0430\u0448\u0435\u043d \u043d\u0430 \u0442\u0443 \u0436\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443.<\/p>\n<pre><code class=\"cs\">\tpublic const float wallHeight = 4f; \t\t\t\t\t\t \tpublic const float wallYOffset = -1f;<\/code><\/pre>\n<p>  \u0418\u0437\u043c\u0435\u043d\u0438\u043c <code>HexMetrics.WallLerp<\/code> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b Y \u043e\u043d \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u043b \u043d\u043e\u0432\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cs\">\t\tpublic static Vector3 WallLerp (Vector3 near, Vector3 far) { \t\tnear.x += (far.x - near.x) * 0.5f; \t\tnear.z += (far.z - near.z) * 0.5f; \t\tfloat v = \t\t\tnear.y &lt; far.y ? wallElevationOffset : (1f - wallElevationOffset); \t\tnear.y += (far.y - near.y) * v + wallYOffset; \t\treturn near; \t}<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0430\u0431 \u0431\u0430\u0448\u043d\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u043d\u0438\u0436\u0435 \u0437\u0435\u043c\u043b\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u043a\u0443\u0431\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u0443\u0431\u043e\u0432.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f2d\/e4e\/503\/f2de4e50398fbae4ee296737dbe3a922.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ecd\/5d7\/0eb\/ecd5d70ebb620e3bae84f17aedb4a2a9.png\"><\/div>\n<p>  <i>\u0421\u0442\u0435\u043d\u044b \u0438 \u0431\u0430\u0448\u043d\u0438 \u043d\u0430 \u0437\u0435\u043c\u043b\u0435.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-11\/wall-towers\/wall-towers.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u041c\u043e\u0441\u0442\u044b<\/h2>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0435\u043a\u0438 \u0438 \u0434\u043e\u0440\u043e\u0433\u0438, \u043d\u043e \u0434\u043e\u0440\u043e\u0433\u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c \u0440\u0435\u043a\u0438. \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0441\u0442\u043e\u0432.<\/p>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u0442\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0443\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0433\u0440\u0430\u0442\u044c \u0440\u043e\u043b\u044c \u043f\u0440\u0435\u0444\u0430\u0431\u0430 \u043c\u043e\u0441\u0442\u0430. \u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u0435\u043a \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u0430\u043c\u0438 \u0434\u043e\u0440\u043e\u0433 \u0441 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u0435\u043c\u044c \u0435\u0434\u0438\u043d\u0438\u0446 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 (3, 1, 7). \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0440\u0435\u0444\u0430\u0431\u0443 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0433\u043e\u0440\u043e\u0434\u0441\u043a\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u0435\u0433\u043e \u043a\u043e\u043b\u043b\u0430\u0439\u0434\u0435\u0440\u0430. \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0431\u0430\u0448\u043d\u044f\u043c\u0438, \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u043a\u0443\u0431 \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u043c. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0441\u0430\u043c\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u043c\u043e\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0432\u0430\u0436\u043d\u0430.<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0440\u0435\u0444\u0430\u0431 \u043c\u043e\u0441\u0442\u0430 \u0432 <code>HexFeatureManager<\/code> \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043c \u0435\u0439 \u043f\u0440\u0435\u0444\u0430\u0431.<\/p>\n<pre><code class=\"cs\">\tpublic Transform wallTower, bridge;<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/808\/ac6\/dc5\/808ac6dc523d16d2005da48dcf4d1f65.png\"><\/div>\n<p>  <i>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0430\u0431 \u043c\u043e\u0441\u0442\u0430.<\/i><\/p>\n<h3>\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043c\u043e\u0441\u0442\u043e\u0432<\/h3>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u043e\u0441\u0442, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>HexFeatureManager.AddBridge<\/code>. \u041c\u043e\u0441\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u0440\u0435\u043a\u0438 \u0438 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d \u0440\u0435\u043a\u0438.<\/p>\n<pre><code class=\"cs\">\tpublic void AddBridge (Vector3 roadCenter1, Vector3 roadCenter2) { \t\tTransform instance = Instantiate(bridge); \t\tinstance.localPosition = (roadCenter1 + roadCenter2) * 0.5f; \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u0435 \u0446\u0435\u043d\u0442\u0440\u044b \u0434\u043e\u0440\u043e\u0433, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u0441\u043a\u0430\u0437\u0438\u0442\u044c \u0438\u0445 \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0441\u0442\u0430.<\/p>\n<pre><code class=\"cs\">\t\troadCenter1 = HexMetrics.Perturb(roadCenter1); \t\troadCenter2 = HexMetrics.Perturb(roadCenter2); \t\tTransform instance = Instantiate(bridge);<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0441\u0442\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u0431\u0430\u0448\u0435\u043d. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0446\u0435\u043d\u0442\u0440\u044b \u0434\u043e\u0440\u043e\u0433 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 forward \u043c\u043e\u0441\u0442\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043e\u0441\u0442\u0430\u0451\u043c\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438, \u044d\u0442\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u0443\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Y.<\/p>\n<pre><code class=\"cs\">\t\tTransform instance = Instantiate(bridge); \t\tinstance.localPosition = (roadCenter1 + roadCenter2) * 0.5f; \t\tinstance.forward = roadCenter2 - roadCenter1; \t\tinstance.SetParent(container, false);<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u0440\u043e\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0441\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u044f\u043c\u044b\u0435 \u0440\u0435\u043a\u0438<\/h3>\n<p>  \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043c\u043e\u0441\u0442\u044b \u2014 \u043f\u0440\u044f\u043c\u044b\u0435 \u0438 \u0438\u0441\u043a\u0440\u0438\u0432\u043b\u0451\u043d\u043d\u044b\u0435. \u0414\u043e\u0440\u043e\u0433\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438, \u0430 \u0443 \u0437\u0438\u0433\u0437\u0430\u0433\u043e\u0432 \u0434\u043e\u0440\u043e\u0433\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u044f\u0434\u043e\u043c.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441 \u043f\u0440\u044f\u043c\u044b\u043c\u0438 \u0440\u0435\u043a\u0430\u043c\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 <code>HexGridChunk.TriangulateRoadAdjacentToRiver<\/code> \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>else if<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u0434\u043e\u0440\u043e\u0433 \u043f\u043e \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0440\u0435\u043a\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043e\u0441\u0442\u044b.<\/p>\n<p>  \u041c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0440\u0435\u043a\u0438. \u0426\u0435\u043d\u0442\u0440 \u0434\u043e\u0440\u043e\u0433\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0440\u0435\u043a\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u0430\u043c \u0446\u0435\u043d\u0442\u0440 \u044f\u0447\u0435\u0439\u043a\u0438. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0446\u0435\u043d\u0442\u0440 \u0434\u043e\u0440\u043e\u0433\u0438 \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0442\u0443 \u0436\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u0430\u043c\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateRoadAdjacentToRiver ( \t\tHexDirection direction, HexCell cell, Vector3 center, EdgeVertices e \t) { \t\t\u2026 \t\telse if (cell.IncomingRiver == cell.OutgoingRiver.Opposite()) { \t\t\t\u2026 \t\t\troadCenter += corner * 0.5f; \t\t\tfeatures.AddBridge(roadCenter, center - corner * 0.5f); \t\t\tcenter += corner * 0.25f; \t\t} \t\t\u2026 \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/97c\/c7f\/420\/97cc7f42004ba86c6cd0333af352f24b.png\"><\/div>\n<p>  \u041c\u043e\u0441\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u044f\u043c\u044b\u0435 \u0440\u0435\u043a\u0438.<\/p>\n<p>  \u041c\u043e\u0441\u0442\u044b \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c! \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0443 \u043c\u043e\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u0442\u0435\u0447\u0451\u0442 \u0440\u0435\u043a\u0430. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0441\u0442\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u0432 \u043e\u0434\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u0438 \u0438 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0441\u0442. \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043b\u044e\u0431\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cs\">\t\t\troadCenter += corner * 0.5f; \t\t\tif (cell.IncomingRiver == direction.Next()) { \t\t\t\tfeatures.AddBridge(roadCenter, center - corner * 0.5f); \t\t\t} \t\t\tcenter += corner * 0.25f;<\/code><\/pre>\n<p>  \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043e\u0441\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0440\u043e\u0433\u0430 \u0435\u0441\u0442\u044c \u043f\u043e \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0440\u0435\u043a\u0438. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u0443\u0436\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0435\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0434\u043e\u0440\u043e\u0433\u0430 \u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0440\u0435\u043a\u0438.<\/p>\n<pre><code class=\"cs\">\t\t\tif (cell.IncomingRiver == direction.Next() &amp;&amp; ( \t\t\t\tcell.HasRoadThroughEdge(direction.Next2()) || \t\t\t\tcell.HasRoadThroughEdge(direction.Opposite()) \t\t\t)) { \t\t\t\tfeatures.AddBridge(roadCenter, center - corner * 0.5f); \t\t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/635\/a47\/978\/635a4797816f9f35297f67224a0ec449.png\"><\/div>\n<p>  <i>\u041c\u043e\u0441\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0434\u043e\u0440\u043e\u0433\u0430\u043c\u0438 \u043f\u043e \u043e\u0431\u0435\u0438\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u043c.<\/i><\/p>\n<h3>\u041c\u043e\u0441\u0442\u044b \u043d\u0430\u0434 \u0438\u0441\u043a\u0440\u0438\u0432\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u043a\u0430\u043c\u0438<\/h3>\n<p>  \u041c\u043e\u0441\u0442\u044b \u043d\u0430\u0434 \u0438\u0441\u043a\u0440\u0438\u0432\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u043a\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043d\u043e \u0438\u0445 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u043b\u0435\u0433\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043e\u0441\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u0440\u0438\u0432\u043e\u0439. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0431\u043b\u043e\u043a\u0435 <code>else<\/code>. \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u0430 \u0434\u043e\u0440\u043e\u0433\u0438. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0432\u0430\u0436\u0434\u044b \u0441 \u0440\u0430\u0437\u043d\u044b\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<\/p>\n<pre><code class=\"cs\">\tvoid TriangulateRoadAdjacentToRiver ( \t\tHexDirection direction, HexCell cell, Vector3 center, EdgeVertices e \t) { \t\t\u2026 \t\telse { \t\t\tHexDirection middle; \t\t\tif (previousHasRiver) { \t\t\t\tmiddle = direction.Next(); \t\t\t} \t\t\telse if (nextHasRiver) { \t\t\t\tmiddle = direction.Previous(); \t\t\t} \t\t\telse { \t\t\t\tmiddle = direction; \t\t\t} \t\t\tif ( \t\t\t\t!cell.HasRoadThroughEdge(middle) &amp;&amp; \t\t\t\t!cell.HasRoadThroughEdge(middle.Previous()) &amp;&amp; \t\t\t\t!cell.HasRoadThroughEdge(middle.Next()) \t\t\t) { \t\t\t\treturn; \t\t\t} \t\t\tVector3 offset = HexMetrics.GetSolidEdgeMiddle(middle); \t\t\troadCenter += offset * 0.25f; \t\t}  \t\t\u2026 \t}<\/code><\/pre>\n<p>  \u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u0440\u0438\u0432\u043e\u0439 \u0440\u0430\u0432\u0435\u043d 0.25, \u0430 \u0432\u043d\u0443\u0442\u0440\u0438 <code>HexMetrics.innerToOuter * 0.7f<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u0441\u0442\u0430.<\/p>\n<pre><code class=\"cs\">\t\t\tVector3 offset = HexMetrics.GetSolidEdgeMiddle(middle); \t\t\troadCenter += offset * 0.25f; \t\t\tfeatures.AddBridge( \t\t\t\troadCenter, \t\t\t\tcenter - offset * (HexMetrics.innerToOuter * 0.7f) \t\t\t);<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/612\/f9e\/da9\/612f9eda9f9e4cd31ba20dfe2db7687b.png\"><\/div>\n<p>  <i>\u041c\u043e\u0441\u0442\u044b \u043d\u0430\u0434 \u0438\u0441\u043a\u0440\u0438\u0432\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u043a\u0430\u043c\u0438.<\/i><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u0441\u043d\u043e\u0432\u0430 \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432 \u043c\u043e\u0441\u0442\u043e\u0432. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043c\u043e\u0441\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cs\">\t\t\tVector3 offset = HexMetrics.GetSolidEdgeMiddle(middle); \t\t\troadCenter += offset * 0.25f; \t\t\tif (direction == middle) { \t\t\t\tfeatures.AddBridge( \t\t\t\t\troadCenter, \t\t\t\t\tcenter - offset * (HexMetrics.innerToOuter * 0.7f) \t\t\t\t); \t\t\t}<\/code><\/pre>\n<p>  \u0418 \u043e\u043f\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0434\u043e\u0440\u043e\u0433\u0430 \u0435\u0441\u0442\u044c \u0438 \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435.<\/p>\n<pre><code class=\"cs\">\t\t\tif ( \t\t\t\tdirection == middle &amp;&amp; \t\t\t\tcell.HasRoadThroughEdge(direction.Opposite()) \t\t\t) { \t\t\t\tfeatures.AddBridge( \t\t\t\t\troadCenter, \t\t\t\t\tcenter - offset * (HexMetrics.innerToOuter * 0.7f) \t\t\t\t); \t\t\t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/744\/33c\/275\/74433c2750e413c44d17139982ecff3b.png\"><\/div>\n<p>  <i>\u041c\u043e\u0441\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0434\u043e\u0440\u043e\u0433\u0430\u043c\u0438 \u043f\u043e \u043e\u0431\u0435\u0438\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u043c.<\/i><\/p>\n<h3>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0441\u0442\u043e\u0432<\/h3>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043a\u0430\u0436\u0430\u0435\u043c \u0440\u0435\u043b\u044c\u0435\u0444, \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u0430\u043c\u0438 \u0434\u043e\u0440\u043e\u0433 \u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u043c\u0438 \u0440\u0435\u043a\u0438 \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0418\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0441\u0442\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435, \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u044b\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/770\/f2c\/e53\/770f2ce537ab16628c799eceb6ca4ad7.png\"><\/div>\n<p>  <i>\u0412\u0430\u0440\u044c\u0438\u0440\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043d\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u043c\u043e\u0441\u0442\u043e\u0432.<\/i><\/p>\n<p>  \u0425\u043e\u0442\u044f \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u043e\u0441\u0442 \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u0441\u0435\u043c\u044c \u0435\u0434\u0438\u043d\u0438\u0446, \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u0430\u043c\u0438 \u0434\u043e\u0440\u043e\u0433. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0441\u0442\u0430 \u0434\u0435\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0422\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e, \u0434\u0435\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0439, \u0447\u0435\u043c \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u043e\u0441\u0442\u044b.<\/p>\n<p>  \u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u043f\u0440\u0435\u0444\u0430\u0431\u0430 \u043c\u043e\u0441\u0442\u0430. \u0411\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0434\u043b\u0438\u043d\u0443 \u0432 <code>HexMetrics<\/code>.<\/p>\n<pre><code class=\"cs\">\tpublic const float bridgeDesignLength = 7f;<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443 \u043f\u043e Z \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043c\u043e\u0441\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u0430\u043c\u0438 \u0434\u043e\u0440\u043e\u0433, \u043f\u043e\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443. \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u0435\u0444\u0430\u0431\u0430 \u043c\u043e\u0441\u0442\u0430 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431, \u043c\u043e\u0441\u0442 \u0440\u0430\u0441\u0442\u044f\u043d\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<pre><code class=\"cs\">\tpublic void AddBridge (Vector3 roadCenter1, Vector3 roadCenter2) { \t\troadCenter1 = HexMetrics.Perturb(roadCenter1); \t\troadCenter2 = HexMetrics.Perturb(roadCenter2); \t\tTransform instance = Instantiate(bridge); \t\tinstance.localPosition = (roadCenter1 + roadCenter2) * 0.5f; \t\tinstance.forward = roadCenter2 - roadCenter1; \t\tfloat length = Vector3.Distance(roadCenter1, roadCenter2); \t\tinstance.localScale = new Vector3( \t\t\t1f,\t1f, length * (1f \/ HexMetrics.bridgeDesignLength) \t\t); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/21e\/b73\/49c\/21eb7349c5e7ae6d5480b2e61d19e046.png\"><\/div>\n<p>  \u0418\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0430\u044f\u0441\u044f \u0434\u043b\u0438\u043d\u0430 \u043c\u043e\u0441\u0442\u043e\u0432.<\/p>\n<h3>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u043e\u0441\u0442\u0430<\/h3>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a\u0443\u0431\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0441\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u0440\u0443\u0431\u044b\u0439 \u0430\u0440\u043e\u0447\u043d\u044b\u0439 \u043c\u043e\u0441\u0442 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043e\u0442\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0445 \u043a\u0443\u0431\u043e\u0432. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 3D-\u043c\u043e\u0434\u0435\u043b\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0441 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u0434\u043e\u0440\u043e\u0433\u0438. \u041d\u043e \u0443\u0447\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0436\u0430\u0442 \u0438 \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/eee\/83f\/3b6\/eee83f3b67cf879abe3114117614af08.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8a9\/741\/f7f\/8a9741f7f024aa8914e29b12c1ae9d94.png\"><\/div>\n<p>  <i>\u0410\u0440\u043e\u0447\u043d\u044b\u0435 \u043c\u043e\u0441\u0442\u044b \u0440\u0430\u0437\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b.<\/i><\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-11\/bridges\/bridges.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/p>\n<h2>\u041e\u0441\u043e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/h2>\n<p>  \u041f\u043e\u043a\u0430 \u043d\u0430\u0448\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0438\u0435, \u0441\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438 \u0440\u0430\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0414\u0430\u0436\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0443\u0440\u043e\u0432\u043d\u044f, \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u044b \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u044f\u0447\u0435\u0439\u043a\u0438. \u0427\u0442\u043e, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0437\u0434\u0430\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043c\u043e\u043a?<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u0440\u0435\u043b\u044c\u0435\u0444\u0443 \u043e\u0441\u043e\u0431\u044b\u0439 \u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0422\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043b\u0438\u043a\u0438, \u0447\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0432\u0441\u044e \u044f\u0447\u0435\u0439\u043a\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d \u0438 \u0435\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0430\u0431. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u043c\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0443\u0431\u0430 \u043f\u043b\u044e\u0441 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0431\u0430\u0448\u0435\u043d. \u041c\u0430\u0441\u0448\u0442\u0430\u0431 (6, 4, 6) \u0434\u043b\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0443\u0431\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u0430\u043c\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u0432 \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u0435\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7e1\/9bf\/0dc\/7e19bf0dc5f1568bf4b21ec467ba9063.png\"><\/div>\n<p>  <i>\u041f\u0440\u0435\u0444\u0430\u0431 \u0437\u0430\u043c\u043a\u0430.<\/i><\/p>\n<p>  \u0415\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0438\u043a\u043a\u0443\u0440\u0430\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430 \u043a\u0443\u0431\u043e\u0432. \u0414\u043b\u044f \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u043a\u0443\u0431\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 (8, 2.5, 8).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1ad\/7d3\/291\/1ad7d3291224358562b3472f528973a1.png\"><\/div>\n<p>  <i>\u041f\u0440\u0435\u0444\u0430\u0431 \u0437\u0438\u043a\u043a\u0443\u0440\u0430\u0442\u0430.<\/i><\/p>\n<p>  \u041e\u0441\u043e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c\u0438, \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0440\u0443\u043f\u043f\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432\u044b\u0441\u043e\u0442\u043e\u0439 \u0434\u043e \u0434\u0435\u0441\u044f\u0442\u0438 \u0435\u0434\u0438\u043d\u0438\u0446 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0443, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0443\u044e \u043c\u0435\u0433\u0430\u0444\u043b\u043e\u0440\u043e\u0439.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1bb\/e91\/907\/1bbe91907deba70f6ab9d02cd13de795.png\"><\/div>\n<p>  <i>\u041f\u0440\u0435\u0444\u0430\u0431 \u043c\u0435\u0433\u0430\u0444\u043b\u043e\u0440\u044b.<\/i><\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>HexFeatureManager<\/code> \u043c\u0430\u0441\u0441\u0438\u0432, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u0435\u0444\u0430\u0431\u044b.<\/p>\n<pre><code class=\"cs\">\tpublic Transform[] special;<\/code><\/pre>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430\u043c\u043e\u043a, \u0437\u0430\u0442\u0435\u043c \u0437\u0438\u043a\u043a\u0443\u0440\u0430\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c \u043c\u0435\u0433\u0430\u0444\u043b\u043e\u0440\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bbc\/2e3\/e94\/bbc2e3e949b25efc800a8f2e799490c7.png\"><\/div>\n<p>  <i>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/i><\/p>\n<h3>\u0414\u0435\u043b\u0430\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0438 \u043e\u0441\u043e\u0431\u044b\u043c\u0438<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f <code>HexCell<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u0442\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<pre><code class=\"cs\">\tint specialIndex;<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0440\u0435\u043b\u044c\u0435\u0444\u0430, \u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cs\">\tpublic int SpecialIndex { \t\tget { \t\t\treturn specialIndex; \t\t} \t\tset { \t\t\tif (specialIndex != value) { \t\t\t\tspecialIndex = value; \t\t\t\tRefreshSelfOnly(); \t\t\t} \t\t} \t}<\/code><\/pre>\n<p>  \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041c\u044b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 0. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043e\u0441\u043e\u0431\u043e\u0439.<\/p>\n<pre><code class=\"cs\">\tpublic bool IsSpecial { \t\tget { \t\t\treturn specialIndex &gt; 0; \t\t} \t}<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f\u0447\u0435\u0435\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 <code>HexMapEditor<\/code>. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0438\u0445, \u0441\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438 \u0440\u0430\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"cs\">\tint activeUrbanLevel, activeFarmLevel, activePlantLevel, activeSpecialIndex;  \t\u2026  \tbool applyUrbanLevel, applyFarmLevel, applyPlantLevel, applySpecialIndex; \t \t\u2026 \t \tpublic void SetApplySpecialIndex (bool toggle) { \t\tapplySpecialIndex = toggle; \t}  \tpublic void SetSpecialIndex (float index) { \t\tactiveSpecialIndex = (int)index; \t} \t \t\u2026 \t \tvoid EditCell (HexCell cell) { \t\tif (cell) { \t\t\tif (applyColor) { \t\t\t\tcell.Color = activeColor; \t\t\t} \t\t\tif (applyElevation) { \t\t\t\tcell.Elevation = activeElevation; \t\t\t} \t\t\tif (applyWaterLevel) { \t\t\t\tcell.WaterLevel = activeWaterLevel; \t\t\t} \t\t\tif (applySpecialIndex) { \t\t\t\tcell.SpecialIndex = activeSpecialIndex; \t\t\t} \t\t\tif (applyUrbanLevel) { \t\t\t\tcell.UrbanLevel = activeUrbanLevel; \t\t\t} \t\t\t\u2026 \t\t} \t}<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 UI \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u043e\u0431\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u0442\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b 0\u20133. \u041d\u043e\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043e\u0434\u0438\u043d \u2014 \u0437\u0430\u043c\u043e\u043a, \u0434\u0432\u0430 \u2014 \u0437\u0438\u043a\u043a\u0443\u0440\u0430\u0442, \u0442\u0440\u0438 \u2014 \u043c\u0435\u0433\u0430\u0444\u043b\u043e\u0440\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ab4\/2ea\/9bf\/ab42ea9bf68565a294f4ded5d2d7ebf0.png\"><\/div>\n<p>  <i>\u041f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/i><\/p>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0430\u043c \u043e\u0441\u043e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0427\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 <code>HexFeatureManager<\/code> \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434. \u041e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u043d\u0443\u0436\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u043e\u043b\u044c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0447\u0435\u0441\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0438\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u044f\u0447\u0435\u0439\u043a\u0438 \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u043f\u0440\u0435\u0444\u0430\u0431\u043e\u0432.<\/p>\n<pre><code class=\"cs\">\tpublic void AddSpecialFeature (HexCell cell, Vector3 position) { \t\tTransform instance = Instantiate(special[cell.SpecialIndex - 1]); \t\tinstance.localPosition = HexMetrics.Perturb(position); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0445\u0435\u0448\u0435\u0439.<\/p>\n<pre><code class=\"cs\">\tpublic void AddSpecialFeature (HexCell cell, Vector3 position) { \t\tTransform instance = Instantiate(special[cell.SpecialIndex - 1]); \t\tinstance.localPosition = HexMetrics.Perturb(position); \t\tHexHash hash = HexMetrics.SampleHashGrid(position); \t\tinstance.localRotation = Quaternion.Euler(0f, 360f * hash.e, 0f); \t\tinstance.SetParent(container, false); \t}<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 <code>HexGridChunk.Triangulate<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043e\u0441\u043e\u0431\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a <code>AddFeature<\/code>.<\/p>\n<pre><code class=\"cs\">\tvoid Triangulate (HexCell cell) { \t\tfor (HexDirection d = HexDirection.NE; d &lt;= HexDirection.NW; d++) { \t\t\tTriangulate(d, cell); \t\t} \t\tif (!cell.IsUnderwater &amp;&amp; !cell.HasRiver &amp;&amp; !cell.HasRoads) { \t\t\tfeatures.AddFeature(cell, cell.Position); \t\t} \t\tif (cell.IsSpecial) { \t\t\tfeatures.AddSpecialFeature(cell, cell.Position); \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b69\/242\/657\/b692426576e292bbdc9ed0752624db51.png\"><\/div>\n<p>  <i>\u041e\u0441\u043e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041e\u043d\u0438 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0445.<\/i><\/p>\n<h3>\u0418\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u0440\u0435\u043a<\/h3>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0441\u043e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0430\u0445 \u044f\u0447\u0435\u0435\u043a, \u043e\u043d\u0438 \u043d\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0442\u0441\u044f \u0441 \u0440\u0435\u043a\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0441\u0435\u0442\u044c \u043d\u0430\u0434 \u043d\u0438\u043c\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a51\/92f\/cc2\/a5192fcc2c5718f33bafc631f60a07a8.png\"><\/div>\n<p>  <i>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0440\u0435\u043a\u0430\u0445.<\/i><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043e\u0441\u043e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u0440\u0435\u043a, \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>HexCell.SpecialIndex<\/code>. \u0411\u0443\u0434\u0435\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u043d\u0435\u0442 \u0440\u0435\u043a.<\/p>\n<pre><code class=\"cs\">\tpublic int SpecialIndex { \t\t\u2026 \t\tset { \t\t\tif (specialIndex != value &amp;&amp; !HasRiver) { \t\t\t\tspecialIndex = value; \t\t\t\tRefreshSelfOnly(); \t\t\t} \t\t} \t}<\/code><\/pre>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0440\u0435\u043a\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u0441\u0435\u0445 \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0420\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043c\u044b\u0432\u0430\u0442\u044c \u0438\u0445. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>HexCell.SetOutgoingRiver<\/code> \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0.<\/p>\n<pre><code class=\"cs\">\tpublic void SetOutgoingRiver (HexDirection direction) { \t\t\u2026 \t\thasOutgoingRiver = true; \t\toutgoingRiver = direction; \t\tspecialIndex = 0;  \t\tneighbor.RemoveIncomingRiver(); \t\tneighbor.hasIncomingRiver = true; \t\tneighbor.incomingRiver = direction.Opposite(); \t\tneighbor.specialIndex = 0;  \t\tSetRoad((int)direction, false); \t}<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0418\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u0434\u043e\u0440\u043e\u0433<\/h3>\n<p>  \u041a\u0430\u043a \u0438 \u0440\u0435\u043a\u0438, \u0434\u043e\u0440\u043e\u0433\u0438 \u0442\u043e\u0436\u0435 \u043f\u043b\u043e\u0445\u043e \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0442\u0441\u044f \u0441 \u043e\u0441\u043e\u0431\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0443\u0436\u0430\u0441\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438 \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b \u0441 \u0434\u043e\u0440\u043e\u0433\u0430\u043c\u0438, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u043c\u0438 \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041d\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0449\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b3b\/ebf\/939\/b3bebf9399ed016e8d79a4c1ee53ace8.png\"><\/div>\n<p>  <i>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0430\u0445.<\/i><\/p>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0443\u0441\u0442\u044c \u043e\u0441\u043e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u044e\u0442 \u0434\u043e\u0440\u043e\u0433\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043e\u0441\u043e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438\u0437 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432\u0441\u0435 \u0434\u043e\u0440\u043e\u0433\u0438.<\/p>\n<pre><code class=\"cs\">\tpublic int SpecialIndex { \t\t\u2026 \t\tset { \t\t\tif (specialIndex != value &amp;&amp; !HasRiver) { \t\t\t\tspecialIndex = value; \t\t\t\tRemoveRoads(); \t\t\t\tRefreshSelfOnly(); \t\t\t} \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0427\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0434\u0430\u043b\u0438\u043c \u043e\u0441\u043e\u0431\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442?<\/b><\/p>\n<div class=\"spoiler_text\">\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u0441\u043e\u0431\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0435\u0439 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u0440\u043e\u0433 \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/div>\n<\/div>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u0440\u043e\u0433 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044f\u0447\u0435\u0439\u043a\u043e\u0439 \u0441 \u043e\u0441\u043e\u0431\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c.<\/p>\n<pre><code class=\"cs\">\tpublic void AddRoad (HexDirection direction) { \t\tif ( \t\t\t!roads[(int)direction] &amp;&amp; !HasRiverThroughEdge(direction) &amp;&amp; \t\t\t!IsSpecial &amp;&amp; !GetNeighbor(direction).IsSpecial &amp;&amp; \t\t\tGetElevationDifference(direction) &lt;= 1 \t\t) { \t\t\tSetRoad((int)direction, true); \t\t} \t}<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0418\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h3>\n<p>  \u041e\u0441\u043e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0430\u043b\u043e\u0436\u0430\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430, \u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u043f\u0440\u044f\u0442\u043d\u043e. \u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043d\u043e \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/03b\/7f1\/8fc\/03b7f18fc9f9d7543bdb0d9c24a074e2.png\"><\/div>\n<p>  <i>\u041e\u0431\u044a\u0435\u043a\u0442, \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438.<\/i><\/p>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043e\u043d\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 <code>HexFeatureManager.AddFeature<\/code>.<\/p>\n<pre><code class=\"cs\">\tpublic void AddFeature (HexCell cell, Vector3 position) { \t\tif (cell.IsSpecial) { \t\t\treturn; \t\t}  \t\t\u2026 \t}<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0418\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u0432\u043e\u0434\u0443<\/h3>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0432\u043e\u0434\u043e\u0439. \u0411\u0443\u0434\u0443\u0442 \u043b\u0438 \u043e\u0441\u043e\u0431\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u0442\u043e\u043f\u043b\u0435\u043d\u0438\u0438? \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u043c \u043c\u0435\u043b\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0437\u0430\u0442\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u044f\u0447\u0435\u0439\u043a\u0430\u0445, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441 \u043e\u0441\u043e\u0431\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8d9\/479\/e79\/8d9479e79cb0555c81f562dc32937552.png\"><\/div>\n<p>  <i>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0432\u043e\u0434\u0435.<\/i><\/p>\n<p>  \u0412 <code>HexGridChunk.Triangulate<\/code> \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0437\u0430\u0442\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u0434\u043b\u044f \u043e\u0441\u043e\u0431\u044b\u0445, \u0438 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"cs\">\tvoid Triangulate (HexCell cell) { \t\tfor (HexDirection d = HexDirection.NE; d &lt;= HexDirection.NW; d++) { \t\t\tTriangulate(d, cell); \t\t} \t\tif (!cell.IsUnderwater &amp;&amp; !cell.HasRiver &amp;&amp; !cell.HasRoads) { \t\t\tfeatures.AddFeature(cell, cell.Position); \t\t} \t\tif (!cell.IsUnderwater &amp;&amp; cell.IsSpecial) { \t\t\tfeatures.AddSpecialFeature(cell, cell.Position); \t\t} \t}<\/code><\/pre>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code>if<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0435\u0451 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<pre><code class=\"cs\">\tvoid Triangulate (HexCell cell) { \t\tfor (HexDirection d = HexDirection.NE; d &lt;= HexDirection.NW; d++) { \t\t\tTriangulate(d, cell); \t\t} \t\tif (!cell.IsUnderwater) { \t\t\tif (!cell.HasRiver &amp;&amp; !cell.HasRoads) { \t\t\t\tfeatures.AddFeature(cell, cell.Position); \t\t\t} \t\t\tif (cell.IsSpecial) { \t\t\t\tfeatures.AddSpecialFeature(cell, cell.Position); \t\t\t} \t\t} \t}<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>  <a href=\"https:\/\/catlikecoding.com\/unity\/tutorials\/hex-map\/part-11\/special-features\/special-features.unitypackage\" rel=\"nofollow\">unitypackage<\/a><\/div>\n<p>        <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/post\/425463\/\"> https:\/\/habr.com\/post\/425463\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\"><a href=\"https:\/\/habr.com\/post\/424257\/\">\u0427\u0430\u0441\u0442\u0438 1-3: \u0441\u0435\u0442\u043a\u0430, \u0446\u0432\u0435\u0442\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u044b \u044f\u0447\u0435\u0435\u043a.<\/a><\/p>\n<p>  <a href=\"https:\/\/habr.com\/post\/424491\/\">\u0427\u0430\u0441\u0442\u0438 4-7: \u043d\u0435\u0440\u043e\u0432\u043d\u043e\u0441\u0442\u0438, \u0440\u0435\u043a\u0438 \u0438 \u0434\u043e\u0440\u043e\u0433\u0438.<\/a><\/p>\n<h1>\u0427\u0430\u0441\u0442\u044c 8: \u0432\u043e\u0434\u0430<\/h1>\n<p>  <\/p>\n<ul>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432\u043e\u0434\u0443.<\/li>\n<li>\u0422\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0434\u044b.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0440\u0438\u0431\u043e\u0439 \u0441 \u043f\u0435\u043d\u043e\u0439.<\/li>\n<li>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u043e\u0434\u0443 \u0438 \u0440\u0435\u043a\u0438.<\/li>\n<\/ul>\n<p>  \u041c\u044b \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u0435\u043a, \u0430 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0432\u043e\u0434\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2a9\/73c\/b6e\/2a973cb6eb97eba7d04a325f3ac89a3e.jpg\"><\/div>\n<p>  <i>\u0412\u043e\u0434\u0430 \u043f\u0440\u0438\u0431\u044b\u0432\u0430\u0435\u0442.<\/i>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-290692","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/290692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=290692"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/290692\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=290692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=290692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=290692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}