public void OnTicUpdate(float ticNumber) { if (m_canSpawnNextHazard) { Hazard prefabToSpawn = null; m_hazardsToSpawn.Shuffle(); foreach (Hazard hazardToSpawn in m_hazardsToSpawn) { if (ticNumber % hazardToSpawn.UpdateEveryTicTime == 0) { prefabToSpawn = hazardToSpawn; break; } } if (prefabToSpawn == null) { return; } m_hazardsToSpawn.Remove(prefabToSpawn); bool hasEntityOnCell = true; GameMaster.EDirection chooseDirection = default(GameMaster.EDirection); Vector3 spawnPoint = Vector3.zero; int tryLimit = 0; while (hasEntityOnCell) { chooseDirection = prefabToSpawn.AllowedDirections[UnityEngine.Random.Range(0, prefabToSpawn.AllowedDirections.Count)]; spawnPoint = GameMaster.Instance.GetSpawnPosition(chooseDirection); hasEntityOnCell = GameMaster.Instance.Grid.GetCell(spawnPoint).Entities.Count > 0; if (tryLimit > 1000) { tryLimit = 0; return; //Spawn on next frame } else { tryLimit++; } } Hazard hazard = ResourceManager.Instance.AcquireInstance(prefabToSpawn, null); hazard.transform.position = spawnPoint; switch (chooseDirection) { case GameMaster.EDirection.UP: hazard.transform.right = Vector2.down; break; case GameMaster.EDirection.DOWN: hazard.transform.right = Vector2.up; break; case GameMaster.EDirection.RIGHT: hazard.transform.right = Vector2.left; break; case GameMaster.EDirection.LEFT: hazard.transform.right = Vector2.right; break; } hazard.Init(chooseDirection); m_canSpawnNextHazard = false; } }