XRoom_Unity/Assets/Script/ImportModel/AssetBundleLoaderScene.cs

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;
}
}
}