static void MarkCircle(ref List <int>[,] grid, SpawnCircle circle, float cellSize, int mark) { int cellX = (int)(circle.center.x / cellSize); int cellY = (int)(circle.center.y / cellSize); int offset = (int)(circle.radius / cellSize); int markStartX = Mathf.Max(0, cellX - offset); int markEndX = Mathf.Min(cellX + offset, grid.GetLength(0) - 1); int markStartY = Mathf.Max(0, cellY - offset); int markEndY = Mathf.Min(cellY + offset, grid.GetLength(1) - 1); for (int x = markStartX; x <= markEndX; x++) { for (int y = markStartY; y <= markEndY; y++) { float dist = Vector2.Distance(new Vector2(cellX, cellY), new Vector2(x, y)); if (dist <= circle.radius / 2 / cellSize) { if (grid[x, y] == null) { grid[x, y] = new List <int>() { mark } } ; else { grid[x, y].Add(mark); } } } } }
// Use this for initialization void Start() { // da = GameObject.FindGameObjectWithTag("EditorOnly").GetComponent<RayCastF>(); da = Camera.main.GetComponent <CircleData>(); var spawnCircle = GameObject.Find("Quadri"); sc = spawnCircle.GetComponent <SpawnCircle>(); SceneManager.UnloadSceneAsync("CircleTest 1"); }
// Use this for initialization void Start() { nbOfSwitch = 0; lastSize = gameObject.transform.localScale; var gameC = GameObject.Find("Quadri"); sc = gameC.GetComponent <SpawnCircle>(); isSmaller = true; isBigger = true; isTTFF = true; }
static public void Generate(Vector2 region, float regionHeight, Transform parent, List <MapSetting.ObjectDistribution> objectsDistribution) { List <MapObjectData> objectDatas = CreateObjectData(parent, objectsDistribution); if (objectDatas.Count == 0) { return; } float minRadius = objectDatas.Min(a => a.radius); float maxRadius = objectDatas.Max(a => a.radius); float cellSize = minRadius / Mathf.Sqrt(2); List <int>[,] grid = new List <int> [Mathf.CeilToInt(region.x / cellSize), Mathf.CeilToInt(region.y / cellSize)]; List <SpawnCircle> circles = new List <SpawnCircle>(); Vector2 startPoint = new Vector2(Random.Range(0, region.x), Random.Range(0, region.y)); Physics.Raycast(new Vector3(startPoint.x, regionHeight + 1, startPoint.y), Vector3.down, out RaycastHit startHit); List <SpawnCircle> candidates = new List <SpawnCircle> { new SpawnCircle() { center = startPoint, radius = FilterObjectDatassRandom(startHit.point.y, minRadius, objectDatas).radius } }; while (candidates.Count > 0) { int spawnIndex = Random.Range(0, candidates.Count); SpawnCircle candidate = candidates[spawnIndex]; bool stop = false; for (int n = 0; n < 10; n++) { float angle = Random.value * Mathf.PI * 2; Vector2 dir = new Vector2(Mathf.Sin(angle), Mathf.Cos(angle)); Vector2 candidatePoint = candidate.center + dir * Random.Range(candidate.radius / 2 + maxRadius / 2, candidate.radius + maxRadius); Physics.Raycast(new Vector3(candidatePoint.x, regionHeight + 1, candidatePoint.y), Vector3.down, out RaycastHit hit); MapObjectData objectData = FilterObjectDatassRandom(hit.point.y, minRadius, objectDatas); if (IsValid(grid, circles, candidatePoint, objectData.radius, region, cellSize)) { SpawnCircle spawnCircle = new SpawnCircle() { radius = objectData.radius, center = candidatePoint }; circles.Add(spawnCircle); candidates.Add(spawnCircle); MarkCircle(ref grid, spawnCircle, cellSize, circles.Count); stop = true; if (objectData.mapObjects != null) { GenerateObject(objectData, new Vector3(candidatePoint.x, hit.point.y, candidatePoint.y)); } break; } } if (!stop) { candidates.RemoveAt(spawnIndex); } } }
void Start() { spawnCircle = gameObject.GetComponent <SpawnCircle>(); }