-
Notifications
You must be signed in to change notification settings - Fork 0
/
CodeBundleLoader.cs
104 lines (84 loc) · 3.45 KB
/
CodeBundleLoader.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
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
namespace CodeBundle
{
/// <summary>
/// Loads assets from bundles and causes events upon success or failure.
/// </summary>
public class CodeBundleLoader : MonoBehaviour
{
public bool ForceUseAssetBundle;
public bool DebugMode;
public UnityEvent OnLoaded;
public UnityEvent OnError;
public CodeBundleState State;
public void StartLoading()
{
StartCoroutine(Loading());
}
private IEnumerator Loading()
{
if ((State = CodeBundleState.CheckAndLoad(State)) == null)
{
OnError.Invoke();
yield break;
}
var platformPrefix = Application.platform.ToString();
if (!Application.isEditor || ForceUseAssetBundle)
{
var assetBundleRequests = new Queue<string>();
assetBundleRequests.Enqueue(State.MainAssetBundleName);
while (assetBundleRequests.Any())
{
var bundleName = assetBundleRequests.Dequeue();
Debug.Log("Loading asset bundle " + bundleName);
using (var abRequest =
UnityWebRequestAssetBundle.GetAssetBundle($"{State.RemoteUrl}{platformPrefix}/{bundleName}"))
{
yield return abRequest.SendWebRequest();
if (abRequest.isNetworkError || abRequest.isHttpError)
{
Debug.LogError(
$"Asset Bundle load request failed. Code:{abRequest.responseCode}, error: {abRequest.error}");
OnError.Invoke();
yield break;
}
var assetBundle = DownloadHandlerAssetBundle.GetContent(abRequest);
State.AssetBundles[bundleName] = assetBundle;
if (assetBundle.isStreamedSceneAssetBundle)
{
continue;
}
var manifest = assetBundle.LoadAsset<AssetBundleManifest>("assetbundlemanifest");
if (manifest == null)
{
continue;
}
foreach (var depenedetAsset in manifest.GetAllAssetBundles())
{
assetBundleRequests.Enqueue(depenedetAsset);
}
}
}
foreach (var assetBundle in State.AssetBundles.Values)
{
foreach (var assetName in assetBundle.GetAllAssetNames())
{
if (DebugMode)
{
Debug.Log($"asset `{assetName}` place in {assetBundle.name}");
}
State.AssetBundles[assetName] = assetBundle;
}
}
}
Debug.Log("Loading finish");
OnLoaded.Invoke();
yield return null;
}
}
}