Hello There,
I have been trying to stream assetbundles from the Web Server which I own on one of my machines. The site is served by Apache Server application.
I have written the below two very basic script to serve this purpose:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//Model pair structure which is used to store a single string/WWW instance
struct ModelPair{
public string url;
public WWW link;
};
public class ModelLoader: MonoBehaviour {
//Model Request Queue
Queue<ModelPair> queue;
//Models instantiated so far
ArrayList models;
//Awake Method
void Awake(){
queue = new Queue<ModelPair>();
models = new ArrayList();
}
//Fixed Update
void FixedUpdate(){
if( queue.Count > 0 ){
//1. Pick one item from the queue
ModelPair item = queue.Dequeue();
//Debug.Log( "Picked Item: " + item.url )
//2. Check if a WWW is instantiated for item
if( item.link != null ){
// 2.1 If yes check whether if there exists an error in streaming the file
if( item.link.error != null ){
// 2.1.1 If yes log an error message, pop the item and return
Debug.Log( item.link.error );
return;
}
// 2.2 Check whether the file is loaded
if( item.link.isDone ){
// 2.2.1 If yes, instantiate the loaded model insert it to the models array. Pop the item and return
GameObject model = (GameObject)Instantiate( item.link.assetBundle.mainAsset);
models.Add( model );
return;
}
else{
// 2.2.2 If no requeue the file at the end and return
queue.Enqueue( item );
}
}
else{
//3. If not create a new WWW instance for the item
item.link = new WWW( item.url );
queue.Enqueue( item );
return;
}
}
}
//request a model at a particular url location to be loaded by the model loader
//This function enqueues the request to the queue
public void request( string url ){
ModelPair newItem;
newItem.url = url;
newItem.link = null;
queue.Enqueue( newItem );
}
}
I have a second script which uses this one and makes a model request as follows
using UnityEngine;
using System.Collections;
public class SceneObjectStreamer : MonoBehaviour {
//Model loader instance
public ModelLoader modelLoader;
//GUI
public SceneGUI gui;
// Use this for initialization
void Start () {
if( modelLoader != null ){
modelLoader.request("file:///D:/projects/AssetBundleSerialization/assetbundles/athena.unity3d");
}
}
}
The athena.unity3d is the assetbundle I have created correctly with my editor script. Anyway heres the problem. When I try to load this assetbundle from my file system it works correctly and the assetbundle pops up right away in the scene without problems.
However when I replace the URL with "http://www.mywebpage.com/athena.unity3d" I get an error which is:
Failed to load asset bundle UnityEngine.WWW:get_assetBundle() UnityEngine.WWW:get_assetBundle() ModelLoader:FixedUpdate() (at Assets\AssetBundleSerializationAssets\Scripts\Streaming\ModelLoader.cs:47)
Following this one I get a null pointer exception as the "mainAsset" field of the Assetbundle is null now. However this occurs within the "if" which controls whether if the download is finished. So if this is supposed to be a download error then shouldnt it be caught by the previous "if" which checks whether there was an error during streaming?
Can it be related to my Apache Server Configuration? Though I have uploaded my web player there as an html/unity3d file and I can access it on my browser without any problems. So I believe it is not the Apache Server which restricts access to those locations.
Anyone else had similar experience? Could you help?
Thanks a lot,
Ates Akaydin