{"id":273581,"date":"2016-02-04T16:03:02","date_gmt":"2016-02-04T13:03:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=273581"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=273581","title":{"rendered":"\u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u0430\u0440\u0442\u044b \u043c\u0438\u0440\u0430 \u043d\u0430 Unity C#, \u0447\u0430\u0441\u0442\u044c 4 (\u0442\u0440\u0430\u0444\u0438\u043a)"},"content":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b82\/7d0\/bc3\/b827d0bc3650436b985c103dc5dbc539.png\" alt=\"image\"\/><\/p>\n<p>  \u042d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Unity \u0438 C# \u043a\u0430\u0440\u0442\u0430\u0445 \u043c\u0438\u0440\u0430. <i>\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c 7 \u041c\u0411 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a.<\/i><br \/>  <a name=\"habracut\"><\/a><br \/>  <b>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b><\/p>\n<p>  <a href=\"https:\/\/habrahabr.ru\/post\/276251\/\">\u0427\u0430\u0441\u0442\u044c 1<\/a>:<\/p>\n<p>  \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<br \/>  \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0443\u043c\u0430<br \/>  \u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b<br \/>  \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0432\u044b\u0441\u043e\u0442<\/p>\n<p>  <a href=\"https:\/\/habrahabr.ru\/post\/276281\/\">\u0427\u0430\u0441\u0442\u044c 2<\/a>:<\/p>\n<p>  \u0421\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043e\u0441\u0438<br \/>  \u0421\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u043e\u0431\u0435\u0438\u0445 \u043e\u0441\u044f\u0445<br \/>  \u041f\u043e\u0438\u0441\u043a \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<br \/>  \u0411\u0438\u0442\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u043a\u0438<br \/>  \u0417\u0430\u043b\u0438\u0432\u043a\u0430<\/p>\n<p>  <a href=\"https:\/\/habrahabr.ru\/post\/276533\/\">\u0427\u0430\u0441\u0442\u044c 3<\/a>:<\/p>\n<p>  \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043f\u043b\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b<br \/>  \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438<br \/>  \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043a<\/p>\n<p>  \u0427\u0430\u0441\u0442\u044c 4 (\u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f):<\/p>\n<p>  \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u043e\u043c\u043e\u0432<br \/>  \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u0430\u0440\u0442<\/p>\n<p>  <b>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u043e\u043c\u043e\u0432<\/b><\/p>\n<p>  \u0411\u0438\u043e\u043c\u044b \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0437\u0435\u043c\u043d\u043e\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u0448 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0438\u043e\u043c\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0423\u0438\u0442\u0442\u0435\u043a\u0435\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0438\u043e\u043c\u044b \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043e\u0441\u0430\u0434\u043a\u043e\u0432 \u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0435. \u041c\u044b \u0443\u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0442\u0435\u043f\u043b\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u0438 \u043a\u0430\u0440\u0442\u0443 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u0438\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u043e\u043c\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u0421\u0445\u0435\u043c\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0423\u0438\u0442\u0442\u0435\u043a\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c5c\/429\/528\/c5c42952847e4046a1494c3e898cb7df.jpg\" alt=\"image\"\/><\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0431\u0438\u043e\u043c\u043e\u0432 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0435 \u0438 \u0443\u0440\u043e\u0432\u043d\u044e \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u043e\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438 \u0442\u0438\u043f\u044b \u0431\u0438\u043e\u043c\u043e\u0432:<\/p>\n<pre><code class=\"cs\">public enum BiomeType {     Desert,     Savanna,     TropicalRainforest,     Grassland,     Woodland,     SeasonalForest,     TemperateRainforest,     BorealForest,     Tundra,     Ice } <\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0431\u0438\u043e\u043c\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438. \u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c HeatType \u0438 MoistureType. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 6 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u0414\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u043e \u0441\u0445\u0435\u043c\u043e\u0439 \u0423\u0438\u0442\u0442\u0435\u043a\u0435\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bcf\/2f9\/246\/bcf2f924695d43c1bf87e04b2af8c4dd.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"cs\">BiomeType[,] BiomeTable = new BiomeType[6,6] {        \/\/COLDEST        \/\/COLDER          \/\/COLD                  \/\/HOT                          \/\/HOTTER                       \/\/HOTTEST     { BiomeType.Ice, BiomeType.Tundra, BiomeType.Grassland,    BiomeType.Desert,              BiomeType.Desert,              BiomeType.Desert },              \/\/DRYEST     { BiomeType.Ice, BiomeType.Tundra, BiomeType.Grassland,    BiomeType.Desert,              BiomeType.Desert,              BiomeType.Desert },              \/\/DRYER     { BiomeType.Ice, BiomeType.Tundra, BiomeType.Woodland,     BiomeType.Woodland,            BiomeType.Savanna,             BiomeType.Savanna },             \/\/DRY     { BiomeType.Ice, BiomeType.Tundra, BiomeType.BorealForest, BiomeType.Woodland,            BiomeType.Savanna,             BiomeType.Savanna },             \/\/WET     { BiomeType.Ice, BiomeType.Tundra, BiomeType.BorealForest, BiomeType.SeasonalForest,      BiomeType.TropicalRainforest,  BiomeType.TropicalRainforest },  \/\/WETTER     { BiomeType.Ice, BiomeType.Tundra, BiomeType.BorealForest, BiomeType.TemperateRainforest, BiomeType.TropicalRainforest,  BiomeType.TropicalRainforest }   \/\/WETTEST }; <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u0442\u0438\u043f \u0431\u0438\u043e\u043c\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430. \u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430, \u0432\u0435\u0434\u044c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0442\u0430\u0439\u043b\u0443 \u0443\u0436\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0442\u0438\u043f \u0442\u0435\u043f\u043b\u0430 \u0438 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<pre><code class=\"cs\">public BiomeType GetBiomeType(Tile tile) {     return BiomeTable [(int)tile.MoistureType, (int)tile.HeatType]; } <\/code><\/pre>\n<p>  \u042d\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0431\u0438\u043e\u043c\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u043a\u0430\u0440\u0442\u044b.<\/p>\n<pre><code class=\"cs\">private void GenerateBiomeMap() {     for (var x = 0; x &lt; Width; x++) {         for (var y = 0; y &lt; Height; y++) {                           if (!Tiles[x, y].Collidable) continue;                           Tile t = Tiles[x,y];             t.BiomeType = GetBiomeType(t);         }     } } <\/code><\/pre>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0432\u0441\u0435 \u0431\u0438\u043e\u043c\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0442\u0438\u043f\u0443. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0438\u043e\u043c\u0430 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0446\u0432\u0435\u0442\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/da0\/73f\/281\/da073f281bca462991ee9dd2542a315c.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u043e\u0432 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u043a\u043b\u0430\u0441\u0441 TextureGenerator \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0431\u0438\u043e\u043c\u043e\u0432:<\/p>\n<pre><code class=\"cs\">\/\/\u043a\u0430\u0440\u0442\u0430 \u0431\u0438\u043e\u043c\u043e\u0432 private static Color Ice = Color.white; private static Color Desert = new Color(238\/255f, 218\/255f, 130\/255f, 1); private static Color Savanna = new Color(177\/255f, 209\/255f, 110\/255f, 1); private static Color TropicalRainforest = new Color(66\/255f, 123\/255f, 25\/255f, 1); private static Color Tundra = new Color(96\/255f, 131\/255f, 112\/255f, 1); private static Color TemperateRainforest = new Color(29\/255f, 73\/255f, 40\/255f, 1); private static Color Grassland = new Color(164\/255f, 225\/255f, 99\/255f, 1); private static Color SeasonalForest = new Color(73\/255f, 100\/255f, 35\/255f, 1); private static Color BorealForest = new Color(95\/255f, 115\/255f, 62\/255f, 1); private static Color Woodland = new Color(139\/255f, 175\/255f, 90\/255f, 1);         public static Texture2D GetBiomeMapTexture(int width, int height, Tile[,] tiles, float coldest, float colder, float cold) {     var texture = new Texture2D(width, height);     var pixels = new Color[width * height];           for (var x = 0; x &lt; width; x++)     {         for (var y = 0; y &lt; height; y++)         {             BiomeType value = tiles[x, y].BiomeType;                           switch(value){             case BiomeType.Ice:                 pixels[x + y * width] = Ice;                 break;             case BiomeType.BorealForest:                 pixels[x + y * width] = BorealForest;                 break;             case BiomeType.Desert:                 pixels[x + y * width] = Desert;                 break;             case BiomeType.Grassland:                 pixels[x + y * width] = Grassland;                 break;             case BiomeType.SeasonalForest:                 pixels[x + y * width] = SeasonalForest;                 break;             case BiomeType.Tundra:                 pixels[x + y * width] = Tundra;                 break;             case BiomeType.Savanna:                 pixels[x + y * width] = Savanna;                 break;             case BiomeType.TemperateRainforest:                 pixels[x + y * width] = TemperateRainforest;                 break;             case BiomeType.TropicalRainforest:                 pixels[x + y * width] = TropicalRainforest;                 break;             case BiomeType.Woodland:                 pixels[x + y * width] = Woodland;                 break;                                       }                           \/\/ \u0422\u0430\u0439\u043b\u044b \u0432\u043e\u0434\u044b             if (tiles[x,y].HeightType == HeightType.DeepWater) {                 pixels[x + y * width] = DeepColor;             }             else if (tiles[x,y].HeightType == HeightType.ShallowWater) {                 pixels[x + y * width] = ShallowColor;             }               \/\/ \u0440\u0438\u0441\u0443\u0435\u043c \u0440\u0435\u043a\u0438             if (tiles[x,y].HeightType == HeightType.River)             {                 float heatValue = tiles[x,y].HeatValue;                        if (tiles[x,y].HeatType == HeatType.Coldest)                     pixels[x + y * width] = Color.Lerp (IceWater, ColdWater, (heatValue) \/ (coldest));                 else if (tiles[x,y].HeatType == HeatType.Colder)                     pixels[x + y * width] = Color.Lerp (ColdWater, RiverWater, (heatValue - coldest) \/ (colder - coldest));                 else if (tiles[x,y].HeatType == HeatType.Cold)                     pixels[x + y * width] = Color.Lerp (RiverWater, ShallowColor, (heatValue - colder) \/ (cold - colder));                 else                     pixels[x + y * width] = ShallowColor;             }                 \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0442\u0443\u0440             if (tiles[x,y].HeightType &gt;= HeightType.Shore && tiles[x,y].HeightType != HeightType.River)             {                 if (tiles[x,y].BiomeBitmask != 15)                     pixels[x + y * width] = Color.Lerp (pixels[x + y * width], Color.black, 0.35f);             }         }     }           texture.SetPixels(pixels);     texture.wrapMode = TextureWrapMode.Clamp;     texture.Apply();     return texture; } <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u043a\u0430\u0440\u0442 \u0431\u0438\u043e\u043c\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043a\u0430\u0440\u0442\u044b \u043c\u0438\u0440\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c26\/77f\/8ae\/c2677f8ae5524be7926c76e834d64479.png\" alt=\"image\"\/> <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/9d7\/0f3\/036\/9d70f30361644383819f15c5f3730635.png\" alt=\"image\"\/><\/p>\n<p>  <b>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u0430\u0440\u0442<\/b><\/p>\n<p>  \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043c\u0438\u0440\u044b, \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e \u043e\u0441\u0438 X \u0438 Y. \u0422\u0430\u043a\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0438\u0433\u0440, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0432 \u0438\u0433\u0440\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043d\u0430 \u0441\u0444\u0435\u0440\u0443, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0448 \u043c\u0438\u0440 \u043c\u043e\u0433 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0444\u0435\u0440\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u0443\u0440. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043c\u0438 \u043c\u0438\u0440\u043e\u0432.<\/p>\n<p>  \u0421\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043a\u0430\u0440\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0448\u0443\u043c\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440. \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043c\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043d\u0430 \u0434\u0432\u0435 \u0432\u0435\u0442\u0432\u0438 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u0432: WrappableWorldGenerator \u0438 SphericalWorldGenerator. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Generator.<\/p>\n<p>  \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0438\u043c\u0435\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u044f\u0434\u0440\u043e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Generator, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c\u0438:<\/p>\n<pre><code class=\"cs\">protected abstract void Initialize(); protected abstract void GetData();   protected abstract Tile GetTop(Tile tile); protected abstract Tile GetBottom(Tile tile); protected abstract Tile GetLeft(Tile tile); protected abstract Tile GetRight(Tile tile); <\/code><\/pre>\n<p>  \u0418\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0443 \u043d\u0430\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Initialize() \u0438 GetData() \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0434\u043b\u044f \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043c\u0438\u0440\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043e\u0441\u0438 X \u0441\u043e \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0448\u0443\u043c\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043d\u0430 \u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u044f. \u0422\u0435\u043f\u043b\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u0432 \u043d\u043e\u0432\u043e\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0441\u0438 Y. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"cs\">protected override void Initialize()     {         HeightMap = new ImplicitFractal (FractalType.MULTI,                                           BasisType.SIMPLEX,                                           InterpolationType.QUINTIC,                                           TerrainOctaves,                                           TerrainFrequency,                                           Seed);                        HeatMap = new ImplicitFractal(FractalType.MULTI,                                        BasisType.SIMPLEX,                                        InterpolationType.QUINTIC,                                        HeatOctaves,                                        HeatFrequency,                                        Seed);                   MoistureMap = new ImplicitFractal (FractalType.MULTI,                                             BasisType.SIMPLEX,                                             InterpolationType.QUINTIC,                                             MoistureOctaves,                                             MoistureFrequency,                                             Seed);     } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f GetData \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041c\u044b \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430. \u0428\u0443\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441 \u0448\u0438\u0440\u043e\u0442\u043e\u0439 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u043e\u0439.<\/p>\n<p>  \u042f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b, \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 <a href=\"http:\/\/libnoise.sourceforge.net\/tutorials\/tutorial8.html\">libnoise<\/a>, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0442\u0443 \u0436\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0448\u0438\u0440\u043e\u0442\u044b \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u044b \u0432 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u0439 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u044b, \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c:<\/p>\n<pre><code class=\"cs\">void LatLonToXYZ(float lat, float lon, ref float x, ref float y, ref float z) {     float r = Mathf.Cos (Mathf.Deg2Rad * lon);     x = r * Mathf.Cos (Mathf.Deg2Rad * lat);     y = Mathf.Sin (Mathf.Deg2Rad * lon);     z = r * Mathf.Sin (Mathf.Deg2Rad * lat); } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f GetData \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0431\u0435\u0440\u0435\u0442 \u0432\u0441\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u044b. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043f\u043b\u0430, \u0432\u044b\u0441\u043e\u0442\u044b \u0438 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438. \u041a\u0430\u0440\u0442\u0430 \u0431\u0438\u043e\u043c\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u2014 \u0438\u0437 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u0435\u043f\u043b\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0438 \u043a\u0430\u0440\u0442\u044b \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<pre><code class=\"cs\">protected override void GetData() {     HeightData = new MapData (Width, Height);     HeatData = new MapData (Width, Height);     MoistureData = new MapData (Width, Height);       \/\/ \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u0440\u0442\u044b \u043f\u043e \u0448\u0438\u0440\u043e\u0442\u0435\/\u0434\u043e\u043b\u0433\u043e\u0442\u0435     float southLatBound = -180;     float northLatBound = 180;     float westLonBound = -90;     float eastLonBound = 90;            float lonExtent = eastLonBound - westLonBound;     float latExtent = northLatBound - southLatBound;           float xDelta = lonExtent \/ (float)Width;     float yDelta = latExtent \/ (float)Height;           float curLon = westLonBound;     float curLat = southLatBound;           \/\/ \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0442\u0430\u0439\u043b\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0448\u0438\u0440\u043e\u0442\u044b\/\u0434\u043e\u043b\u0433\u043e\u0442\u044b     for (var x = 0; x &lt; Width; x++) {                   curLon = westLonBound;                   for (var y = 0; y &lt; Height; y++) {                           float x1 = 0, y1 = 0, z1 = 0;                           \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0448\u0438\u0440\u043e\u0442\u0443 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0443 \u0432 x, y, z             LatLonToXYZ (curLat, curLon, ref x1, ref y1, ref z1);               \/\/ \u0422\u0435\u043f\u043b\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435             float sphereValue = (float)HeatMap.Get (x1, y1, z1);                                 if (sphereValue &gt; HeatData.Max)                 HeatData.Max = sphereValue;             if (sphereValue &lt; HeatData.Min)                 HeatData.Min = sphereValue;                          HeatData.Data [x, y] = sphereValue;                          \/\/ \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0442\u0435\u043f\u043b\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0448\u0438\u0440\u043e\u0442\u044b             float coldness = Mathf.Abs (curLon) \/ 90f;             float heat = 1 - Mathf.Abs (curLon) \/ 90f;                           HeatData.Data [x, y] += heat;             HeatData.Data [x, y] -= coldness;                           \/\/ \u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0441\u043e\u0442\u044b             float heightValue = (float)HeightMap.Get (x1, y1, z1);             if (heightValue &gt; HeightData.Max)                 HeightData.Max = heightValue;             if (heightValue &lt; HeightData.Min)                 HeightData.Min = heightValue;                            HeightData.Data [x, y] = heightValue;                           \/\/ \u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438             float moistureValue = (float)MoistureMap.Get (x1, y1, z1);             if (moistureValue &gt; MoistureData.Max)                 MoistureData.Max = moistureValue;             if (moistureValue &lt; MoistureData.Min)                 MoistureData.Min = moistureValue;                            MoistureData.Data [x, y] = moistureValue;               curLon += xDelta;         }                    curLat += yDelta;     } } <\/code><\/pre>\n<p>  \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u0430\u0440\u0442\u0443 \u0432\u044b\u0441\u043e\u0442, \u0442\u0435\u043f\u043b\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443, \u043a\u0430\u0440\u0442\u0443 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043a\u0430\u0440\u0442\u0443 \u0431\u0438\u043e\u043c\u043e\u0432:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/759\/8f5\/6e8\/7598f56e8dc545bda89fc7969107a469.png\" alt=\"image\"\/><\/p>\n<p>  \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043a\u0430\u0440\u0442\u044b \u0438\u0437\u0433\u0438\u0431\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043b\u0435 \u0443\u0433\u043b\u043e\u0432. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0431\u0438\u043e\u043c\u043e\u0432 \u0434\u043b\u044f \u0441\u0444\u0435\u0440\u044b \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/1d0\/225\/446\/1d022544603043eb8e8d8813911ed282.png\" alt=\"image\"\/><\/p>\n<p>  \u041d\u0435\u043f\u043b\u043e\u0445\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043d\u0430\u0448\u0430 \u043a\u0430\u0440\u0442\u0430 \u0432\u044b\u0441\u043e\u0442 \u0441\u0442\u0430\u043b\u0430 \u0447\u0435\u0440\u043d\u043e-\u0431\u0435\u043b\u043e\u0439. \u041c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0432\u044b\u0441\u043e\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0441\u0444\u0435\u0440\u044b. \u0414\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u043b\u044c\u0435\u0444\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043c \u0447\u0435\u0440\u043d\u043e-\u0431\u0435\u043b\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0443\u044e \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f. \u042d\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0437\u0430\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0440\u0435\u043b\u044c\u0435\u0444\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cs\">public static Texture2D CalculateBumpMap(Texture2D source, float strength) {     Texture2D result;     float xLeft, xRight;     float yUp, yDown;     float yDelta, xDelta;     var pixels = new Color[source.width * source.height];     strength = Mathf.Clamp(strength, 0.0F, 10.0F);             result = new Texture2D(source.width, source.height, TextureFormat.ARGB32, true);           for (int by = 0; by &lt; result.height; by++)     {         for (int bx = 0; bx &lt; result.width; bx++)         {             xLeft = source.GetPixel(bx - 1, by).grayscale * strength;             xRight = source.GetPixel(bx + 1, by).grayscale * strength;             yUp = source.GetPixel(bx, by - 1).grayscale * strength;             yDown = source.GetPixel(bx, by + 1).grayscale * strength;             xDelta = ((xLeft - xRight) + 1) * 0.5f;             yDelta = ((yUp - yDown) + 1) * 0.5f;               pixels[bx + by * source.width] = new Color(xDelta, yDelta, 1.0f, yDelta);         }     }       result.SetPixels(pixels);     result.wrapMode = TextureWrapMode.Clamp;     result.Apply();     return result; } <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0434\u0430\u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043b\u0435\u0432\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0435\u043b\u044c\u0435\u0444\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u0443\u044e \u0441\u043f\u0440\u0430\u0432\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/fee\/790\/230\/fee7902301124dfe9a48b77786e5da22.png\" alt=\"image\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u0443 \u0440\u0435\u043b\u044c\u0435\u0444\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u0430\u0440\u0442\u043e\u0439 \u0432\u044b\u0441\u043e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u043a \u043d\u0430\u0448\u0435\u0439 \u0441\u0444\u0435\u0440\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/2e0\/0a1\/6e4\/2e00a16e4ca54ba39c79bfa06fd55da1.png\" alt=\"image\"\/><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0435\u0449\u0435 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0435\u0432 \u043e\u0431\u043b\u0430\u043a\u043e\u0432. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0448\u0443\u043c\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0442\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0433\u043e (billow) \u0448\u0443\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u043a\u043e\u0432.<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u0432\u0430 \u0441\u043b\u043e\u044f \u043e\u0431\u043b\u0430\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u0438\u043c \u0433\u043b\u0443\u0431\u0438\u043d\u044b. \u041a\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"cs\">Cloud1Map = new ImplicitFractal(FractalType.BILLOW,                                 BasisType.SIMPLEX,                                 InterpolationType.QUINTIC,                                 5,                                 1.65f,                                 Seed);   Cloud2Map = new ImplicitFractal (FractalType.BILLOW,                                  BasisType.SIMPLEX,                                  InterpolationType.QUINTIC,                                  6,                                  1.75f,                                  Seed); <\/code><\/pre>\n<p>  \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0442\u043e\u0440 (lerp) \u043e\u0442 \u0431\u0435\u043b\u043e\u0433\u043e \u0434\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0433\u043e \u0431\u0435\u043b\u043e\u0433\u043e. \u041c\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u043e\u0431\u043b\u0430\u043a\u0430 \u0434\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0434\u0435\u043b\u0430\u044f \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c. \u041a\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"cs\">public static Texture2D GetCloudTexture(int width, int height, Tile[,] tiles, float cutoff) {     var texture = new Texture2D(width, height);     var pixels = new Color[width * height];               for (var x = 0; x &lt; width; x++)     {         for (var y = 0; y &lt; height; y++)         {                                     if (tiles[x,y].CloudValue &gt; cutoff)                 pixels[x + y * width] = Color.Lerp(new Color(1f, 1f, 1f, 0), Color.white, tiles[x,y].CloudValue);             else                 pixels[x + y * width] = new Color(0,0,0,0);         }     }               texture.SetPixels(pixels);     texture.wrapMode = TextureWrapMode.Clamp;     texture.Apply();     return texture; } <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043e\u0431\u043b\u0430\u043a\u043e\u0432. \u042d\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u044e\u0442 \u0438\u0437\u0433\u0438\u0431\u044b \u043f\u043e \u043a\u0440\u0430\u044f\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/78f\/76e\/a55\/78f76ea556854318a45514eed3ff7f8f.png\" alt=\"image\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u0432\u0430 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u0448\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0447\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0444\u0435\u0440\u0430. \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 \u0448\u0435\u0439\u0434\u0435\u0440\u0443 \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u0437\u0430\u0442\u0443\u0445\u0430\u043d\u0438\u044f (fade), \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0449\u0443\u044e \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0441\u0442\u044c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/aae\/4e7\/7a5\/aae4e77a5b8746808094ae86cd312a49.gif\" alt=\"image\"\/><\/p>\n<p>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u044f \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0432\u0441\u0435\u0445 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u0443\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u043f\u043b\u0430\u043d\u0435\u0442\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/9f7\/399\/f89\/9f7399f89c2144f1a6b4188b1da057b5.png\" alt=\"image\"\/><\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 github: <a href=\"https:\/\/github.com\/jongallant\/WorldGeneratorFinal\">World Generator Final<\/a>.       <\/p>\n<div class=\"clear\"><\/div>\n<p> \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:\/\/habrahabr.ru\/post\/276551\/\"> https:\/\/habrahabr.ru\/post\/276551\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b82\/7d0\/bc3\/b827d0bc3650436b985c103dc5dbc539.png\" alt=\"image\"\/><\/p>\n<p>  \u042d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Unity \u0438 C# \u043a\u0430\u0440\u0442\u0430\u0445 \u043c\u0438\u0440\u0430. <i>\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c 7 \u041c\u0411 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a.<\/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-273581","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/273581","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=273581"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/273581\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=273581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=273581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=273581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}