0

我对统一编程比较陌生,以前从未使用过assetbundles。我正在使用每个人都可以从统一网站下载并根据我的需要进行调整的示例项目,我已经知道如何使用加载场景功能,这是我需要的,但是我的加载场景脚本当前使用不会下载资产包,而是从计算机中已经存在的某个位置加载它。我正在开发一个 Android/IOS 应用程序,我们的目标是创建一个简单的菜单场景,然后从服务器下载资产包并加载场景。用户下载后,所有数据都需要存储在手机中。我尝试了所有方法,但无法使其正常工作,即使统一文档中的代码似乎也不适合我。请,如果有人可以帮助我,这里' s LoadScenes 脚本的代码。我对Unity的资产包管理器附带的原始代码所做的唯一修改是包的名称和场景的名称通过按钮传递。该脚本当前从计算机中的文件夹加载捆绑包,这不是我需要的,我需要从服务器下载捆绑包,然后从设备中的文件夹加载。谢谢!

using UnityEngine;
using System.Collections;
using AssetBundles;
using UnityEngine.UI;


public class LoadScenes : MonoBehaviour{

public string sceneAssetBundle;
public string sceneName;
public string sName;
public string bName;

// Use this for initialization
IEnumerator Start ()
{   
    yield return StartCoroutine(Initialize() );

    // Load level.
    yield return StartCoroutine(InitializeLevelAsync (sceneName, true) );
}

public void getScene(string sName){
    sceneName = sName;

}

public void getBundle(string bName){
    sceneAssetBundle = bName;

}
    // Initialize the downloading url and AssetBundleManifest object.
public IEnumerator Initialize(){


    // Don't destroy this gameObject as we depend on it to run the loading script.
    //DontDestroyOnLoad(gameObject);

    // With this code, when in-editor or using a development builds: Always use the AssetBundle Server
    // (This is very dependent on the production workflow of the project. 
    //  Another approach would be to make this configurable in the standalone player.)
    #if DEVELOPMENT_BUILD || UNITY_EDITOR
    AssetBundleManager.SetDevelopmentAssetBundleServer ();
    #else
    // Use the following code if AssetBundles are embedded in the project for example via StreamingAssets folder etc:
    AssetBundleManager.SetSourceAssetBundleURL(Application.dataPath + "/");
    // Or customize the URL based on your deployment or configuration
     AssetBundleManager.SetSourceAssetBundleURL("http://www.MyWebsite/MyAssetBundles");
    #endif

    // Initialize AssetBundleManifest which loads the AssetBundleManifest object.
    var request = AssetBundleManager.Initialize();

    if (request != null)
        yield return StartCoroutine(request);
}





public IEnumerator InitializeLevelAsync (string levelName, bool isAdditive)
{
    // This is simply to get the elapsed time for this phase of AssetLoading.
    float startTime = Time.realtimeSinceStartup;

    // Load level from assetBundle.
    AssetBundleLoadOperation request = AssetBundleManager.LoadLevelAsync(sceneAssetBundle, levelName, isAdditive);
    if (request == null)
        yield break;
    yield return StartCoroutine(request);

    // Calculate and display the elapsed time.
    float elapsedTime = Time.realtimeSinceStartup - startTime;
    Debug.Log("Finished loading scene " + levelName + " in " + elapsedTime + " seconds" );
}
}
4

1 回答 1

0

我对上面的示例感到困惑,所以我创建了自己的脚本来从资产包中下载场景。在创建一个或多个场景的资产包后,使用以下代码加载场景:-

public class LoadScene : MonoBehaviour {
//public Variables
public string url; // url where your asset bundle is present, can be your hard disk or ftp server
public string AssetBundleName;
public string levelName;
public int version;

//private variables
private AssetBundle assetBundle; 

/*Corountines
By using this, the function will simply stop in that point until the WWW object is done downloading, 
but it will not block the execution of the rest of the code, it yields until it is done.*/
protected IEnumerator LoadTheScene()
{
    if (!Caching.IsVersionCached(url + "/" + AssetBundleName, version)){
        WWW www = WWW.LoadFromCacheOrDownload(url + "/" + AssetBundleName, version);
        yeild return www;
        assetBundle = www.assetBundle;
        www.Dispose();
        if (assetBundle != null)
        {
            string[] path = assetBundle.GetAllScenePaths();
            //below code is for finding the "scene name" from the bundle
            foreach (string temp in path)
            {
                Debug.Log(temp);
                string[] name = temp.Split('/');
                string[] sceneName = name[name.Length - 1].Split('.');
                string result = sceneName[0];
                if (result == levelName)
                {
                    yield return (SceneManager.LoadSceneAsync(result));
                }
            }
        }

    }

    else{
        Debug.Log("Asset Already Cached...");
        yield return Caching.CleanCache();
        //After using an asset bundle you should unload it otherwise an exception will be thrown saying asset bundle is already loaded.. if you use WWW.LoadFromCacheOrDownload again.
    }

}

}

于 2016-06-03T11:07:29.560 回答