找回密碼
 注冊帳號

掃一掃,訪問微社區

搶樓 搶樓 本帖為搶樓帖,歡迎搶樓! 

其他 unity動態加載遠程資源

0
回復
846
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
6蠻牛粉絲
1248/1500
排名
8824
昨日變化

476

主題

489

帖子

1248

積分

Rank: 6Rank: 6Rank: 6

UID
39135
好友
5
蠻牛幣
1284
威望
0
注冊時間
2014-8-10
在線時間
118 小時
最后登錄
2015-4-20
樓主
2015-10-20 13:53:14 只看該作者 回帖獎勵 閱讀模式

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
unity動態加載遠程資源的相關話題網上有一些,但都語焉不詳,經過本人的摸索,終于找到門道,記錄下來備忘,也分享給同好。

unity動態加載遠程資源需要用到unity的一個runtime class,叫做WWW,可以在幫助里面的Scripting中找到。

WWW類有兩個重要的方法用來加載遠程站點上的資源。

一個是WWW,即直接訪問遠程文件。例如:

    function Start(){

        var www : WWW = new WWW("http://yoursite.com/test.jpg"); //開始讀取資源,資源你自己改為自己的

        yield www;//等待加載完成(不會阻塞其它程序運行)

        guiTexture.texture = www.texture; //將加載的資源直接使用到對象上

    }

    見一個GUITexture對象,講上面的代碼復制到一個js腳本中,把這個腳本拖到對象上。點運行,即能看到效果。

    還能用這種方法加載文本、二進制文件等。這時候要用到的是WWW的text和bytes變量,WWW還有一些其他的成員變量,可以參見C:\Program Files\Unity\Editor\Data\Documentation\Documentation\ScriptReference\WWW.html  (假定你的unity安裝在默認目錄下,mac下類推。當然可以直接在unity的菜單中選help->scripting reference)



二是WWW.LoadFromCacheOrDownload

    這是個靜態函數,參數為一個url字符串和一個整數的版本號,功能是從url指定的位置下載(如果沒有緩存到本地),如果第二次訪問相同版本的該資源,則會從本地磁盤的緩存中加載(這對webgame來說是個好消息)。

    下面是用法示例:

    function Start(){

        var www : WWW = WWW.LoadFromCacheOrDownload("http://yoursite.com/test.unity3d", 1); //加載

        yield www;  //等待加載完成

        if(www.error != null){//如果出錯,則在控制臺打印錯誤

            print(www.error);

            return;

        }

        var myAssetBundle = www.assetBundle; //得到AssetBundle

        if(myAssetBundle.Contains("New prefab")){//確認AssetBundle中有指定預置對象

            print("ok!");

            var ob = myAssetBundle.Load("New prefab");//加載指定預置對象

            Instantiate(ob, transform.position, transform.rotation);//實例化該預置對象

        }

        else

            print("failed.");

    }

    向項目中添加一個空對象,然后添加一個js腳本,把上面的內容復制到腳本中,再講腳本拖到對象上,運行即能看到效果。

接下來問題來了,test.unity3d這個文件哪里來的呢?或者說我們怎么生成我們自己的.unity3d文件呢?這個問題折騰了我很久,現在總算搞明白了一點。

要生成.unity3d文件,需要在項目目錄的Asset目錄下添加一個Editor目錄,然后在這個目錄下建立一個js腳本,名字隨便取,內容如下:

@MenuItem("Assets/Build AssetBundle From Selection - Track dependencies")
static function ExportResource () {
// Bring up save panel
var path = EditorUtility.SaveFilePanel ("Save Resource", "", "test", "unity3d");
if (path.Length != 0)
{
  // Build the resource file from the active selection.
  var selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
  
  BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets);
  Selection.objects = selection;
}
}

@MenuItem("Assets/Build AssetBundle From Selection - No dependency tracking")
static function ExportResourceNoTrack () {
// Bring up save panel
var path = EditorUtility.SaveFilePanel ("Save Resource", "", "test", "unity3d");
if (path.Length != 0)
{
  // Build the resource file from the active selection.
  BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, path);
}
}

保存后如果unity不報錯,則在你選中project視圖中的目錄或者對象時,點右鍵,菜單中會多出兩個選項

Build AssetBundle From Selection - Track dependencies

Build AssetBundle From Selection - No dependency tracking

當然unity主菜單的Assets中也會多出這兩項,這就是上面Editor目錄下那個腳本的效果。

選中你要的對象或者目錄,點右鍵,選Build AssetBundle From Selection - Track dependencies

在彈出的文件對話框中設定文件名即可。

注意,上面提到了預置對象。這個方法能將預置對象導出到assetbundle中,這是我們最需要的功能。

但是有一個問題,就是assetbundle中不會保存腳本,要想讓預置對象(Prefab)的功能完整,則引用這個預置對象的項目中必須有當初做預置對象(Prefab)時用到的腳本!簡單點,把原來的腳本文件復制到現在項目中,呵呵……


另外還有一個問題,用LoadFromCacheOrDownload加載站點資源需要站點上有crossdomain.xml,這個類似flash的做法。

crossdomain.xml隨便在網上找個就好了,找不到的話自己在站點上(我用xampp,存放在hotdocs目錄下)自己建一個,內容如下,注意把其中的yoursite改成你的站點名,測試可以直接用ip地址。如果偷懶就直接把 *.yoursite.com改為 *

<?xml version="1.0"?>
<cross-domain-policy>
   <allow-access-from domain="*.yoursite.com" />
</cross-domain-policy>

unity動態資源加載;unity熱加載資源;unity動態加載資源;unity加載本地資源;unity加載 資源;unity 資源加載
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

女校游泳队彩金