專屬妹子開發之AssetBundles伺服器熱更新
阿新 • • 發佈:2018-12-25
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]); } } } }