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