first commit
This commit is contained in:
105
NitroxClient/Unity/Helper/AssetBundleLoader.cs
Normal file
105
NitroxClient/Unity/Helper/AssetBundleLoader.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
using NitroxModel.Helper;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NitroxClient.Unity.Helper;
|
||||
|
||||
public static class AssetBundleLoader
|
||||
{
|
||||
private static readonly string assetRootFolder = NitroxUser.AssetBundlePath;
|
||||
|
||||
private static bool loadedSharedAssets;
|
||||
|
||||
private static IEnumerator LoadAssetBundle(NitroxAssetBundle nitroxAssetBundle)
|
||||
{
|
||||
if (IsBundleLoaded(nitroxAssetBundle))
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
if (!loadedSharedAssets)
|
||||
{
|
||||
loadedSharedAssets = true;
|
||||
yield return LoadAllAssets(NitroxAssetBundle.SHARED_ASSETS);
|
||||
}
|
||||
|
||||
AssetBundleCreateRequest assetRequest;
|
||||
using (Stream stream = File.Open(Path.Combine(assetRootFolder, nitroxAssetBundle.BundleName), FileMode.Open, FileAccess.Read, FileShare.Read))
|
||||
{
|
||||
assetRequest = AssetBundle.LoadFromStreamAsync(stream);
|
||||
|
||||
if (assetRequest == null)
|
||||
{
|
||||
Log.Error($"Failed to load AssetBundle: {nitroxAssetBundle.BundleName}");
|
||||
yield break;
|
||||
}
|
||||
|
||||
yield return assetRequest;
|
||||
}
|
||||
|
||||
nitroxAssetBundle.AssetBundle = assetRequest.assetBundle;
|
||||
}
|
||||
|
||||
public static IEnumerator LoadAllAssets(NitroxAssetBundle nitroxAssetBundle)
|
||||
{
|
||||
yield return LoadAssetBundle(nitroxAssetBundle);
|
||||
|
||||
AssetBundleRequest loadRequest = nitroxAssetBundle.AssetBundle.LoadAllAssetsAsync();
|
||||
yield return loadRequest;
|
||||
|
||||
|
||||
if (loadRequest.allAssets == null || loadRequest.allAssets.Length == 0)
|
||||
{
|
||||
Log.Error($"Failed to load AssetBundle: {nitroxAssetBundle.BundleName}. It contained no assets");
|
||||
yield break;
|
||||
}
|
||||
|
||||
nitroxAssetBundle.LoadedAssets = loadRequest.allAssets;
|
||||
}
|
||||
|
||||
public static IEnumerator LoadUIAsset(NitroxAssetBundle nitroxAssetBundle, bool hideUI)
|
||||
{
|
||||
yield return LoadAssetBundle(nitroxAssetBundle);
|
||||
|
||||
AssetBundleRequest fetchAssetRequest = nitroxAssetBundle.AssetBundle.LoadAssetAsync<GameObject>(nitroxAssetBundle.BundleName);
|
||||
yield return fetchAssetRequest;
|
||||
|
||||
GameObject asset = UnityEngine.Object.Instantiate(fetchAssetRequest.asset, uGUI.main.screenCanvas.transform, false) as GameObject;
|
||||
|
||||
if (!asset)
|
||||
{
|
||||
Log.Error($"Instantiated assetBundle ({nitroxAssetBundle.BundleName}) but GameObject is null.");
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (hideUI && asset.TryGetComponent(out CanvasGroup canvasGroup))
|
||||
{
|
||||
canvasGroup.alpha = 0;
|
||||
}
|
||||
nitroxAssetBundle.LoadedAssets = new UnityEngine.Object[] { asset };
|
||||
}
|
||||
|
||||
public static bool IsBundleLoaded(NitroxAssetBundle nitroxAssetBundle)
|
||||
{
|
||||
return nitroxAssetBundle.LoadedAssets != null && nitroxAssetBundle.LoadedAssets.Length > 0;
|
||||
}
|
||||
|
||||
// ReSharper disable class StringLiteralTypo, InconsistentNaming
|
||||
public class NitroxAssetBundle
|
||||
{
|
||||
public string BundleName { get; }
|
||||
public AssetBundle AssetBundle { get; set; }
|
||||
public UnityEngine.Object[] LoadedAssets { get; set; }
|
||||
|
||||
private NitroxAssetBundle(string bundleName)
|
||||
{
|
||||
BundleName = bundleName;
|
||||
}
|
||||
|
||||
public static readonly NitroxAssetBundle SHARED_ASSETS = new("sharedassets");
|
||||
public static readonly NitroxAssetBundle PLAYER_LIST_TAB = new("playerlisttab");
|
||||
public static readonly NitroxAssetBundle CHAT_LOG = new("chatlog");
|
||||
public static readonly NitroxAssetBundle CHAT_KEY_HINT = new("chatkeyhint");
|
||||
public static readonly NitroxAssetBundle DISCORD_JOIN_REQUEST = new("discordjoinrequest");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user