Unity3D两种方式实现游戏视频播放

Posted zero_to_infinity

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D两种方式实现游戏视频播放相关的知识,希望对你有一定的参考价值。

准备工作

  由于Unity中能够识别的视频格式主要有:.mov, .mpg, .mpeg, .mp4, .avi, .asf,但是其实最后这些格式的时候在导入到Unity中的时候,都会再进行一次Unity内部的视频转码,这是一个耗时的操作,而且要保证视频转码的顺利完成,我们还必须安装Quicktime player工具,用于视频的转码。

  按照要求,我安装了Quicktime player之后,将视频war_video.mp4通过拖拽导入到Unity中,结果提示:“Movie importing requires Quicktime to be installed...”这样的错误,这是因为Unity对于Quicktime player的依赖还没有生效。通过查询我们可以知道,导入Unity的视频最后都被转码为.ogv格式,这是Unity能够直接识别的格式。

      在解决问题的时候,我找到了一个视频格式转码工具,能够将其他格式的视频转码为Unity能够直接识别的.ogv格式,而且不依赖于Quicktime player,而且导出来视频的质量会比Quicktime转码的更加高,这个工具就是:TheoraConverter。

  

 

  视频转码成功后,得到一个与原视频文件同名但后缀不同的视频文件:***.ogv,将其导入到Unity中即可。由于不需要再进行转码,所以资源载入的速度很快,可以在Inspector中预览播放视频。

正文准备工作

  Unity3D中播放游戏视频的方式有两种:第一种是在游戏对象中播放,例如,在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上。第二种是在GUI层面上播放视频,这种方式下只能在“Game”视图中看到播放的视频,如果此时使用htc vive,在眼镜中无法看到视频。

  播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类,现在我们开始学习一下Unity中播放视频的这两种方式。

  Unity支持的播放视频格式有.mov、.mpg、.mpeg、.mp4、.avi和.asf。通过前面说的方法,将视频文件转换成.ogv格式,然后把对应的视频文件拖拽入Project视图即可,它会自动生成对应的MovieTexture对象。如果视频中含有音频的话会对应生成audio文件。接着在Hierarchy视图中创建一个Plane对象视频将在它之上播放,Directional light世界定向光用于照亮整个游戏场景,最后Main Camera对象将直直的照射在Plane对象。

  编写test脚本

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class TestUseless : MonoBehaviour
 5 {
 6     //电影纹理
 7     public MovieTexture movTexture;
 8 
 9     void Start()
10     {
11         //设置当前对象的主纹理为电影纹理
12         this.transform.GetComponent<Renderer>().material.mainTexture = movTexture;
13         //设置电影纹理播放模式为循环
14         movTexture.loop = true;
15     }
16     void Update()
17     {
18 
19     }
20 
21     void OnGUI()
22     {
23         if (GUILayout.Button("播放/继续"))
24         {
25             //播放/继续播放视频
26             if (!movTexture.isPlaying)
27             {
28                 movTexture.Play();
29             }
30 
31         }
32 
33         if (GUILayout.Button("暂停播放"))
34         {
35             //暂停播放
36             movTexture.Pause();
37         }
38 
39         if (GUILayout.Button("停止播放"))
40         {
41             //停止播放
42             movTexture.Stop();
43         }
44     }
45 }
  使用对象拖拽的形式为Mov Texture对象赋值,那么在脚本中就能直接使用它了。
 

  

  第二种播放视频的方式基于GUI。我们把刚刚创建的Plane对象以及世界定向光删除,直接将脚本绑定在摄像机对象中即可,接着我们简单的修改一下刚刚的游戏脚本。

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class TestUseless : MonoBehaviour
 5 {
 6     //电影纹理
 7     public MovieTexture movTexture;
 8 
 9     void Start()
10     {
11         //设置电影纹理播放模式为循环
12         movTexture.loop = true;
13     }
14 
15     void OnGUI()
16     {
17         //  基于GUI播放视频
18         GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), movTexture, ScaleMode.StretchToFill);
19 
20         if (GUILayout.Button("播放/继续"))
21         {
22             //播放/继续播放视频
23             if (!movTexture.isPlaying)
24             {
25                 movTexture.Play();
26             }
27         }
28 
29         if (GUILayout.Button("暂停播放"))
30         {
31             //暂停播放
32             movTexture.Pause();
33         }
34 
35         if (GUILayout.Button("停止播放"))
36         {
37             //停止播放
38             movTexture.Stop();
39         }
40     }
41 }

  在GUI中播放视频的原理是直接通过GUI调用DrawTexture方法,这里和绘制贴图很像。目前播放视频的大小是屏幕的宽高,如果想动态的修改视频的宽或高直接修改new Rect() 视频显示区域即可。

 

以上是关于Unity3D两种方式实现游戏视频播放的主要内容,如果未能解决你的问题,请参考以下文章

Android SurfaceView + MediaPlayer实现分段视频无缝播放

Android主流视频播放及缓存实现原理调研

转UNITY3D 游戏开发之四有关实现2D帧序列帧播放相关—Animating Tiledtexture

如何在片段中播放视频

一次只能播放一个声音片段

在 HTML5 Video 中,如何播放长视频中的小片段?