diff --git a/Assets/Scripts/AudioLibrary.cs b/Assets/Scripts/AudioLibrary.cs index 52095b0..00c0357 100644 --- a/Assets/Scripts/AudioLibrary.cs +++ b/Assets/Scripts/AudioLibrary.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Reflection; using log4net; +using Managers; using UnityEditor; using UnityEngine; @@ -9,62 +10,15 @@ public class AudioLibrary : MonoBehaviour { private static ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public List audios; - public string audioAssetsBundleName = "audio"; - public string manageableAudioFolder = "Assets/Prefabs/Audio"; + private static readonly string manageableAudioFolder = "Assets/Prefabs/Audio"; + private static readonly string audioAssetsBundleName = "audio"; public void Awake() - { - LoadAvailableSounds(); - } - - /// - /// Loads all ManageableAudioPrefabs from an asset bundle if built or - /// from the assets folder when in editor. - /// TODO: DO NOT FORGET TO manually BUILD ASSET BUNDLES WHEN BUILDING - /// - private void LoadAvailableSounds() { #if UNITY_EDITOR - string[] files = Directory.GetFiles(manageableAudioFolder, "*.prefab", - SearchOption.TopDirectoryOnly); - List gos = new List(); - foreach (var file in files) - { - gos.Add(AssetDatabase.LoadAssetAtPath(file)); - } - foreach (GameObject go in gos) - { - if (go.TryGetComponent(out _)) - { - audios.Add(go); - } - else - { - Log.Warn("Audio library can only load prefabs with ManageableAudio components!"); - } - } + GameManager.LoadPrefabsFromFolder(manageableAudioFolder, audios); #else - var audioAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, audioAssetsBundleName)); - if (audioAssetBundle == null) - { - Log.Error("Failed to load arenas asset bundle!"); - return; - } - List gos = new List(); - gos.AddRange(audioAssetBundle.LoadAllAssets()); - - foreach (GameObject go in gos) - { - if (go.TryGetComponent(out _)) - { - audios.Add(go); - } - else - { - Log.Warn("Audio library can only load prefabs with ManageableAudio components!"); - } - } + GameManager.LoadPrefabsFromBundle(audioAssetsBundleName, audios); #endif } - } \ No newline at end of file diff --git a/Assets/Scripts/Managers/CharacterManager.cs b/Assets/Scripts/Managers/CharacterManager.cs index b9e2e14..a50338b 100644 --- a/Assets/Scripts/Managers/CharacterManager.cs +++ b/Assets/Scripts/Managers/CharacterManager.cs @@ -23,8 +23,8 @@ namespace Managers /// public static CharacterManager G { get; private set; } public List AvailableShips { get; private set; } = new List(); - private static readonly string characterAssetsBundleName = "characters"; private static readonly string characterAssetsPath = "Assets/ScriptedAssets/Characters"; + private static readonly string characterAssetsBundleName = "characters"; void Awake() { @@ -44,20 +44,9 @@ namespace Managers private void LoadAvailableCharacters() { #if UNITY_EDITOR - string[] files = Directory.GetFiles(characterAssetsPath, "*.asset", - SearchOption.TopDirectoryOnly); - foreach (var file in files) - { - AvailableShips.Add(AssetDatabase.LoadAssetAtPath(file)); - } + GameManager.LoadAssetsFromFolder(characterAssetsPath, AvailableShips); #else - var characterAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, characterAssetsBundleName)); - if (characterAssetBundle == null) - { - Log.Error("Failed to load rules asset bundle!"); - return; - } - AvailableShips.AddRange(characterAssetBundle.LoadAllAssets()); + GameManager.LoadAssetsFromBundle(characterAssetsBundleName, AvailableShips); #endif } diff --git a/Assets/Scripts/Managers/GameManager.cs b/Assets/Scripts/Managers/GameManager.cs index 06428ca..1f14cf7 100644 --- a/Assets/Scripts/Managers/GameManager.cs +++ b/Assets/Scripts/Managers/GameManager.cs @@ -2,13 +2,13 @@ using System; using System.Collections; using System.IO; using System.Reflection; -using System.Threading.Tasks; -using log4net; -using log4net.Config; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; using FishNet; +using System.Collections.Generic; +using log4net; +using UnityEditor; /// /// The available scenes in the order they are in the build settings. /// @@ -324,6 +324,107 @@ namespace Managers SceneManager.sceneLoaded += OnSceneLoaded; } + /// + /// Loads all prefabs/gameobjects from a folder if the contain the given type + /// as a component and adds them to a list. + /// + /// Path of the folder + /// List the loaded prefabs will be added to + public static void LoadPrefabsFromFolder(string path, in List prefabList) + { +#if UNITY_EDITOR + string[] files = Directory.GetFiles(path, "*.prefab", + SearchOption.TopDirectoryOnly); + List gos = new List(); + foreach (var file in files) + { + gos.Add(AssetDatabase.LoadAssetAtPath(file)); + } + foreach (GameObject go in gos) + { + if (go.TryGetComponent(out _)) + { + prefabList.Add(go); + } + else + { + Log.Warn($"GameObject: {go.name} did not contain a {typeof(T).Name} component. It won't be added to the list."); + } + } +#else + Log.Error("Can only access prefabs in folders when in editor!"); +#endif + } + + /// + /// Loads all prefabs/gameobjects from an asset bundle if the contain the given type + /// as a component and adds them to a list. + /// TODO: DO NOT FORGET TO manually BUILD ASSET BUNDLES WHEN BUILDING + /// + /// Name of the asset bundle + /// List the loaded prefabs will be added to + public static void LoadPrefabsFromBundle(string name, in List prefabList) + { + var audioAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, name)); + if (audioAssetBundle == null) + { + Log.Error("Failed to load arenas asset bundle!"); + return; + } + List gos = new List(); + gos.AddRange(audioAssetBundle.LoadAllAssets()); + + foreach (GameObject go in gos) + { + if (go.TryGetComponent(out _)) + { + prefabList.Add(go); + } + else + { + Log.Warn($"GameObject: {go.name} did not contain a {typeof(T).Name} component. It won't be added to the list."); + } + } + } + + /// + /// Loads all assets from a folder, if they are of the given type and adds them to a list. + /// + /// Path of the folder + /// List the loaded prefabs will be added to + public static void LoadAssetsFromFolder(string path, in List prefabList) + where T : UnityEngine.Object + { +#if UNITY_EDITOR + string[] files = Directory.GetFiles(path, "*.asset", + SearchOption.TopDirectoryOnly); + foreach (var file in files) + { + prefabList.Add(AssetDatabase.LoadAssetAtPath(file)); + } +#else + Log.Error("Can only access prefabs in folders when in editor!"); +#endif + } + + /// + /// Loads all assets from an asset bundle, if they are of the given type and adds them to a list. + /// TODO: DO NOT FORGET TO manually BUILD ASSET BUNDLES WHEN BUILDING + /// + /// Name of the asset bundle + /// List the loaded prefabs will be added to + public static void LoadAssetsFromBundle(string name, in List prefabList) + where T : UnityEngine.Object + { + var arenasAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, name)); + if (arenasAssetBundle == null) + { + Log.Error("Failed to load arenas asset bundle!"); + return; + } + prefabList.AddRange(arenasAssetBundle.LoadAllAssets()); + } + } /// diff --git a/Assets/Scripts/Managers/MatchManager.cs b/Assets/Scripts/Managers/MatchManager.cs index 3e4d70e..e582393 100644 --- a/Assets/Scripts/Managers/MatchManager.cs +++ b/Assets/Scripts/Managers/MatchManager.cs @@ -56,10 +56,10 @@ namespace Managers { private static ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private static readonly string arenaAssetsBundleName = "arenas"; - private static readonly string ruleAssetsBundleName = "rules"; private static readonly string arenaAssetsPath = "Assets/ScriptedAssets/Arenas"; private static readonly string ruleAssetsPath = "Assets/ScriptedAssets/Rules"; + private static readonly string arenaAssetsBundleName = "arenas"; + private static readonly string ruleAssetsBundleName = "rules"; private GameResult CurrentMatchResult; public GameObject MatchArena; @@ -110,50 +110,26 @@ namespace Managers } /// - /// Loads the different rules/game modes which are available, - /// at the fixed asset path. + /// Loads the different rules/game modes from the projects assets. /// private void LoadAvailableRules() { #if UNITY_EDITOR - string[] files = Directory.GetFiles(arenaAssetsPath, "*.asset", - SearchOption.TopDirectoryOnly); - foreach (var file in files) - { - AvailableArenas.Add(AssetDatabase.LoadAssetAtPath(file)); - } + GameManager.LoadAssetsFromFolder(ruleAssetsPath, AvailableRules); #else - var ruleAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, ruleAssetsBundleName)); - if (ruleAssetBundle == null) - { - Log.Error("Failed to load rules asset bundle!"); - return; - } - AvailableRules.AddRange(ruleAssetBundle.LoadAllAssets()); + GameManager.LoadAssetsFromBundle(ruleAssetsBundleName, AvailableRules); #endif } /// - /// Loads the characters a player can choose from a fixed path - /// in the project. + /// Loads the characters a player can choose from the projects assets. /// private void LoadAvailableArenas() { #if UNITY_EDITOR - string[] files = Directory.GetFiles(ruleAssetsPath, "*.asset", - SearchOption.TopDirectoryOnly); - foreach (var file in files) - { - AvailableRules.Add(AssetDatabase.LoadAssetAtPath(file)); - } + GameManager.LoadAssetsFromFolder(arenaAssetsPath, AvailableArenas); #else - var arenasAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, arenaAssetsBundleName)); - if (arenasAssetBundle == null) - { - Log.Error("Failed to load arenas asset bundle!"); - return; - } - AvailableArenas.AddRange(arenasAssetBundle.LoadAllAssets()); + GameManager.LoadAssetsFromBundle(arenaAssetsBundleName, AvailableArenas); #endif } @@ -276,11 +252,12 @@ namespace Managers await Tween.Delay(2f * 0.66f); UIManager.G.ShowMatchEndMenu(MatchArena.transform); - + MatchCamera.SetActive(false); } async public void StartRematch() { + MatchCamera.SetActive(true); ResetMatch(); UIManager.G.Announcments.QueueAnnounceText("Starting rematch.", 0.3f);