diff --git a/src/Core/Runtime/Il2Cpp/AssetBundle.cs b/src/Core/Runtime/Il2Cpp/AssetBundle.cs index 8055878..d950296 100644 --- a/src/Core/Runtime/Il2Cpp/AssetBundle.cs +++ b/src/Core/Runtime/Il2Cpp/AssetBundle.cs @@ -4,48 +4,69 @@ using System.Collections.Generic; using System.Linq; using System.Text; using UnhollowerBaseLib; +using UnhollowerBaseLib.Attributes; using UnhollowerRuntimeLib; using UnityEngine; using UnityExplorer.Core.Runtime.Il2Cpp; namespace UnityExplorer { - public class AssetBundle + public class AssetBundle : UnityEngine.Object { + static AssetBundle() + { + ClassInjector.RegisterTypeInIl2Cpp(); + } + // ~~~~~~~~~~~~ Static ~~~~~~~~~~~~ internal delegate IntPtr d_LoadFromFile(IntPtr path, uint crc, ulong offset); + [HideFromIl2Cpp] public static AssetBundle LoadFromFile(string path) { var iCall = ICallManager.GetICall("UnityEngine.AssetBundle::LoadFromFile_Internal"); - var ptr = iCall.Invoke(IL2CPP.ManagedStringToIl2Cpp(path), 0u, 0UL); + var ptr = iCall(IL2CPP.ManagedStringToIl2Cpp(path), 0u, 0UL); return new AssetBundle(ptr); } - + private delegate IntPtr d_LoadFromMemory(IntPtr binary, uint crc); + [HideFromIl2Cpp] public static AssetBundle LoadFromMemory(byte[] binary, uint crc = 0) { var iCall = ICallManager.GetICall("UnityEngine.AssetBundle::LoadFromMemory_Internal"); - var ptr = iCall(((Il2CppStructArray) binary).Pointer, crc); + var ptr = iCall(((Il2CppStructArray)binary).Pointer, crc); return new AssetBundle(ptr); } + public delegate IntPtr d_GetAllLoadedAssetBundles_Native(); + + [HideFromIl2Cpp] + public static AssetBundle[] GetAllLoadedAssetBundles() + { + var iCall = ICallManager.GetICall("UnityEngine.AssetBundle::GetAllLoadedAssetBundles_Native"); + var ptr = iCall(); + if (ptr == IntPtr.Zero) + return null; + return (AssetBundle[])new Il2CppReferenceArray(ptr); + } + // ~~~~~~~~~~~~ Instance ~~~~~~~~~~~~ - private readonly IntPtr m_bundlePtr = IntPtr.Zero; + public readonly IntPtr m_bundlePtr = IntPtr.Zero; - public AssetBundle(IntPtr ptr) { m_bundlePtr = ptr; } + public AssetBundle(IntPtr ptr) : base(ptr) { m_bundlePtr = ptr; } // LoadAllAssets() internal delegate IntPtr d_LoadAssetWithSubAssets_Internal(IntPtr _this, IntPtr name, IntPtr type); + [HideFromIl2Cpp] public UnityEngine.Object[] LoadAllAssets() { var iCall = ICallManager.GetICall("UnityEngine.AssetBundle::LoadAssetWithSubAssets_Internal"); - var ptr = iCall.Invoke(m_bundlePtr, IL2CPP.ManagedStringToIl2Cpp(""), Il2CppType.Of().Pointer); + var ptr = iCall.Invoke(m_bundlePtr, IL2CPP.ManagedStringToIl2Cpp(""), UnhollowerRuntimeLib.Il2CppType.Of().Pointer); if (ptr == IntPtr.Zero) return new UnityEngine.Object[0]; @@ -57,10 +78,11 @@ namespace UnityExplorer internal delegate IntPtr d_LoadAsset_Internal(IntPtr _this, IntPtr name, IntPtr type); + [HideFromIl2Cpp] public T LoadAsset(string name) where T : UnityEngine.Object { var iCall = ICallManager.GetICall("UnityEngine.AssetBundle::LoadAsset_Internal"); - var ptr = iCall.Invoke(m_bundlePtr, IL2CPP.ManagedStringToIl2Cpp(name), Il2CppType.Of().Pointer); + var ptr = iCall.Invoke(m_bundlePtr, IL2CPP.ManagedStringToIl2Cpp(name), UnhollowerRuntimeLib.Il2CppType.Of().Pointer); if (ptr == IntPtr.Zero) return null; @@ -72,10 +94,11 @@ namespace UnityExplorer internal delegate void d_Unload(IntPtr _this, bool unloadAllLoadedObjects); - public void Unload(bool unloadAssets = true) + [HideFromIl2Cpp] + public void Unload(bool unloadAllLoadedObjects) { var iCall = ICallManager.GetICall("UnityEngine.AssetBundle::Unload"); - iCall.Invoke(this.m_bundlePtr, unloadAssets); + iCall.Invoke(this.m_bundlePtr, unloadAllLoadedObjects); } } }