資產可以是 Unity 中的任何資源;這些資源可以是圖像、音頻、視頻、腳本、文本等。
在任何平臺上構建 Unity 項目時,游戲中的所有資產都將“打包”在一個文件中(或更多,取決于您的平臺),構建的結果大小將取決于您決定的資產大小打包在您的游戲中。
創建具有多個高清紋理的游戲而不是使用地圖集,或者使用 240p 視頻而不是使用 1080p 是不一樣的。預計資產規模越大,最終構建的規模就越大。
一般來說,保持構建盡可能輕量級是一個很好的做法,這樣玩家就不會因為大小而放棄下載游戲,而且場景運行速度也會大大加快。
實現這一點有多種提示和技巧,在本文中,我們將討論其中的一些,從流媒體資產開始。
什么是流媒體資產?
假設您的游戲中有一個不錯的場景,所有動作都在其中發生。玩家是敵人的基地,在一個特定的房間里,你決定把一段視頻作為彩蛋放在電腦上播放。
視頻真的很大,超過 300MB,播放器可能會也可能不會進入那個特定的房間才能真正看到它。默認情況下將其加載到您的場景中可以嗎?這可能會導致您的精彩場景出現不必要的緩慢。所以當我們真正需要它時加載它可能會很棒。
流媒體資產就是這樣:放置在特定文件夾中的資產,需要時由 Unity 加載。該資產將被放置在目標平臺內易于找到的地址中。
請注意,放置在流式資產文件夾(在 Unity 中名為 )的任何資產都將被復制到目標平臺,如果用戶在項目文件夾中搜索,它將能夠看到它們。
這就是一些游戲的一些模組的制作方式。
改變角色的紋理?進入數據文件夾并找到使用的紋理,然后對其進行修改。改變強硬老板的臺詞?只需轉到數據文件夾并找到音軌并將其替換為另一個具有相同名稱的音軌。
超過 20 萬開發人員使用 來創造更好的數字體驗了解更多 →
流媒體資產讓游戲運行順暢,無需從內存中加載所有資產,并以易于訪問的路徑提供更大的資產。
讓我們構建一個流媒體資產的簡單示例
我們將通過在您的游戲中顯示視頻,通過一個簡單的示例來展示流媒體資產的工作原理。
我從 下載了此示例的視頻預覽。
確保您要使用的視頻具有以下擴展名之一:.mov、.mpeg、.mp4、.avi、.asf。
對于我們的初始示例,我們將創建一個名為Video的新文件夾并將我們的視頻放在該文件夾中:
然后unity加載本地圖片,在我們的面板上,我們將設置我們的視頻播放器。
右鍵單擊您的 并添加一個Empty Game 。我打電話給我的 。
在其中,我創建了一個立方體,我們將在其中播放視頻;它可以是你想要的任何形狀,但為了方便我選擇了一個立方體。我稱之為。
在的同一級別,在中,我通過右鍵單擊并選擇Videounity加載本地圖片,然后選擇 Video 添加了一個新的Video 對象。
以下是我設置視頻播放器對象的方法:
我們將設置為Video Clip,然后從我們創建的Video 中選擇視頻剪輯,然后選擇Loop以便視頻可以無限播放。
然后,選擇 Mode作為 并拖放要在其上播放視頻的對象——在我們的例子中是立方體。讓 屬性為。
如果您在 Unity 編輯器中單擊播放,您將看到類似這樣的內容:在立方體的每一側播放一個視頻。
如果您想要一個更平坦的表面(如屏幕),您還可以創建一個平面或將立方體的比例縮小到您想要的形狀。
該演示視頻為 3.5MB。
如果我們為獨立平臺(、Linux、MacOs)構建這個項目,我們將看到一個帶有視頻的空白項目,大小為 87.6MB。
現在,讓我們看看使用相同的視頻作為流媒體資產的效果。
為此,我們將在文件夾中創建一個名為的新文件夾;這是一個特殊命名的文件夾,它將我們的視頻文件s視為常規文件,在編輯器的屬性窗口中沒有任何選項。
然后在我們的Video 對象中,我們可以將Video 游戲組件的更改為URL并保留實際的 URL。我們將創建一個名為的新腳本,并將其附加到我們的視頻播放器游戲對象,就像在圖像中一樣。
該腳本將視頻播放器作為參數,因此我們將拖放與該腳本連接的相同視頻播放器。
這是 的腳本:
using UnityEngine; using UnityEngine.Video; ? public class LoadVideo : MonoBehaviour { ? public VideoPlayer myVideoPlayer; ? void Start() ? { ? ? ? string videoUrl= Application.streamingAssetsPath +"/"+ "video_streamingAssets" + ".mp4"; ? ? ? myVideoPlayer.url = videoUrl; ? } }
基本上,在應用程序啟動時,它將使用.來獲取已內置的任何目標平臺中的文件夾的路徑。然后它將引用該文件夾中我們視頻的名稱及其擴展名。
然后,它將采用(已經有我們場景視頻播放器的引用),并將其url屬性寫入我們視頻的路徑。
這將產生與播放視頻相同的立方體。
現在,如果我們構建這個項目,我們將看到它的大小與前面的示例相同,但有一個主要區別。
如果我們看到這個構建的包內容,我們可以看到在//Data上有我們的文件夾和我們的視頻。
如果我們將文件夾中的視頻替換為另一個同名的視頻,則無需再次構建項目即可看到游戲中反映的更改。
現在我們知道了如何將我們的資產/內容從我們的構建中分離出來。我們還可以從視頻播放器上的 URL 調用遠程文件。為此,我們將使用此視頻作為示例。它大約有 10 分鐘長,大約 151MB。
如果我們將代碼更改為:
using UnityEngine; using UnityEngine.Video; ? public class LoadVideo : MonoBehaviour { ? public VideoPlayer myVideoPlayer; ? void Start() ? { ? ? ? string videoUrl= "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"; ? ? ? myVideoPlayer.url = videoUrl; ? } }
…并刪除文件夾的原始視頻,我們最終得到如下內容:
即時工具(),集成240款在線工具,辦公日常必備網站! 相同的功能,但現在視頻資產來自外部來源。
現在,如果我們在文件夾中構建沒有本地視頻的項目,我們會看到構建的大小有所減少。
請記住,這也可以通過異步調用或調用和協程來完成,但為簡單起見,我們只添加視頻的確切 URL 以展示流媒體資產的強大功能。
使用協程從外部源獲取視頻
我們可以像這樣修改我們的代碼,以便使用協程而不是將直接鏈接傳遞給我們的視頻播放器:
using UnityEngine; using UnityEngine.Video; using UnityEngine.Networking; using System.Collections; ? public class LoadVideo : MonoBehaviour { ? public VideoPlayer myVideoPlayer; ? void Start() ? { ? ? ? StartCoroutine(LoadExternalVideo("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4")); ? }? ? ? IEnumerator LoadExternalVideo(string url){ ? ? ?using (UnityWebRequest request = UnityWebRequest.Get(url)) ? ? { ? ? ? ? ?//Fetches a page and displays the number of characters of the response. ? ? ? ? ?yield return request.SendWebRequest(); ? ? ? ? ?myVideoPlayer.url = request.url; ? ? } } }
在此示例中,我們可以使用協程來使用 API 端點并檢索視頻的 URL,但為簡單起見,這是一個關于如何使用外部鏈接進行操作的簡單示例。
結果將非常相似;我們只需要確保我們的結果是從消費端點檢索到的,并確保在將視頻的 URL 設置為視頻播放器的 URL 屬性之前存在。
最后的想法
流媒體資源只是 Unity 為您的游戲處理資源的不同方式之一。當您通過允許他們修改您的游戲來嘗試讓您的玩家群參與時,或者如果您想要擁有一個輕量級的游戲最終構建,然后在首次啟動時,下載您游戲的其余資產,它非常有用在玩家注意到之前。
有很多網絡游戲都是這樣做的:他們的游戲很輕,你可以完成第一關的小教程,然后你會得到一個加載屏幕,下載其余的資產。
您必須牢記最適合您的游戲的方法。您不能將所有資產都放在遠程服務器上,因為如果玩家第一次玩您的游戲時,他們的設備沒有良好的互聯網連接會發生什么?如果沒有資產,你的游戲會是什么樣子?
最好的方法之一是默認使用非常輕量級的資源版本(如材質、紋理、圖像)作為占位符,并且當您確定播放器會喜歡該內容并且設備已準備好下載該信息時,盡可能無縫地這樣做。