diff --git a/Reactor.Assets/Assets/Build.cs b/Reactor.Assets/Assets/Build.cs
index 7d47946..f214338 100644
--- a/Reactor.Assets/Assets/Build.cs
+++ b/Reactor.Assets/Assets/Build.cs
@@ -69,14 +69,14 @@ public static void BuildAssetBundles()
}
}
- private static string GetTargetName(BuildTarget target)
+ private static string GetTargetName(BuildTarget target, bool includeArchitecture = false)
{
return target switch
{
- BuildTarget.StandaloneWindows => "win-x86",
- BuildTarget.StandaloneWindows64 => "win-x64",
+ BuildTarget.StandaloneWindows => includeArchitecture ? "win-x86" : "win",
+ BuildTarget.StandaloneWindows64 => includeArchitecture ? "win-x64" : "win",
BuildTarget.Android => "android",
- BuildTarget.StandaloneLinux64 => "linux-x64",
+ BuildTarget.StandaloneLinux64 => includeArchitecture ? "linux-x64" : "linux",
_ => throw new ArgumentOutOfRangeException(nameof(target), target, null),
};
}
diff --git a/Reactor/Assets/default-win-x86.bundle b/Reactor/Assets/default-win.bundle
similarity index 100%
rename from Reactor/Assets/default-win-x86.bundle
rename to Reactor/Assets/default-win.bundle
diff --git a/Reactor/Utilities/AssetBundleManager.cs b/Reactor/Utilities/AssetBundleManager.cs
index 6645864..afc86cd 100644
--- a/Reactor/Utilities/AssetBundleManager.cs
+++ b/Reactor/Utilities/AssetBundleManager.cs
@@ -3,8 +3,8 @@
using System.IO;
using System.Linq;
using System.Reflection;
+using System.Runtime.InteropServices;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
-using MonoMod.Utils;
using Reactor.Utilities.Extensions;
using UnityEngine;
@@ -23,38 +23,48 @@ public static class AssetBundleManager
///
/// Gets the target name of the current system.
///
- public static string TargetName { get; }
+ [Obsolete("Use AssetBundleManager#GetTargetName instead")]
+ public static string TargetName { get; } = GetTargetName(true);
- static AssetBundleManager()
+ ///
+ /// Gets the target name of the current system.
+ ///
+ /// A value indicating whether to include the process architecture.
+ /// Target name of the current system.
+ public static string GetTargetName(bool includeArchitecture)
{
- if (PlatformHelper.Is(Platform.Android))
+ string operatingSystem;
+
+ if (OperatingSystem.IsWindows())
{
- TargetName = "android";
+ operatingSystem = "win";
+ }
+ else if (OperatingSystem.IsLinux())
+ {
+ operatingSystem = "linux";
+ }
+ else if (OperatingSystem.IsAndroid())
+ {
+ operatingSystem = "android";
}
else
{
- if (PlatformHelper.Is(Platform.Windows))
- {
- TargetName = "win";
- }
- else if (PlatformHelper.Is(Platform.Linux))
- {
- TargetName = "linux";
- }
- else
- {
- throw new PlatformNotSupportedException();
- }
+ throw new PlatformNotSupportedException();
+ }
- if (PlatformHelper.Is(Platform.ARM))
- {
- TargetName += Environment.Is64BitProcess ? "-arm64" : "-arm";
- }
- else
- {
- TargetName += Environment.Is64BitProcess ? "-x64" : "-x86";
- }
+ if (!includeArchitecture)
+ {
+ return operatingSystem;
}
+
+ return $"{operatingSystem}-{RuntimeInformation.ProcessArchitecture switch
+ {
+ Architecture.X86 => "x86",
+ Architecture.X64 => "x64",
+ Architecture.Arm => "arm",
+ Architecture.Arm64 => "arm64",
+ _ => throw new PlatformNotSupportedException(),
+ }}";
}
///
@@ -62,7 +72,16 @@ static AssetBundleManager()
///
/// The name of the asset bundle.
/// File name of the asset bundle.
- public static string GetFileName(string assetBundleName) => $"{assetBundleName}-{TargetName}{BundleExtension}";
+ [Obsolete("Use the overload with includeArchitecture instead")]
+ public static string GetFileName(string assetBundleName) => GetFileName(assetBundleName, true);
+
+ ///
+ /// Gets the file name for an asset bundle named .
+ ///
+ /// The name of the asset bundle.
+ /// A value indicating whether to include the process architecture.
+ /// File name of the asset bundle.
+ public static string GetFileName(string assetBundleName, bool includeArchitecture) => $"{assetBundleName}-{GetTargetName(includeArchitecture)}{BundleExtension}";
private static bool TryFindFile(Assembly assembly, string fileName, [NotNullWhen(true)] out string? path)
{
@@ -72,6 +91,7 @@ private static bool TryFindFile(Assembly assembly, string fileName, [NotNullWhen
var filePath = Path.Combine(pluginDirectoryPath, fileName);
if (File.Exists(filePath))
{
+ Debug($"Loading an asset bundle from {filePath}");
path = filePath;
return true;
}
@@ -86,6 +106,8 @@ private static bool TryLoadResource(Assembly assembly, string fileName, [NotNull
var resourceName = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName, StringComparison.Ordinal));
if (resourceName != null)
{
+ Debug($"Loading an asset bundle from {resourceName}");
+
using var stream = assembly.GetManifestResourceStream(resourceName) ?? throw new InvalidOperationException("Resource stream was null");
var length = (int) stream.Length;
@@ -119,8 +141,13 @@ public static AssetBundle Load(string name)
/// Couldn't find an assetbundle named .
public static AssetBundle Load(Assembly assembly, string name)
{
- var fileName = GetFileName(name);
+ return TryLoad(assembly, GetFileName(name, includeArchitecture: true))
+ ?? TryLoad(assembly, GetFileName(name, includeArchitecture: false))
+ ?? throw new AssetBundleNotFoundException(name);
+ }
+ private static AssetBundle? TryLoad(Assembly assembly, string fileName)
+ {
if (TryFindFile(assembly, fileName, out var filePath))
{
return AssetBundle.LoadFromFile(filePath);
@@ -131,7 +158,7 @@ public static AssetBundle Load(Assembly assembly, string name)
return AssetBundle.LoadFromMemory(data);
}
- throw new AssetBundleNotFoundException(name);
+ return null;
}
///
@@ -154,8 +181,13 @@ public static AssetBundleCreateRequest LoadAsync(string name)
/// Couldn't find an assetbundle named .
public static AssetBundleCreateRequest LoadAsync(Assembly assembly, string name)
{
- var fileName = GetFileName(name);
+ return TryLoadAsync(assembly, GetFileName(name, includeArchitecture: true))
+ ?? TryLoadAsync(assembly, GetFileName(name, includeArchitecture: false))
+ ?? throw new AssetBundleNotFoundException(name);
+ }
+ private static AssetBundleCreateRequest? TryLoadAsync(Assembly assembly, string fileName)
+ {
if (TryFindFile(assembly, fileName, out var filePath))
{
return AssetBundle.LoadFromFileAsync(filePath);
@@ -166,7 +198,7 @@ public static AssetBundleCreateRequest LoadAsync(Assembly assembly, string name)
return AssetBundle.LoadFromMemoryAsync(data);
}
- throw new AssetBundleNotFoundException(name);
+ return null;
}
}