如何在 Unity 中使用流媒体资源

资产可以是 Unity 中的任何资源;这些资源可以是图像、音频、视频、脚本、文本等。

在任何平台上构建 Unity 项目时,游戏中的所有资产都将“打包”在一个文件中(或更多,取决于您的平台),构建的结果大小将取决于您决定的资产大小打包在您的游戏中。

创建具有多个高清纹理的游戏而不是使用地图集,或者使用 240p 视频而不是使用 1080p 是不一样的。预计资产规模越大,最终构建的规模就越大。

一般来说,保持构建尽可能轻量级是一个很好的做法,这样玩家就不会因为大小而放弃下载游戏,而且场景运行速度也会大大加快。

实现这一点有多种提示和技巧,在本文中,我们将讨论其中的一些,从流媒体资产开始。

什么是流媒体资产?

假设您的游戏中有一个不错的场景,所有动作都在其中发生。玩家是敌人的基地,在一个特定的房间里,你决定把一段视频作为彩蛋放在电脑上播放。

视频真的很大,超过 300MB,播放器可能会也可能不会进入那个特定的房间才能真正看到它。默认情况下将其加载到您的场景中可以吗?这可能会导致您的精彩场景出现不必要的缓慢。所以当我们真正需要它时加载它可能会很棒。

流媒体资产就是这样:放置在特定文件夹中的资产,需要时由 Unity Player 加载。该资产将被放置在目标平台内易于找到的地址中。

请注意,放置在流式资产文件夹(在 Unity 中名为 StreamingAssets)的任何资产都将被复制到目标平台,如果用户在项目文件夹中搜索,它将能够看到它们。

这就是一些游戏的一些模组的制作方式。

改变角色的纹理?进入数据文件夹并找到使用的纹理,然后对其进行修改。改变强硬老板的台词?只需转到数据文件夹并找到音轨并将其替换为另一个具有相同名称的音轨。


超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →


流媒体资产让游戏运行顺畅,无需从内存中加载所有资产,并以易于访问的路径提供更大的资产。

让我们构建一个流媒体资产的简单示例

我们将通过在您的游戏中显示视频,通过一个简单的示例来展示流媒体资产的工作原理。

我从 iStockPhoto下载了此示例的视频预览。

确保您要使用的视频具有以下扩展名之一:.mov、.mpeg、.mp4、.avi、.asf。

对于我们的初始示例,我们将创建一个名为Video的新文件夹并将我们的视频放在该文件夹中:

然后,在我们的Hierarchy面板上,我们将设置我们的视频播放器。

右键单击您的 Hierarchy 并添加一个Empty Game Object。我打电话给我的 VideoObject。

在其中,我创建了一个立方体,我们将在其中播放视频;它可以是你想要的任何形状,但为了方便我选择了一个立方体。我称之为Video_Canvas。

在Video_Canvas的同一级别,在VideoObject中,我通过右键单击VideoObject并选择Video,然后选择 Video Player添加了一个新的Video Player对象。

以下是我设置视频播放器对象的方法:

我们将Source设置为Video Clip,然后从我们创建的Video Folder 中选择视频剪辑,然后选择Loop以便视频可以无限播放。

然后,选择Render Mode作为Material Override并拖放要在其上播放视频的对象——在我们的例子中是Video_Canvas立方体。让Material 属性为_MainTex。

如果您在 Unity 编辑器中单击播放,您将看到类似这样的内容:在立方体的每一侧播放一个视频。

如果您想要一个更平坦的表面(如屏幕),您还可以创建一个平面或将立方体的比例缩小到您想要的形状。

该演示视频为 3.5MB。

如果我们为独立平台(Windows、Linux、MacOs)构建这个项目,我们将看到一个带有视频的空白项目,大小为 87.6MB。

现在,让我们看看使用相同的视频作为流媒体资产的效果。

为此,我们将在Assets文件夹中创建一个名为StreamingAssets的新文件夹;这是一个特殊命名的文件夹,它将我们的视频文件video_streamingAssets视为常规文件,在编辑器的属性窗口中没有任何选项。

然后在我们的Video Player对象中,我们可以将Video Player 游戏组件的Source更改为URL并保留实际的 URL。我们将创建一个名为LoadVideo的新脚本,并将其附加到我们的视频播放器游戏对象,就像在图像中一样。

该脚本将视频播放器作为参数,因此我们将拖放与该脚本连接的相同视频播放器。

这是LoadVideo 的脚本:

using UnityEngine;
using UnityEngine.Video;
​
public class LoadVideo : MonoBehaviour
{
   public VideoPlayer myVideoPlayer;
   void Start()
   {
       string videoUrl= Application.streamingAssetsPath +"/"+ "video_streamingAssets" + ".mp4";
       myVideoPlayer.url = videoUrl;
   }
}

基本上,在应用程序启动时,它将使用Application.streamingAssetsPath来获取已内置的任何目标平台中的StreamingAssets文件夹的路径。然后它将引用该文件夹中我们视频的名称及其扩展名。

然后,它将采用myVideoPlayer(已经有我们场景视频播放器的引用),并将其url属性写入我们视频的路径。

这将产生与播放视频相同的立方体。

现在,如果我们构建这个项目,我们将看到它的大小与前面的示例相同,但有一个主要区别。

如果我们看到这个构建的包内容,我们可以看到在Contents/Resources/Data上有我们的StreamingAssets文件夹和我们的视频。

如果我们将StreamingAssets文件夹中的视频替换为另一个同名的视频,则无需再次构建项目即可看到游戏中反映的更改。

现在我们知道了如何将我们的资产/内容从我们的构建中分离出来。我们还可以从视频播放器上的 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;
   }
}

…并删除StreamingAssets文件夹的原始视频,我们最终得到如下内容:

即时工具(67tool.com),集成240款在线工具,办公日常必备网站!

相同的功能,但现在视频资产来自外部来源。

现在,如果我们在StreamingAssets文件夹中构建没有本地视频的项目,我们会看到构建的大小有所减少。

请记住,这也可以通过异步调用或UnityWebRequest调用和协程来完成,但为简单起见,我们只添加视频的确切 URL 以展示流媒体资产的强大功能。

使用协程从外部源获取视频

我们可以LoadingScript像这样修改我们的代码,以便使用协程而不是将直接链接传递给我们的视频播放器:

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,但为简单起见,这是一个关于如何使用外部链接进行操作的简单示例。

结果将非常相似;我们只需要确保我们的UnityWebRequest结果是从消费端点检索到的,并确保在将视频的 URL 设置为视频播放器的 URL 属性之前存在。

最后的想法

流媒体资源只是 Unity 为您的游戏处理资源的不同方式之一。当您通过允许他们修改您的游戏来尝试让您的玩家群参与时,或者如果您想要拥有一个轻量级的游戏最终构建,然后在首次启动时,下载您游戏的其余资产,它非常有用在玩家注意到之前。

有很多网络游戏都是这样做的:他们的游戏很轻,你可以完成第一关的小教程,然后你会得到一个加载屏幕,下载其余的资产。

您必须牢记最适合您的游戏的方法。您不能将所有资产都放在远程服务器上,因为如果玩家第一次玩您的游戏时,他们的设备没有良好的互联网连接会发生什么?如果没有资产,你的游戏会是什么样子?

最好的方法之一是默认使用非常轻量级的资源版本(如材质、纹理、图像)作为占位符,并且当您确定播放器会喜欢该内容并且设备已准备好下载该信息时,尽可能无缝地这样做。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pxr007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值