Генерация карты - Форум Игроделов
Пт, 17 Май 2024, 08:08 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » СКРИПТИНГ » Генерация карты
Генерация карты
pasha5666Дата: Сб, 13 Июн 2015, 19:43 | Сообщение # 1
Нет аватара
 
Сообщений: 1
Награды: 0
Репутация: 0
Статус: Offline
Здраствуйте, есть скрипт который генерирует макет карты.0 - равнина, 1 - горы, -1 - впадины для рек.Подскажите как рандомно сгенерировать эти впадины, чтобы было похоже на реку.

Код

using UnityEngine;
using System.Collections;
using System;

public class Map : MonoBehaviour {
   
  public int width;
  public int height;
   
   
   
  public string seed;
  public bool useRandomSeed;

   

   
  [Range(0,100)]
  public int randomFillPercent;
  public int[,] map;

   
  void Start ()
  {

   GenerateMap();

   BotomGenerate();
  }
   
   
  void GenerateMap()
  {
   map = new int [width, height];
   RandomFillMap();
    
   for(int i = 0; i < 5; i++)
   {
    SmoothMap();
   }
   //MeshGenerate meshGen = GetComponent<MeshGenerate>();
   //meshGen.GenerateMesh(map, 1);
  }
  void RandomFillMap()
  {
   if(useRandomSeed == true)
   {
    seed = Time.time.ToString();
   }
    

   System.Random pseudoRandom = new System.Random(seed.GetHashCode());
   for(int x = 0; x < width; x++)
    for(int y = 0; y < height; y++)
   {  
    if((x == 0)||(x == width - 1)||(y == 0)||(y == height - 1))
    {
     map[x, y] = 1;
    }
    else
    {
     map[x, y] = (pseudoRandom.Next(0, 100) < randomFillPercent)? 1: 0;

    }

   }
    
  }
  void SmoothMap()
  {
   for(int x = 0; x < width; x++)
    for(int y = 0; y < height; y++)
   {
    int neighbourWallTiles = GetSorroundWallCount(x, y);
     
    if(neighbourWallTiles > 4)
     map[x, y] = 1;
    else if(neighbourWallTiles < 4)
     map[x, y] = 0;
   }
  }
  int GetSorroundWallCount(int gridX, int gridY)
  {
   int wallCount = 0;
   for(int neighbourX = gridX - 1; neighbourX <= gridX + 1; neighbourX++)
    for(int neighbourY = gridY - 1; neighbourY <= gridY + 1; neighbourY++)
   {
    if ((neighbourX >= 0)&&(neighbourX < width)&&(neighbourY >= 0)&&(neighbourY < height))
    {
     if ((neighbourX != gridX)||(neighbourY != gridY))
     {
      wallCount += map[neighbourX, neighbourY];
     }
    }
    else
    {
     wallCount ++;
    }
   }
   return wallCount;
  }

  void BotomGenerate ()
  {
   //
  }
   
  void OnDrawGizmos ()
  {
   if (map != null)
   {
    for(int x = 0; x < width; x++)
     for(int y = 0; y < height; y++)
    {
     Gizmos.color = (map[x, y] == 1)? Color.black: Color.green;
     if (map[x, y] ==-1)
     {
      Gizmos.color = Color.blue;
     }
     Vector3 pos = new Vector3(-width/2 +x+0.5f,0,-height/2 +y+0.5f);
     Gizmos.DrawCube(pos, Vector3.one);
    }
   }
  }
}
 
СообщениеЗдраствуйте, есть скрипт который генерирует макет карты.0 - равнина, 1 - горы, -1 - впадины для рек.Подскажите как рандомно сгенерировать эти впадины, чтобы было похоже на реку.

Код

using UnityEngine;
using System.Collections;
using System;

public class Map : MonoBehaviour {
   
  public int width;
  public int height;
   
   
   
  public string seed;
  public bool useRandomSeed;

   

   
  [Range(0,100)]
  public int randomFillPercent;
  public int[,] map;

   
  void Start ()
  {

   GenerateMap();

   BotomGenerate();
  }
   
   
  void GenerateMap()
  {
   map = new int [width, height];
   RandomFillMap();
    
   for(int i = 0; i < 5; i++)
   {
    SmoothMap();
   }
   //MeshGenerate meshGen = GetComponent<MeshGenerate>();
   //meshGen.GenerateMesh(map, 1);
  }
  void RandomFillMap()
  {
   if(useRandomSeed == true)
   {
    seed = Time.time.ToString();
   }
    

   System.Random pseudoRandom = new System.Random(seed.GetHashCode());
   for(int x = 0; x < width; x++)
    for(int y = 0; y < height; y++)
   {  
    if((x == 0)||(x == width - 1)||(y == 0)||(y == height - 1))
    {
     map[x, y] = 1;
    }
    else
    {
     map[x, y] = (pseudoRandom.Next(0, 100) < randomFillPercent)? 1: 0;

    }

   }
    
  }
  void SmoothMap()
  {
   for(int x = 0; x < width; x++)
    for(int y = 0; y < height; y++)
   {
    int neighbourWallTiles = GetSorroundWallCount(x, y);
     
    if(neighbourWallTiles > 4)
     map[x, y] = 1;
    else if(neighbourWallTiles < 4)
     map[x, y] = 0;
   }
  }
  int GetSorroundWallCount(int gridX, int gridY)
  {
   int wallCount = 0;
   for(int neighbourX = gridX - 1; neighbourX <= gridX + 1; neighbourX++)
    for(int neighbourY = gridY - 1; neighbourY <= gridY + 1; neighbourY++)
   {
    if ((neighbourX >= 0)&&(neighbourX < width)&&(neighbourY >= 0)&&(neighbourY < height))
    {
     if ((neighbourX != gridX)||(neighbourY != gridY))
     {
      wallCount += map[neighbourX, neighbourY];
     }
    }
    else
    {
     wallCount ++;
    }
   }
   return wallCount;
  }

  void BotomGenerate ()
  {
   //
  }
   
  void OnDrawGizmos ()
  {
   if (map != null)
   {
    for(int x = 0; x < width; x++)
     for(int y = 0; y < height; y++)
    {
     Gizmos.color = (map[x, y] == 1)? Color.black: Color.green;
     if (map[x, y] ==-1)
     {
      Gizmos.color = Color.blue;
     }
     Vector3 pos = new Vector3(-width/2 +x+0.5f,0,-height/2 +y+0.5f);
     Gizmos.DrawCube(pos, Vector3.one);
    }
   }
  }
}

Автор - pasha5666
Дата добавления - 13 Июн 2015 в 19:43
Форум Игроделов » UNITY3D » СКРИПТИНГ » Генерация карты
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024