using System; using System.Collections.Generic; using System.IO; using System.Reflection; using log4net; using PrimeTween; using UnityEditor; using UnityEngine; using FishNet; namespace Managers { /// /// Handles setting up the available character/ship options, which the players can choose from, /// connects them to the players when choosen and manages them (spawning, despawning etc.). /// public class CharacterManager : MonoBehaviour { private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); /// /// Globally accessible member to use manager with. /// public static CharacterManager G { get; private set; } public List AvailableShips { get; private set; } = new List(); private static readonly string characterAssetsPath = "Assets/ScriptedAssets/Characters"; private static readonly string characterAssetsBundleName = "characters"; void Awake() { G = this; Log.Info("Awake"); } void Start() { LoadAvailableCharacters(); } /// /// Loads the characters a player can choose from a fixed path /// in the project. /// private void LoadAvailableCharacters() { #if UNITY_EDITOR GameManager.LoadAssetsFromFolder(characterAssetsPath, AvailableShips); #else GameManager.LoadAssetsFromBundle(characterAssetsBundleName, AvailableShips); #endif } /// /// Assigns a ship to the player. /// Depends on the number of the player. /// Player number 2 always gets ship number 2 in the characters folder. /// /// Player public void AssignShipFixed(Player p, int id = -1) { if (id == -1) id = p.playerNumber - 1; if (AvailableShips.Count > id) { p.character = AvailableShips[id]; } else { Log.Error($"There was no ship assigned to player number: {p.playerNumber}" + " There are not enough ships to choose from."); } } /// /// Spawns the characters which were chosen by the players /// and sets them up to be playable. /// /// List of players for this match public void SpawnCharacters(List players) { if (MatchManager.G.MatchArena == null) { Log.Error("ArenaPlacement not found in scenes. Cannot spawn players."); return; } if (MatchManager.G.MatchCamera == null) { Log.Error("Match camera not found in scenes. Cannot initialize spawned Characters."); return; } var MatchCamera = MatchManager.G.MatchCamera; var MatchArena = MatchManager.G.MatchArena; List spawned = new List(); foreach (Player p in players) { GameObject shipObject = Instantiate(p.character.shipObject); p.spawnedCharacter = shipObject; shipObject.TryGetComponent(out Ship ship); ship.state = new ShipHandling.ShipState(); ship.cameraOperator = MatchCamera.GetComponent(); shipObject.transform.SetParent(MatchArena.transform, false); shipObject.transform.localPosition = MatchManager.G.ArenaProperties.spawnPositions[p.playerNumber - 1]; shipObject.transform.localScale = new Vector3(); Tween.Scale(shipObject.transform, new Vector3(0.7f, 0.7f, 0.7f), 1f); spawned.Add(p); } return; } public void SpawnOnlineCharacter(Player player) { if (MatchManager.G.MatchArena == null) { Log.Error("ArenaPlacement not found in scenes. Cannot spawn players."); return; } if (MatchManager.G.MatchCamera == null) { Log.Error("Match camera not found in scenes. Cannot initialize spawned Characters."); return; } var MatchCamera = MatchManager.G.MatchCamera; var MatchArena = MatchManager.G.MatchArena; List spawned = new List(); GameObject shipObject = Instantiate(player.character.shipObject); player.spawnedCharacter = shipObject; shipObject.TryGetComponent(out Ship ship); ship.state = new ShipHandling.ShipState(); ship.cameraOperator = MatchCamera.GetComponent(); shipObject.transform.SetParent(MatchArena.transform, false); shipObject.transform.localPosition = MatchManager.G.ArenaProperties.spawnPositions[player.playerNumber - 1]; shipObject.transform.localScale = new Vector3(); Tween.Scale(shipObject.transform, new Vector3(0.7f, 0.7f, 0.7f), 1f); InstanceFinder.ServerManager.Spawn(shipObject); spawned.Add(player); return; } } }