1)關於Addressables作啓動熱更資源的路徑問題
2)Unity 2018 Android平臺Blit Type設置爲Never時畫面會變暗
3)視頻壓縮方案
4)關於AssetBundle中的資源冗餘的問題
5)Addressable如何讓加載的時候不對比服務器css
UWA 問答社區:answer.uwa4d.com
UWA QQ羣2:793972859(原羣已滿員)html
Addressable
Q:關於Addressables作啓動熱更資源的路徑問題,將部分資源在可尋址系統裏打入了StreamAssets,並將資源設置Cannot Release。打出程序後修改資源,作熱更流程,而後運行程序也正常檢測熱更並下載,可是下載的更新AssetBundle包並不在PersistentDataPath路徑下。若是是在同一機器下,熱更包會在Unity編輯器的Temp路徑下找到,但是我將程序拿到什麼都沒裝的新電腦下,程序仍是能檢測熱更下載,但PersistentDataPath仍然看不到熱更AssetBundle,求解。json
A1:Addressable下載更新用的是緩存的方式,因此不會在PersistentDataPath裏面,會在應用的默認緩存目錄裏面,以下圖:緩存
若是須要修改緩存的路徑,這個能夠試下: 最後拉進去AddressableAssetSettings的Initialization Object列表裏就行。
感謝Toushirou@UWA問答社區提供了回答服務器
A2:感謝您的幫助,該方式確實能夠重寫緩存路徑。值得注意的是Cache Directory Override並不能徹底像Addressables Profiles里路徑同樣配置可變路徑,只支持了帶「{}」的方式,如{UnityEngine.Application.persistentDataPath},帶「[]」則不支持配置。再次感謝層主的幫助!網絡
另外,上層Cache Directory Override最終調用的源碼,可根據本身的需求拓展,以下圖:app
感謝題主兮風@UWA問答社區提供了回答異步
A3:在安卓手機上安裝一個apk,而且運行以後,假設這個apk的包名叫com.x.y,會在安卓手機上多3個目錄:
目錄1:sdcard/Android/data/com.x.y,這個目錄下有一個cache目錄。
目錄2:data/app/com.x.y-1,這個目錄下有目錄lib和目錄oat,還有一個base.apk。
目錄3:data/data/com.x.y,這個目錄下有有5個目錄,files,shared_prefs,cache,code_cache,lib。
上面的目錄1的sdcard和目錄2的data是同級的。目錄2和目錄3須要root才能看到,沒有root的手機應該是隻能看到sdcard下面的文件。編輯器當我運行Addressable進行遠程加載資源後,在目錄1裏面多了一個與cache同級的files目錄,這個files目錄應該就是Application.persistentDataPath。在這個files目錄裏面會多兩個目錄,分別是com.unity.addressables,這裏面放的是catalog.hash和catalog.json,另一個是UnityCache目錄,裏面有兩個目錄,Shared和Temp,Temp是空的,Shared裏面放的是下載的AssetBundle。ide
Addressable使用的是Caching機制,因此是能夠經過相似於Caching.currentCacheForWriting = Caching.AddCache(「D:/Shalou/UnityCaching/」);這樣的操做在PC上更改緩存目錄的,在Android平臺上應該也是能夠的,這個就和安卓的權限有關係了,沒有作進一步的測試。猜想是,若是沒有開啓External的Write Permission,只能在目錄1下面的files目錄裏面進行目錄替換了,也就是隻能在Application.persistentDataPath後面添加子目錄來更改緩存目錄。
在PC上,題主說的默認的緩存和persistentDataPath確實是兩個路徑,以下圖:
感謝Xuan@UWA問答社區提供了回答
Rendering
Q:有看到說Blit Type設置爲Always會多出一次Blit操做,在2018下在真機測試了下出現相似對比度變大,畫面變暗的效果。改回Always就正常。
色彩空間爲線性空間。
這項設置有什麼講究?
A:AndroidBlitType.Never不提供sRGB後備緩衝區。線性渲染須要一個執行sRGB讀/寫轉換的幀緩衝區(請參閱RenderTexture.sRGB),不然生成的圖像一般顯得太暗。所以,在使用線性渲染時,不建議使用AndroidBlitType.Never。若是想使用AndroidBlitType.Never進行線性渲染,儘管有這些信息,您仍然必須設置本身的sRGB渲染目標並處理針對後備緩衝區的Blit操做。
能夠參考一下網址:
https://docs.unity.cn/cn/current/ScriptReference/AndroidBlitType.html
https://docs.unity3d.com/ScriptReference/AndroidBlitType.html
感謝小埃拉@UWA問答社區提供了回答
Video
Q:請教一下,對於視頻來說有什麼比較合適的壓縮方案?目前咱們原始視頻有近60MB,準備壓縮後放入StreamingAssets下,讀取解壓後播放。除了對VideoClip自己作處理外,還有其餘方案麼?但願Android和iOS平臺都通用。
A1:能夠試試壓縮成H.264或者H.265編碼的MP4格式視頻。
感謝馬三小夥兒@UWA問答社區提供了回答
A2:H.264兼容各平臺在Unity 2018上。
感謝Eureka@UWA問答社區提供了回答
Assetbundle
Q:用UWA檢測AssetBundle資源冗餘時,發現有17個資源冗餘,可是經過對比查詢Bundle的Manifest文件,發現這些冗餘的資源都會單獨打包成一個AssetBundle,而且沒有存在於本身預設資源中,可是UWA給的結論是這份冗餘的資源存在於他所在的各個預設當中,請問是怎麼解?
A:我也是當初遇到的問題,Manifest沒有這個冗餘,AssetBundle加載進來,內存裏你也沒有發現這個冗餘,調用GetAllAssetNames也看不到這個冗餘的名字,可是若是調用LoadAllAssets,就出現了這個冗餘,很是神奇,藏的很隱祕。
緣由:Rawimage掛的Texture,ParticleSystem引用UI資源。
冗餘的危害我就不說了。解決方案:若是說盡可能保證Rawimage的圖和Prefab等資源打到一個AssetBundle,這個有點難,也很累,排查起來比較困難。
個人解決方案:
除了Background,禁止Rawimage掛Texture,而說實話,個人Background都作了RGBA分離,因此Rawimage掛的是Material,而Rawiamge不掛Texture是由於咱們項目都是異步加載了的,儘可能保證Prefab先出來,後面不重要的異步出來。
禁止粒子特效掛在到UI的Prefab上,而且寫工具,禁止粒子特效的Prefab引用UI資源,因爲粒子特效ParticleSystem描述文件缺失大,若是掛在UI上,還會形成Prefab可能上M數量級,影響加載速度,同時粒子特效和UIPrefab分離,也不會形成冗餘。
感謝夏霖銳@UWA問答社區提供了回答
Addressable
Q:想作傳統的那種,在進入遊戲的時候統一加載更新,而不是目前這種,讀取某個界面,就去服務器判斷。
如今的問題是怎麼讓每一次加載的時候不去判斷服務器,而在進入的時候判斷所有更新。
A:能夠在遊戲啓動的時候在一個專門的更新界面作更新,具體作法是先初始化,而後調用GetDownloadSizeAsync和Addressables.DownloadDependenciesAsync進行AssetBundle更新(Addressable是以AssetBundle爲最小更新單元的),這樣就會將全部須要更新的AssetBundle緩存到本地了,下次用到這些資源就不用遠程下載了。大體代碼以下:
IEnumerator Start() { //只要打包的時候不要將Disable Catalog Update on Startup勾選上就行,這樣初始化的時候會自動更新Catalog到最新 yield return Addressables.InitializeAsync(); IEnumerable<IResourceLocator> locators = Addressables.ResourceLocators; List<object> keys = new List<object>(); //暴力遍歷全部的key foreach (var locator in locators) { foreach(var key in locator.Keys) { keys.Add(key); } } var handle = Addressables.GetDownloadSizeAsync(keys); yield return handle; long downloadSize = handle.Result; if (downloadSize > 0) { yield return Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union, true); } }
在遊戲過程當中,Addressable初始化之後,只要不調用Addressables.CheckForCatalogUpdates和Addressables.UpdateCatalogs,內存中常駐的Catalog生成的映射表對象是不會發生改變的,就算把服務器的Catalog和資源更新了也不會影響客戶端的運行。
感謝Xuan@UWA問答社區提供了回答
封面圖來源於網絡
今天的分享就到這裏。固然,生有涯而知無涯。在漫漫的開發週期中,您看到的這些問題也許都只是冰山一角,咱們早已在UWA問答網站上準備了更多的技術話題等你一塊兒來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。
官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com 官方技術QQ羣:793972859(原羣已滿員)