-
Notifications
You must be signed in to change notification settings - Fork 1
/
AssetBundleLib_IL2CPP.cs
145 lines (117 loc) · 4.08 KB
/
AssetBundleLib_IL2CPP.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using Il2CppSystem.Linq;
using UnhollowerRuntimeLib;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Libraries
{
public class AssetBundleLib
{
/// <summary>
/// The Loaded AssetBundle, Null By Default
/// </summary>
internal AssetBundle bundle = null;
internal bool HasLoadedABundle = false;
internal string error = "";
/// <summary>
/// Loads An Asset Bundle For Using Data Such As Sprites
/// </summary>
/// <param name="resource">The Path To The Embedded Resource File - Example: CVRButtonAPI.Resources.plaguelogo.asset</param>
/// <returns>True If Successful</returns>
public bool LoadBundle(string resource)
{
if (HasLoadedABundle)
{
return true;
}
try
{
if (string.IsNullOrEmpty(resource))
{
error = "Null Or Empty Resource String!";
return false;
}
var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource);
if (stream != null && stream.Length > 0)
{
var memStream = new MemoryStream((int)stream.Length);
stream.CopyTo(memStream);
if (memStream.Length > 0)
{
return LoadBundle(memStream.ToArray());
}
error = "Null memStream!";
}
else
{
error = "Null Stream!";
}
var resourcename = resource.Replace(resource.Substring(resource.LastIndexOf(".")), "").Substring(resource.LastIndexOf("."));
var assetBundle = AssetBundle.GetAllLoadedAssetBundles_Native().First(o => o.name == resourcename);
assetBundle.hideFlags |= HideFlags.DontUnloadUnusedAsset;
bundle = assetBundle;
return false;
}
catch (Exception ex)
{
error = ex.ToString();
return false;
}
}
/// <summary>
/// Loads An Asset Bundle For Using Data Such As Sprites
/// </summary>
/// <param name="resource">The byte[] Of The Embedded Resource File - Example: Properties.Resources.plaguelogo.asset</param>
/// <returns>True If Successful</returns>
public bool LoadBundle(byte[] resource)
{
if (HasLoadedABundle)
{
return true;
}
try
{
var assetBundle = AssetBundle.LoadFromMemory(resource);
if (assetBundle != null)
{
assetBundle.hideFlags |= HideFlags.DontUnloadUnusedAsset;
bundle = assetBundle;
HasLoadedABundle = true;
return true;
}
HasLoadedABundle = true;
}
catch (Exception ex)
{
error = ex.ToString();
return false;
}
return false;
}
/// <summary>
/// Loads An Asset From The Previously Loaded AssetBundle
/// </summary>
/// <param name="str">The Internal Name Of The Asset Inside The AssetBundle</param>
/// <returns>The Asset You Searched For, Null If No AssetBundle Was Previously Loaded</returns>
internal T Load<T>(string str) where T : Object
{
try
{
if (HasLoadedABundle)
{
var Asset = bundle.LoadAsset(str, Il2CppType.Of<T>()).Cast<T>();
Asset.hideFlags |= HideFlags.DontUnloadUnusedAsset;
return Asset;
}
}
catch (Exception ex)
{
error = ex.ToString();
}
return null;
}
}
}