准备工作
由于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() 视频显示区域即可。