async void SpawnUnits(string unit_prefab, FieldBounds bounds, int count, uint team_index) { var battleground = Game.GetBattleground(); var tilemap = battleground.GetMainTilemap(); var points = bounds.GetAllPoints(); points.Shuffle(); if (points.Count < count) { Debug.LogWarning($"Can't spawn {count} units, trim to free points count."); count = points.Count; } for (int i = 0; i < count; i++) { var asset = await Assets.LoadAsync(unit_prefab); var unit = asset.AddComponentOnce <BattleUnit>(); unit.Init(team_index); var cell_x = Mathf.RoundToInt(points[i].x); var cell_y = Mathf.RoundToInt(points[i].y); var point = new Vector3Int(cell_x, cell_y, 0); var world_pos = tilemap.CellToWorld(point); world_pos.x += Battleground.UNIT_WORLD_POS_OFFSET_X; world_pos.y += Battleground.UNIT_WORLD_POS_OFFSET_Y; unit.transform.position = world_pos; battleground.AddUnit(unit); } }
public async UniTask Load() { var location = await Assets.TryReuseAsync("Prefabs/location"); Error.Assert(location != null, "Location loading failed."); var main_tilemap_go = location.GetChild("grid/battleground_tilemap"); main_tilemap = main_tilemap_go.GetComponent <Tilemap>(); var decor_tilemap_go = location.GetChild("grid/decor_tilemap"); decor_tilemap = decor_tilemap_go.GetComponent <Tilemap>(); Error.Assert(main_tilemap_go != null && decor_tilemap != null, "Tilemaps init failed."); pathfinder = new Pathfinder(this, main_tilemap, decor_tilemap, bounds); walkable_points.AddRange(bounds.GetAllPoints()); is_loaded = true; }