我对团结编程比较陌生,之前从未使用过assetbundles。我使用的示例项目,每个人都可以从统一网站下载并根据我的需要进行调整,我已经知道如何使用加载场景功能,这是我需要的,但加载场景脚本我目前正在使用的不会下载资产包,而是从计算机中已有的地方加载资产包。 我正在研究Android / IOS应用程序,我们的目标是创建一个简单的菜单场景,然后从服务器下载资产包并加载场景。用户下载后,所有数据都需要存储在手机中。我尝试了所有的东西,但我无法使它工作,即使统一文档中的代码似乎也不适合我。如果有人可以帮助我,请参阅LoadScenes脚本的代码。我对统一资产包管理器附带的原始代码所做的唯一修改是包的名称和场景的名称通过按钮传递。此脚本当前从计算机中的文件夹加载捆绑包,这不是我需要的,我需要从服务器下载捆绑包然后从设备中的文件夹加载。谢谢!
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" );
}
}
答案 0 :(得分: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.
}
}
}