using System.Collections.Generic; using System.Linq; using UnityEngine; namespace NewHorizons.Handlers { /// /// handles streaming meshes so they stay loaded /// public static class StreamingHandler { private static Dictionary _materialCache; private static Dictionary> _objectCache; public static void Init() { _materialCache = new Dictionary(); _objectCache = new Dictionary>(); } public static void OnOccupantEnterSector(GameObject obj, SectorDetector sd, Sector sector) { HookStreaming(obj); // If its too laggy put this back idk /* if (sector.GetOccupants().Count > 0 || sd._occupantType == DynamicOccupant.Player) { LoadObject(obj); } */ } /// /// makes it so that this object's streaming stuff will be connected to the given sector /// public static void HookStreaming(GameObject obj, Sector sector = null) { var assetBundles = new List(); if (_objectCache.ContainsKey(obj)) { assetBundles = _objectCache[obj]; } else { var tables = Resources.FindObjectsOfTypeAll(); foreach (var streamingHandle in obj.GetComponentsInChildren()) { var assetBundle = streamingHandle.assetBundle; if (!assetBundles.Contains(assetBundle)) { assetBundles.Add(assetBundle); } if (streamingHandle is StreamingRenderMeshHandle or StreamingSkinnedMeshHandle) { var materials = streamingHandle.GetComponent().sharedMaterials; if (materials.Length == 0) continue; // Gonna assume that if theres more than one material its probably in the same asset bundle anyway right if (_materialCache.TryGetValue(materials[0], out assetBundle)) { assetBundles.Add(assetBundle); } else { foreach (var table in tables) { foreach (var x in table._materialPropertyLookups) { if (materials.Contains(x.material)) { _materialCache.SafeAdd(x.material, table.assetBundle); assetBundles.SafeAdd(table.assetBundle); } } } } } } _objectCache[obj] = assetBundles; } foreach (var assetBundle in assetBundles) { StreamingManager.LoadStreamingAssets(assetBundle); } } } }