2017-05-05 2 views
0

Ich erstelle einen Editor für ein Spiel mit der Unity-Game-Engine und möchte einem Designer erlauben, neue Zaubersprüche zu erstellen. Was ich versuche zu erreichen, ist, dass ein Designer ein Unity-Partikelsystem (oder GameObject) herunterlädt, es auf dem Computer speichert und dem Spiel den vollständigen Pfad gibt. Dann sollte das Spiel das Objekt laden und es als Partikel für einen neuen Zauber verwenden.Unity-Asset-Bundles

Ich muss ein Unity GameObject (Partikelsystem) während der Laufzeit von einem Ordner laden können. Ich habe es mit Asset Bundles versucht, aber ich weiß nicht, wie ich Asset Bundles verwenden kann, wenn ich die Datei nur vom Computer (lokales Dateisystem) und nicht vom Server herunterladen möchte. Asset-Bundles funktionieren perfekt im Debug, aber nicht, wenn ich sie erstelle und ausführe (sie versucht stattdessen, sich mit einem Server zu verbinden). Ich verwende den Standard-Skript für Asset Bundles erhältlich:

public class LoadAssets : MonoBehaviour 
    public const string AssetBundlesOutputPath = "/AssetBundles/"; 
    public string assetBundleName; 
    public string assetName; 

    public GameObject loadedObject; 
    public bool finished; 
    public MessageWindow messWindow; 

    // Use this for initialization 
    //originally was start here might create problems 
    public IEnumerator Begin() 
    { 
     messWindow.changeMessageAndShow("Asset " + assetName + " is loading.","Loading"); 
     yield return StartCoroutine(Initialize()); 

     // Load asset. 
     yield return StartCoroutine(InstantiateGameObjectAsync (assetBundleName, assetName)); 
     finished=true; 
     messWindow.Close(); 
    } 

    public GameObject LoadObject() 
    { 
     StartCoroutine(Begin()); 
     //TODO wait for end of couroutine 
     return loadedObject; 
    } 

    // Initialize the downloading url and AssetBundleManifest object. 
    protected 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: 

     // Or customize the URL based on your deployment or configuration 
     //AssetBundleManager.SetSourceAssetBundleURL("http://www.MyWebsite/MyAssetBundles"); 
#endif 
     AssetBundleManager.SetSourceAssetBundleURL(Application.dataPath + "/"); 

     // Initialize AssetBundleManifest which loads the AssetBundleManifest object. 
     var request = AssetBundleManager.Initialize(); 
     if (request != null) 
      yield return StartCoroutine(request); 
    } 

    protected IEnumerator InstantiateGameObjectAsync (string assetBundleName, string assetName) 
    { 
     // This is simply to get the elapsed time for this phase of AssetLoading. 
     float startTime = Time.realtimeSinceStartup; 

     // Load asset from assetBundle. 
     AssetBundleLoadAssetOperation request = AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(GameObject)); 
     if (request == null) 
      yield break; 
     yield return StartCoroutine(request); 

     // Get the asset. 
     GameObject prefab = request.GetAsset<GameObject>(); 

     if (prefab != null) 
     { 
      loadedObject = GameObject.Instantiate(prefab);    
      DontDestroyOnLoad(loadedObject); 
     } 

     // Calculate and display the elapsed time. 
     float elapsedTime = Time.realtimeSinceStartup - startTime; 
     Debug.Log(assetName + (prefab == null ? " was not" : " was")+ " loaded successfully in " + elapsedTime + " seconds"); 
    } 
} 

Sie so vielen Dank.

Antwort

0

Um das Asset-Paket vom lokalen System zu laden, benötigen Sie den lokalen AssetBundle-Server. Wenn der lokale Asset-Server aktiviert ist, müssen AssetBundles in einem Ordner namens AssetBundles im Stammverzeichnis des Projekts erstellt und platziert werden, das sich auf derselben Ebene wie der Ordner Assets befindet.

Die erstellten AssetBundles stehen dem Editor und allen lokal ausgeführten Builds zur Verfügung, die den Editor im lokalen Netzwerk erreichen können.

Verwenden Sie Assets>AssetBundles>Local AssetBundle Server, um den lokalen AssetBundle-Server zu aktivieren.

Reference zu Asset-Bundles und Asset-Bundle-Manager.

+0

Kann ich ein Asset-Paket mit einem anderen Unity-Projekt erstellen und es dann in den Ordner meines Projekts verschieben oder muss ich das Assetbundle in meinem Unity-Projekt erstellen? Ich muss dem Designer erlauben, sein eigenes Unity-Objekt zu erstellen (oder herunterzuladen) und dann meinem Spiel erlauben, es zu installieren, ohne dass der Designer mein Unity-Projekt öffnet und neu erstellt. Vielen Dank. – Justeagle11

+0

@justeagle, ja, es ist möglich, das Asset-Bundle über Unity-Projekte zu teilen. So kann Ihr Designer ein Asset-Paket in seinem eigenen Projekt erstellen, und dann kann Ihr Spiel dieses Asset-Paket verwenden. –

+0

Aber wie schicke ich es zurück zu meinem Projekt? Ich meine, sobald mein Projekt gebaut wird, ist der einzige Ordner Unity_data, in dem die Verwaltet, Mono und Ressourcen, also wo soll ich das AssetBundle aus dem anderen Projekt (wenn es im AssetBunlde-Ordner sein sollte)? Der Designer wird nur mein gebautes Projekt erhalten, kann er es trotzdem schaffen, das Asset-Paket ins Spiel zu bringen? Vielen Dank. – Justeagle11