【Unity 3D】常用播放视频的几种方式

【准备工作】

在Unity3D中想要成功播放视频并不是一件太简单的事,还是有着诸多限制的。

要求如下:

(1) 视频。格式支持 .mov, .mpg, .mpeg, .mp4, .avi, .asf 等,视频的大小最好别超过 100MB,因为 Unity3D 对视频的导入是比较慢的(也可能是亦泽的电脑已经 out 了…);
(2) 在Windows上导入影片需要QuickTime播放器,没有的可以从这里下载QuickTime 下载

做好准备工作后,便可以使用下面的方法来播放视频了!


【Material】

基本原理

  使用 MovieTexture 类。将影片作为 MovieTexture 类型的对象。MovieTexture 类继承自 Texture 类,所以可以使用 material(材质球)对影片进行渲染。

方案实施

(1) 创建一个新的 material 资源文件并将其重命名为 “MovieMaterial”,并将其 shader 属性改为 Unlit/Texture,即不受光照影响的材质;
(2) 在场景中创建 Plane,调整其大小和位置,使其 xoy 面正对着摄像机;
(3) 将 MovieMaterial 替换 Plane 的 Mesh Renderer 组件中 Materials 属性中的 Default-Material;
(4) 创建脚本PlayMovieByMaterial,附加给 Plane,并添加如下代码:

using UnityEngine;

public class PlayMovieByMaterial : MonoBehaviour
{

    public MovieTexture _Movie;

    void Start()
    {
        GetComponent().material.mainTexture = _Movie;
        _Movie.Play();
    }
}

(5) 将影片指定其 Movie 属性,此时播放,会发现没有声音;
(6) 为 Plane 添加 AudioSource 组件,将影片资源附带的声音资源指定给其 AudioClip 属性;
(7) 运行,即可在 Plane 上渲染出影片。

【UGUI RawImage】

基本原理

  原理与使用 material 类似,都是将 MovieTexture 作为 Texture 来渲染影片。在使用 UGUI 时,肯定不能用 Plane 来播放影片,那也太诡异了- -。UGUI 提供了 RawImage 组件,与 Image 组件不同的是,它含有的是 Texture 类型的属性,可以利用此属性渲染影片。

方案实施

(1) 创建 RawImage;
(2) 创建脚本PlayMovieByMaterial,附加给 RawImage,并添加如下代码:

using UnityEngine;
using UnityEngine.UI;

public class PlayMovieByRawImage : MonoBehaviour {

    public MovieTexture _Movie;

    void Start () 
    {
        GetComponent().texture = _Movie;
        _Movie.Play();
    }
}

(3) 将影片指定其 Movie属性,此时播放,会发现没有声音;
(4) 为 Plane 添加 AudioSource 组件,将影片资源附带的声音资源指定给其 AudioClip 属性;
(5) 运行,即可在 RawImage 上渲染出影片。

【移动平台】

  上述两种方法都不能在移动端播放影片,在你打包时你会发现 Unity 会提示你类似于“没有发现 Movie Texture 类型”这样的错误,这是因为移动平台不支持这个类。所以我们需要用到 Handheld.PlayFullScreenMovie 方法来实现移动平台上视频的播放。移动平台支持 .mov, .mp4, .mpv, and .3gp 四种格式视频。  
  Handheld.PlayFullScreenMovie 方法专用于移动平台(IOS,Android)播放视频,在视频播放时,Unity会暂停运行,直至视频结束。也就是说当视频结束后,才会开始执行这行代码的下一行代码。

Handheld.PlayFullScreenMovie 方法共有四个重载方法,这里分别介绍一下每个参数:
path:
表示文件的路径。需要加载的影片必须放在 Assets/ StreamingAssets/ 路径下,此路径作为影片文件的根目录,若无子目录,则直接通过“Movie.mp4”文件名来表示 Movie 文件的路径。
bgColor:
表示背景颜色。通常指定为 Color.black。
controlMode:
表示视频的控制模式,此为 FullScreenMovieControlMode 类型的结构体,共四个成员:
FullScreenMovieControlMode.Full 表示播放视频时应用完整的视频控制器,如进度条、暂停等;
FullScreenMovieControlMode.Minimal 表示播放视频时应用最简的视频控制器;
FullScreenMovieControlMode.CancelOnInput 表示播放视频时点击屏幕即关闭视频;
FullScreenMovieControlMode.Hidden 表示不接受任何控制,直到视频播放完成。
scalingMode:
表示视频的缩放模式,此为 FullScreenMovieScalingMode 类型的结构体,共有四个成员:
FullScreenMovieScalingMode.None 不缩放该视频;
FullScreenMovieScalingMode.AspectFit 缩放视频直到尺寸适合屏幕;
FullScreenMovieScalingMode.AspectFill 缩放视频直到视频填充整个屏幕;
FullScreenMovieScalingMode.Fill 缩放视频直到长宽完全适合屏幕。

只需要调用此方法即可播放影片(需要在移动平台测试):

using UnityEngine;

public class PlayMovieOnMoblie : MonoBehaviour {

    void Start () 
    {
        Handheld.PlayFullScreenMovie("Movie.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);
    }
}

【无法播放影片的解决方案】

(1) 使用 QuickTime 播放影片后再将其导入,如不行,重启后再进行尝试;
(2) 影片的格式必须是真实的格式,不能是手动改后缀得到的(亦泽曾天真的试过),如果格式没问题还是播放不了,使用视频转码器转码成 .mp4 格式后再导入进行尝试。

【参考资料】

[1]. Unity Manual - Movie Texture
[2]. Unity Scriping API - Handheld.PlayFullScreenMovie
[3]. Unity圣典 - Handled.PlayFullScreenMovie
[4]. 雨松MOMO程序研究院 - Unity3D研究院之两种方式播放游戏视频

你可能感兴趣的:(unity3d,ugui,移动平台,Unity3D)