From eebccceaabf9682bb3f66d9d64dfc2cb5112d8ba Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 16:49:29 -0400 Subject: [PATCH] Fix asset bundle issue and made a class of them --- NewHorizons/Builder/Props/DetailBuilder.cs | 4 +- NewHorizons/Builder/Props/PropBuildManager.cs | 62 +------------ NewHorizons/Builder/Props/ScatterBuilder.cs | 2 +- .../Builder/StarSystem/SkyboxBuilder.cs | 36 +------- NewHorizons/Main.cs | 9 +- NewHorizons/Utility/AssetBundleUtilities.cs | 91 +++++++++++++++++++ 6 files changed, 97 insertions(+), 107 deletions(-) create mode 100644 NewHorizons/Utility/AssetBundleUtilities.cs diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 3779fd50..d2a1b179 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -22,7 +22,7 @@ namespace NewHorizons.Builder.Props if (detail.assetBundle != null) { - var prefab = PropBuildManager.LoadPrefab(detail.assetBundle, detail.path, uniqueModName, mod); + var prefab = AssetBundleUtilities.LoadPrefab(detail.assetBundle, detail.path, mod); detailGO = MakeDetail(go, sector, prefab, detail.position, detail.rotation, detail.scale, detail.alignToNormal); } @@ -31,7 +31,7 @@ namespace NewHorizons.Builder.Props try { var prefab = mod.ModHelper.Assets.Get3DObject(detail.objFilePath, detail.mtlFilePath); - PropBuildManager.ReplaceShaders(prefab); + AssetBundleUtilities.ReplaceShaders(prefab); prefab.SetActive(false); detailGO = MakeDetail(go, sector, prefab, detail.position, detail.rotation, detail.scale, detail.alignToNormal); } diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 1ca12058..0c45045f 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -13,6 +13,7 @@ using NewHorizons.Utility; using OWML.Common; using NewHorizons.Builder.ShipLog; using NewHorizons.External.Configs; +using System.IO; namespace NewHorizons.Builder.Props { @@ -174,66 +175,5 @@ namespace NewHorizons.Builder.Props } } } - - public static GameObject LoadPrefab(string assetBundle, string path, string uniqueModName, IModBehaviour mod) - { - string key = assetBundle; - AssetBundle bundle; - GameObject prefab; - - try - { - if (Main.AssetBundles.ContainsKey(key)) bundle = Main.AssetBundles[key]; - else - { - var completePath = mod.ModHelper.Manifest.ModFolderPath + assetBundle; - bundle = AssetBundle.LoadFromFile(completePath); - if(bundle == null) - { - Logger.LogError($"Couldn't load AssetBundle at [{completePath}] for [{mod.ModHelper.Manifest.Name}]"); - return null; - } - - Main.AssetBundles[key] = bundle; - } - } - catch (Exception e) - { - Logger.LogError($"Couldn't load AssetBundle {assetBundle} : {e.Message}"); - return null; - } - - try - { - prefab = bundle.LoadAsset(path); - prefab.SetActive(false); - } - catch (Exception e) - { - Logger.LogError($"Couldn't load asset {path} from AssetBundle {assetBundle} : {e.Message}"); - return null; - } - - ReplaceShaders(prefab); - - return prefab; - } - - public static void ReplaceShaders(GameObject prefab) - { - foreach (var renderer in prefab.GetComponentsInChildren(true)) - { - foreach (var material in renderer.sharedMaterials) - { - if (material == null) - { - continue; - } - - var replacementShader = Shader.Find(material.shader.name); - if (replacementShader != null) material.shader = replacementShader; - } - } - } } } diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index 4a979455..2df47932 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -46,7 +46,7 @@ namespace NewHorizons.Builder.Props Random.InitState(propInfo.seed); GameObject prefab; - if (propInfo.assetBundle != null) prefab = PropBuildManager.LoadPrefab(propInfo.assetBundle, propInfo.path, uniqueModName, mod); + if (propInfo.assetBundle != null) prefab = AssetBundleUtilities.LoadPrefab(propInfo.assetBundle, propInfo.path, mod); else prefab = GameObject.Find(propInfo.path); for (int i = 0; i < propInfo.count; i++) { diff --git a/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs b/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs index b4066abc..6c69fd82 100644 --- a/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs +++ b/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs @@ -10,44 +10,10 @@ namespace NewHorizons.Builder.StarSystem { public class SkyboxBuilder { - public static Material LoadMaterial(string assetBundle, string path, string uniqueModName, IModBehaviour mod) - { - string key = uniqueModName + "." + assetBundle; - AssetBundle bundle; - Material cubemap; - - try - { - if (Main.AssetBundles.ContainsKey(key)) bundle = Main.AssetBundles[key]; - else - { - bundle = mod.ModHelper.Assets.LoadBundle(assetBundle); - Main.AssetBundles[key] = bundle; - } - } - catch (Exception e) - { - Logger.LogError($"Couldn't load AssetBundle {assetBundle} : {e.Message}"); - return null; - } - - try - { - cubemap = bundle.LoadAsset(path); - } - catch (Exception e) - { - Logger.Log($"Couldn't load asset {path} from AssetBundle {assetBundle} : {e.Message}"); - return null; - } - - return cubemap; - } - public static void Make(StarSystemConfig.SkyboxConfig info, IModBehaviour mod) { Logger.Log("Building Skybox"); - Material skyBoxMaterial = LoadMaterial(info.assetBundle, info.path, mod.ModHelper.Manifest.UniqueName, mod); + var skyBoxMaterial = AssetBundleUtilities.Load(info.assetBundle, info.path, mod); RenderSettings.skybox = skyBoxMaterial; DynamicGI.UpdateEnvironment(); Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index c537f99d..39f04c08 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -42,7 +42,6 @@ namespace NewHorizons public static Dictionary SystemDict = new Dictionary(); public static Dictionary> BodyDict = new Dictionary>(); - public static Dictionary AssetBundles = new Dictionary(); public static List MountedAddons = new List(); public static float SecondsLeftInLoop = -1; @@ -115,13 +114,6 @@ namespace NewHorizons } }; - foreach (var pair in AssetBundles) - { - if (pair.Value == null) Logger.LogError($"The asset bundle for {pair.Key} was null when trying to unload"); - else pair.Value.Unload(true); - } - AssetBundles.Clear(); - if (!resetTranslation) return; TranslationHandler.ClearTables(); TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage()); @@ -180,6 +172,7 @@ namespace NewHorizons SearchUtilities.ClearCache(); ImageUtilities.ClearCache(); AudioUtilities.ClearCache(); + AssetBundleUtilities.ClearCache(); IsSystemReady = false; } diff --git a/NewHorizons/Utility/AssetBundleUtilities.cs b/NewHorizons/Utility/AssetBundleUtilities.cs new file mode 100644 index 00000000..fc4cd0ed --- /dev/null +++ b/NewHorizons/Utility/AssetBundleUtilities.cs @@ -0,0 +1,91 @@ +using OWML.Common; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Utility +{ + public static class AssetBundleUtilities + { + public static Dictionary AssetBundles = new Dictionary(); + + public static void ClearCache() + { + foreach (var pair in AssetBundles) + { + if (pair.Value == null) Logger.LogError($"The asset bundle for {pair.Key} was null when trying to unload"); + else pair.Value.Unload(true); + } + AssetBundles.Clear(); + } + + public static T Load(string assetBundleRelativeDir, string pathInBundle, IModBehaviour mod) where T : UnityEngine.Object + { + string key = Path.GetFileName(assetBundleRelativeDir); + T obj; + + try + { + AssetBundle bundle; + + if (AssetBundles.ContainsKey(key)) + { + bundle = AssetBundles[key]; + } + else + { + var completePath = mod.ModHelper.Manifest.ModFolderPath + assetBundleRelativeDir; + bundle = AssetBundle.LoadFromFile(completePath); + if (bundle == null) + { + Logger.LogError($"Couldn't load AssetBundle at [{completePath}] for [{mod.ModHelper.Manifest.Name}]"); + return null; + } + + AssetBundles[key] = bundle; + } + + obj = bundle.LoadAsset(pathInBundle); + } + catch (Exception e) + { + Logger.LogError($"Couldn't load asset {pathInBundle} from AssetBundle {assetBundleRelativeDir} : {e.Message}"); + return null; + } + + return obj; + } + + public static GameObject LoadPrefab(string assetBundleRelativeDir, string pathInBundle, IModBehaviour mod) + { + var prefab = Load(assetBundleRelativeDir, pathInBundle, mod); + + prefab.SetActive(false); + + ReplaceShaders(prefab); + + return prefab; + } + + public static void ReplaceShaders(GameObject prefab) + { + foreach (var renderer in prefab.GetComponentsInChildren(true)) + { + foreach (var material in renderer.sharedMaterials) + { + if (material == null) + { + continue; + } + + var replacementShader = Shader.Find(material.shader.name); + if (replacementShader != null) material.shader = replacementShader; + } + } + } + } +}