1. 程式人生 > >專屬妹子開發之AssetBundles伺服器熱更新

專屬妹子開發之AssetBundles伺服器熱更新

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

/*
 使用說明下載
 1、下載MyWebServer伺服器  //簡單使用請看https://www.cnblogs.com/IlidanStormRage/p/6102279.html
 2、下載Demo 連結: https://pan.baidu.com/s/19uS5K2HKbapIPGPubbAk1Q 提取碼: dwji 複製這段內容後開啟百度網盤手機App,操作更方便哦
 3、在伺服器web資料夾下新建一個  //自己在web資料夾裡面新建一個ip的文字,格式為ANSI  ,寫進去伺服器IP,如果要修改IP直接改
                                 //   //自己在web資料夾裡面新建一個version的文字  ,寫進去‘version4’,
 4、把Demo裡面的AssetsBundles裡面所有檔案複製貼上到web資料夾下
 5、只需把clientip修改為伺服器IP,必須保證第一次IP是正確的,後面換伺服器可以在web裡面修改IP, 就可以運行了

     */

//using UnityEngine.Networking;
//如何快速建立一個測試資源Web伺服器及非同步獲取資源(Unity3D)
//https://www.cnblogs.com/IlidanStormRage/p/6102279.html
//有個小想法專屬妹子APP,如果想要直接更換APP裡面的內容。伺服器這邊之前更換AssetsBundle包就直接載入新場景
//新場景怎麼設計都可以
public class LoadAssetsBundles : MonoBehaviour {


    static string IPAndVersion;//本地儲存路徑
    void Start()
    {
        #region 
        //新建本地兩個txt文字分別來儲存當前版本號以及下次更新用到的IP
        IPAndVersion = Application.persistentDataPath + "/ClientInfo";
        if (!Directory.Exists(IPAndVersion))
        {
            Directory.CreateDirectory(IPAndVersion);
            StreamWriter clientVersionTxt = File.CreateText(IPAndVersion + "/version.txt");
            StreamWriter clientIPTxt = File.CreateText(IPAndVersion + "/ip.txt");
            clientVersionTxt.Write(clientVersion);//預設初始版本號
            clientIPTxt.Write(clientip);//預設初始IP
            clientVersionTxt.Close();
            clientIPTxt.Close();
            clientVersionTxt.Dispose();
            clientIPTxt.Dispose();

            Debug.Log(IPAndVersion);
        }
        else
        {

        }
        clientVersion = File.ReadAllText(IPAndVersion + "/version.txt");//獲取本地儲存的版本號
        clientip = File.ReadAllText(IPAndVersion + "/ip.txt");//獲取本地儲存的本次更新用到的伺服器IP地址
        Debug.Log("當前版本號" + clientVersion + "  下次更新伺服器IP." + clientip);
        UpdateIPs(clientip);//更新IP地址
        #endregion

        StartCoroutine(StartAB());
    }
  
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            File.WriteAllText(IPAndVersion + "/version.txt", "123");
            Debug.Log("Space");
        }
    }

    public static string clientVersion = "version1";  //用一個文字存起來吧
    public static string clientip = "192.168.0.70";   //用一個文字存起來吧                //注意txt格式需要為ANSI
    public static string urlNextServerIP = "http://192.168.0.70/ip.txt";//存的是下一次更新用到的伺服器IP地址
    //自己在web資料夾裡面新建一個ip的文字  ,寫進去IP,如果要修改IP直接改
    public static string urlServerVersion = "http://192.168.0.70/version.txt";//存的是伺服器要更新的版本號
    //自己在web資料夾裡面新建一個version的文字  ,寫進去version,如果要修改IP直接改
    public static string url1 = "http://192.168.0.70/scene.unity3d";   //包含場景
    public static string url2 = "http://192.168.0.70/material.unity3d";  //包含場景用到的材質
    public static string url3 = "http://192.168.0.70/texture.unity3d";   //包含場景用到的所有貼圖
    public static string url4 = "http://192.168.0.70/prefab.unity3d";    //包含場景用到的依賴預設
    List<string> urls = new List<string>() { "http://192.168.0.70/ip.txt","http://192.168.0.70/version.txt"
        ,"http://192.168.0.70/scene.unity3d", "http://192.168.0.70/material.unity3d"
    , "http://192.168.0.70/texture.unity3d","http://192.168.0.70/prefab.unity3d","http://192.168.0.70/AssetsBundles"};
    // Use this for initialization
    IEnumerator StartAB () {


        Debug.Log("進來了");
        //下載軟體 MyWebServer伺服器 https://www.cnblogs.com/IlidanStormRage/p/6102279.html
        //使用方法參考連結
        //  把unity  Assets/AssetsBundles  下面的所有打包好的檔案複製貼上到 (MyWebServer目錄的web目錄下)

   
        #region www載入
        WWW wwwServerVersion = new WWW(urls[1]);//獲得伺服器版本號
        yield return wwwServerVersion;
        WWW wwwNextServerIP = new WWW(urls[0]);//獲得下一次更新用到的伺服器IP地址
      
        //WWW wwwYiLai = new WWW(urls[6]);
        // yield return wwwYiLai;
        //先保證版本的正確載入
        Debug.Log("進來了");
        if (wwwServerVersion.error==null)
        {
            Debug.Log("伺服器版本號為:" + wwwServerVersion.text+"=====當前客戶端版本號為:"+clientVersion);
            //如果版本號不一致就需要更新
            if (wwwServerVersion.text!=clientVersion)
            {
                yield return wwwNextServerIP;
                WWW wwwScene = new WWW(urls[2]);//下載場景AB包
                yield return wwwScene;
                WWW wwwMaterial = new WWW(urls[3]);//下載場景用到的材質
                yield return wwwMaterial;
                WWW wwwTexture = new WWW(urls[4]);//下載場景所用到的貼圖
                yield return wwwTexture;
                WWW wwwPrefab = new WWW(urls[5]);//下載場景所用到的預設
                yield return wwwPrefab;
                //更新內容
                Debug.Log("內容更新");
                if (wwwMaterial.error==null&&wwwTexture.error==null&&wwwPrefab.error==null)
                {
                    //AssetBundle abYiLai = wwwYiLai.assetBundle;
                    AssetBundle abMaterial = wwwMaterial.assetBundle;
                    AssetBundle abTexture = wwwTexture.assetBundle;
                    AssetBundle abPrefab = wwwPrefab.assetBundle;

                    //開始載入場景
                    if (wwwScene.error==null)
                    {
                        AssetBundle abScene = wwwScene.assetBundle;

                        //開始載入場景
                        SceneManager.LoadScene("AssetBundleScene");
                    }

                }
                else
                {
                    if (wwwMaterial.error!=null)
                    {
                        Debug.Log("材質下載失敗");
                    }
                    if (wwwTexture.error != null)
                    {
                        Debug.Log("貼圖下載失敗");
                    }
                    if (wwwPrefab.error != null)
                    {
                        Debug.Log("預設下載失敗");
                    }
                }





                //最後需要更新客戶端的版本號              
                File.WriteAllText(IPAndVersion + "/version.txt", wwwServerVersion.text);

                Debug.Log("成功更換版本號為:"+ File.ReadAllText(IPAndVersion + "/version.txt"));
                //如果伺服器IP在下一次更新中變了
                //在本次更新完畢之後更改客戶端存的伺服器IP
                if (wwwNextServerIP.error==null)
                {
                    if (wwwNextServerIP.text != clientip)
                    {
                        clientip = wwwNextServerIP.text;
                        File.WriteAllText(IPAndVersion + "/ip.txt", wwwNextServerIP.text);
                        Debug.Log("成功修改更新完畢後的客戶端IP為下一次更新所用IP"+File.ReadAllText(IPAndVersion + "/ip.txt"));
                      
                    }
                }
                else
                {
                    Debug.Log("無法載入下載下一次更新用到的IP地址");
                }
                
            }
            else
            {
                Debug.Log("版本號一致不需要更新");
            }
        }
        else
        {
            Debug.Log("無法載入版本號"+ wwwServerVersion.error);
        }


      
        #endregion

        StopAllCoroutines();
    }

    //更新IP
    //[ContextMenu("Test")]
    private void UpdateIPs(string serverIP)
    {
        for (int i = 0; i < urls.Count; i++)
        {
            if (urls[i].Contains("192.168.0.70"))
            {
                urls[i] = urls[i].Replace("192.168.0.70", serverIP);
                Debug.Log(urls[i]);
            }
        }
    }

   
  

   
}