/// <summary> /// Creates a new Unit from a prefab. This includes adding it to the game logic, and creating a visual /// representation. The prefab provided should have a UnitAvatar script attatched, as well as any /// requirements of that script. This operation will fail if the given position is already occupied. /// </summary> /// <param name="unitPrefab">the prefab of the unit to create</param> /// <param name="pos">the TileVector position to spawn it</param> /// <param name="dir">the Direction for it to be facing</param> /// <param name="owner">the Player owner of the Unit</param> /// <param name="mirrored">whether or not the Unit is mirrored</param> /// <returns>true if the operation was successful; false if not</returns> public bool MakeUnit(GameObject unitPrefab, Player owner, TileVector pos, CardinalDirection dir, bool mirrored) { if (_gameOver || _playerUnitPlaced[owner]) { return(false); // stop players placing more than one unit } var avatar = Instantiate(unitPrefab).GetComponent <UnitAvatar>(); var unit = avatar.CreateUnit(owner, pos, dir, mirrored); if (!_worldController.AddUnit(unit)) // oops! bad unit placement, so delete the unit as if nothing happened { Destroy(avatar.gameObject); return(false); } else // successful placement { avatar.SetUnit(unit); _playerUnitPlaced[owner] = true; // set player as placed a unit _allAvatars.Add(avatar); avatar.EnqueueAnimation(new DeployAnimation(avatar)); var allPlaced = true; // check if all players have placed a unit foreach (var placed in _playerUnitPlaced.Values) { if (!placed) { allPlaced = false; break; } } if (allPlaced) // reset players' placement status and run game { DoTurn(); } return(true); } }