108 lines
3.2 KiB
C#
108 lines
3.2 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
using System.IO;
|
|
using UnityEngine.Networking;
|
|
using UnityEngine.SceneManagement;
|
|
using UnityEngine.UI;
|
|
using TMPro;
|
|
public class AssetBundleLoaderScene : MonoBehaviour
|
|
{
|
|
[Header("UI Elements")]
|
|
public TMP_Text progressText; // Assign this in the Inspector
|
|
public Button startSceneButton; // Assign this in the Inspector
|
|
|
|
[Header("Download Settings")]
|
|
public string assetBundleUrl = "http://yourserver.com/path/to/scene_assetbundle"; // Replace with your real URL
|
|
|
|
private AssetBundle loadedBundle;
|
|
private string sceneNameToLoad;
|
|
|
|
void Start()
|
|
{
|
|
if (progressText != null)
|
|
{
|
|
progressText.text = "0%";
|
|
progressText.gameObject.SetActive(true);
|
|
}
|
|
|
|
if (startSceneButton != null)
|
|
{
|
|
startSceneButton.gameObject.SetActive(false);
|
|
startSceneButton.onClick.AddListener(OnStartSceneClicked);
|
|
}
|
|
|
|
StartCoroutine(DownloadAssetBundle());
|
|
}
|
|
|
|
IEnumerator DownloadAssetBundle()
|
|
{
|
|
using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle(assetBundleUrl))
|
|
{
|
|
uwr.SendWebRequest();
|
|
|
|
while (!uwr.isDone)
|
|
{
|
|
float progress = Mathf.Clamp01(uwr.downloadProgress);
|
|
if (progressText != null)
|
|
progressText.text = $"{(progress * 100f):0.0}%";
|
|
|
|
yield return null;
|
|
}
|
|
|
|
if (uwr.result != UnityWebRequest.Result.Success)
|
|
{
|
|
Debug.LogError("Download failed: " + uwr.error);
|
|
if (progressText != null)
|
|
progressText.text = "Download failed!";
|
|
yield break;
|
|
}
|
|
|
|
loadedBundle = DownloadHandlerAssetBundle.GetContent(uwr);
|
|
if (loadedBundle == null)
|
|
{
|
|
Debug.LogError("Failed to load AssetBundle.");
|
|
if (progressText != null)
|
|
progressText.text = "Load failed!";
|
|
yield break;
|
|
}
|
|
|
|
string[] scenes = loadedBundle.GetAllScenePaths();
|
|
if (scenes.Length == 0)
|
|
{
|
|
Debug.LogError("No scenes found in AssetBundle.");
|
|
if (progressText != null)
|
|
progressText.text = "No scenes in bundle!";
|
|
yield break;
|
|
}
|
|
|
|
sceneNameToLoad = System.IO.Path.GetFileNameWithoutExtension(scenes[0]);
|
|
Debug.Log("Scene ready to load: " + sceneNameToLoad);
|
|
|
|
if (progressText != null)
|
|
progressText.text = "Download complete! Click to start.";
|
|
|
|
if (startSceneButton != null)
|
|
startSceneButton.gameObject.SetActive(true);
|
|
}
|
|
}
|
|
|
|
void OnStartSceneClicked()
|
|
{
|
|
if (!string.IsNullOrEmpty(sceneNameToLoad))
|
|
{
|
|
StartCoroutine(LoadSceneCoroutine());
|
|
}
|
|
}
|
|
|
|
IEnumerator LoadSceneCoroutine()
|
|
{
|
|
if (progressText != null)
|
|
progressText.text = "Loading scene...";
|
|
|
|
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneNameToLoad, LoadSceneMode.Single);
|
|
while (!asyncLoad.isDone)
|
|
{
|
|
yield return null;
|
|
}
|
|
}
|
|
} |