unity動態加載FBX模型(Http下載到Rescources文件,場景Load直接調用):


using UnityEngine;

using System.Collections;

using System.IO;

using System.Net;

using System;

using UnityEditor;   

public class WWWLoad : MonoBehaviour

{

    //string urlPath = "http://www.....";

    string urlPath = @"http://localhost:8080/fbx/test.FBX";//資源網絡路徑(自己寫)

    string file_SaveUrl = @"D:\UnityProjects\TEST2\START\Assets\Resources\1比1.FBX";//資源保路徑

    FileInfo file;

    bool isLoadModel=false;

    HttpDldFile httpDown_O;

 

    //初始化

    void Start()

    {

        file = new FileInfo(file_SaveUrl);

        httpDown_O = new HttpDldFile();

        Debug.Log(file_SaveUrl);

      

    }

    //啟動下載

    public void WWWmodelsa()

    {

        bool run_f = httpDown_O.Download(urlPath, file_SaveUrl);

        AssetDatabase.Refresh();//unity刷新

        isLoadModel = true;

        Debug.Log(urlPath);

    }

    //實例化模型

    public void LoadModelas()

    {

        if (isLoadModel)

        {

              //GameObject objPrefab = (GameObject)Instantiate(AssetDatabase.LoadAssetAtPath(filePath,typeof(GameObject)));  

            //GameObject objPrefab = (MonoBehaviour.Instantiate(mPrefab, Vector3.zero, Quaternion.identity) as GameObject);

            GameObject objPrefab = (GameObject)Resources.Load("1比1");

            Instantiate(objPrefab);

            Debug.Log(objPrefab.GetType().ToString());

        }

       

    }

}

class HttpDldFile

{

    // Http方式下載文件

    public bool Download(string url, string localfile)

    {

        bool flag = false;

        long startPosition = 0; // 上次下載的文件起始位置

        FileStream writeStream; // 寫入本地文件流對象

 

        // 判斷要下載的文件夾是否存在

        if (File.Exists(localfile))

        {

            writeStream = File.OpenWrite(localfile);             // 存在則打開要下載的文件

            startPosition = writeStream.Length;                  // 獲取已經下載的長度

            writeStream.Seek(startPosition, SeekOrigin.Current); // 本地文件寫入位置定位

        }

        else

        {

            writeStream = new FileStream(localfile, FileMode.Create);// 文件不保存創建一個文件

            startPosition = 0;

        }

        try

        {

            HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);// 打開網絡連接

 

            if (startPosition > 0)

            {

                myRequest.AddRange((int)startPosition);// 設置Range值,與上面的writeStream.Seek用意相同,是為了定義遠程文件讀取位置

            }

            Stream readStream = myRequest.GetResponse().GetResponseStream();// 向服務器請求,獲得服務器的回應數據流

 

            byte[] btArray = new byte[512];// 定義一個字節數據,用來向readStream讀取內容和向writeStream寫入內容

            int contentSize = readStream.Read(btArray, 0, btArray.Length);// 向遠程文件讀第一次

 

            while (contentSize > 0)// 如果讀取長度大於零則繼續讀

            {

                writeStream.Write(btArray, 0, contentSize);// 寫入本地文件

                contentSize = readStream.Read(btArray, 0, btArray.Length);// 繼續向遠程文件讀取

            }

 

            //關閉流

            writeStream.Close();

            readStream.Close();

 

            flag = true;        //返回true下載成功

        }

        catch (Exception e)

        {

            writeStream.Close();

            flag = false;       //返回false下載失敗

        }

        return flag;

    }

}

注:命名空間,加載路徑,數據流的接收與大小,會造成卡頓情況,是否打包Apk需要注意using UnityEditor;  AssetDatabase.Refresh();//unity刷新.....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM