Unity3D中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上。第二种是在GUI层面上播放视频。播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类,那么本章我们就好好学习一下Unity中播放视频的这两种方式。哇咔咔~
Unity支持的播放视频格式有.mov、.mpg、.mpeg、.mp4、.avi和.asf。只需将对应的视频文件拖拽入Project视图即可,它会自动生成对应的MovieTexture对象。如下图所示,MOMO将default_video.mp4拖拽入Project视图中,如果视频中含有音频的话会对应生成audio文件,因为我的视频没有音频所以没有生成 audio文件。接着在Hierarchy视图中创建一个Plane对象视频将在它之上播放,Directional light世界定向光用于照亮整个游戏场景,最后Main Camera对象将直直的照射在Plane对象。
使用对象拖拽的形式为Mov Texture对象赋值,那么在脚本中就能直接使用它了,我们看看Test.cs脚本。
Test.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using UnityEngine; using System.Collections; public class Test: MonoBehaviour { //电影纹理 public MovieTexture movTexture; void Start() { //设置当前对象的主纹理为电影纹理 renderer.material.mainTexture = movTexture; //设置电影纹理播放模式为循环 movTexture.loop = true; } void OnGUI() { if(GUILayout.Button("播放/继续")) { //播放/继续播放视频 if(!movTexture.isPlaying) { movTexture.Play(); } } if(GUILayout.Button("暂停播放")) { //暂停播放 movTexture.Pause(); } if(GUILayout.Button("停止播放")) { //停止播放 movTexture.Stop(); } } } |
如下图所示,点击按钮后轻松的实现播放、暂停、停止操作。默认视频大小大家可在编辑器直接缩放Plane对象平面,而如果需要在游戏运行中动态的缩放平面使用方法:
1 2 3 |
transform.localScale = new Vector(1,1,1); |
模型默认缩放系数为1,这里可以调节平面X、Y、Z三个方向的缩放系数,平面的大小会随之改变,对应视频的大小也会随之改变。
第二种播放视频的方式基于GUI。大家可以把刚刚创建的Plane对象以及世界定向光删除,直接将脚本绑定在摄像机对象中即可,接着我们简单的修改一下刚刚的游戏脚本。
Test.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
using UnityEngine; using System.Collections; public class Test: MonoBehaviour { //电影纹理 public MovieTexture movTexture; void Start() { //设置电影纹理播放模式为循环 movTexture.loop = true; } void OnGUI() { //绘制电影纹理 GUI.DrawTexture (new Rect (0,0, Screen.width, Screen.height),movTexture,ScaleMode.StretchToFill); if(GUILayout.Button("播放/继续")) { //播放/继续播放视频 if(!movTexture.isPlaying) { movTexture.Play(); } } if(GUILayout.Button("暂停播放")) { //暂停播放 movTexture.Pause(); } if(GUILayout.Button("停止播放")) { //停止播放 movTexture.Stop(); } } } |
在GUI中播放视频的原理是直接通过GUI调用DrawTexture方法,这里和绘制贴图很想了吧嘿嘿~ 目前播放视频的大小是屏幕的宽高,如果想动态的修改视频的宽或高直接修改new Rect() 视频显示区域即可,如下图所示,视频已经满满的填充在整个GUI中啦。怎么样Unity中播放视频简单吧? 哇咔咔~
移动平台上播放视频
经测试以上的方式在IOS和Android设备中是无法播放视频的,在移动设备上我们需要使用另外一种方式来播放。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { void OnGUI() { if (GUI.Button (new Rect (20,10,200,50), "PLAY ControlMode.CancelOnTouch")) { Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput); } if (GUI.Button (new Rect (20,90,200,25), "PLAY ControlMode.Full")) { Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Full); } if (GUI.Button (new Rect (20,170,200,25), "PLAY ControlMode.Hidden")) { Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Hidden); } if (GUI.Button (new Rect (20,250,200,25), "PLAY ControlMode.Minimal")) { Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Minimal); } } } |
1.视频播放时触摸屏幕视频关闭
2.视频播放时弹出IOS高级控件,控制视频暂停播放 全屏等等。
3.视频播放时无法停止,当其播放完一次后自动关闭
4.视频播放时弹出IOS高级控件,可控制播放进度。
注意:将视频文件放置在Assets/StreamingAssets/路径下,经测试.MP4可用。 在IOS和Android上流畅播放游戏视频。
工程下载: http://vdisk.weibo.com/s/gb4Lx
视频加速播放(只适用于PC)
今天有朋友问我,怎么能让视频加快播放,我也学了一下,不果老外们都说这是一个BUG呵呵。
脚本绑定在摄像机对象上,并且要给摄像机添加AudioSource组件。
代码比较简单我就不注释了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { public MovieTexture mov; void Start() { audio.clip = mov.audioClip; audio.Play(); mov.Play(); } void OnGUI() { if(GUI.Button(new Rect ( 310,0,100,50),"2倍速播放")) { audio.pitch = 2f; } if(GUI.Button(new Rect ( 410,0,100,50),"1倍速播放")) { audio.pitch = 1f; } GUI.DrawTexture(new Rect(0,0,300,300),mov); } } |
- 本文固定链接: https://www.xuanyusong.com/archives/1019
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
移动平台那个方法 unity上面怎么播放不了?下载的你那个工程也是播放不了
雨松大大,,你好,,如果你有幸看到我的留言的话,,希望能帮忙解答一下,,你上面写的”renderer.material.mainTexture = movTexture;”这段代码我的理解是: 播放视频貌似本质上是改变了主纹理,,这里就有一个问题了,,如果我让视频播放了一段时间后,,执行”movTexture.Stop();”,,此时主纹理会记录视频关闭时最后那一帧的画面,,包括声音也会记录最后那一帧的声音,,这时,,我执行”movTexture.Play();”,,让视频重新播放,,视频会优先播放上一次关闭时(即:movTexture.Stop();)的那一帧画面 及 声音,,然后才重头开始播放视频,,我感觉是unity的一个bug..因为我在播放视频的过程中,,同事也在看Project工程文件下我要播放的那个视频文件,,发现Game场景(和Scene场景)在播放视频的过程中,,Project工程文件下的那个视频文件也同事在播放,,当我执行”movTexture.Stop();”这个代码时,,Project工程文件下的那个视频文件也会停在最后一帧的画面上,,并没有会到视频最开始的时间点,,请雨松大大,,帮忙解决这个问题,,问了很多老师和查了一些资料,,也没找到解决的办法..
请问雨松大大,怎么在视频画面上显示UGUI的图片,我需要加一个跳过的按钮,请指导一下
Handheld.PlayFullScreenMovie 播放视频,不需要监听播放结束
Calling this function will pause Unity during movie playback. When playback finishes Unity will resume.
播放视频时候,Unity会pause,播放完后resume,继续从播放代码往下执行。
你好,请问视频的时长怎么获取呢
请问视频时长你那边获取到了吗
Handheld.PlayFullScreenMovie(“test.mp4”, Color.black, FullScreenMovieControlMode.CancelOnInput)这个方法播放视频 ,但安卓手机上播放视频不能全屏显示,是怎么回事
Handheld.PlayFullScreenMovie 这个方法播放视频 如何监听视频是否播放结束了?
我也需要这个功能。。。视频播放完后做些处理,这个要怎么弄呀
IEnumerator PlayLogoVedio(Action callback)
{
BH.Logger.LogError(“———–开始播放LOGO视频————–“);
Handheld.PlayFullScreenMovie(LogoVedioName, Color.black, FullScreenMovieControlMode.CancelOnInput);
yield return new WaitForEndOfFrame();
yield return new WaitForEndOfFrame();
BH.Logger.LogError(“———–结束播放LOGO视频————–“);
if (callback != null)
{
BH.Logger.LogError(“———–播放结束回调————–“);
callback();
}
}
(Action callback)的参数是什么?。
大佬666,确实要两次WaitForEndOfFrame,我理解是那个哥们说的“播放视频时候,Unity会pause,播放完后resume”,应该是在下一帧才pause,所以要两次WaitForEndOfFrame吧。
怎么支持文件拖拽啊
请教MOMO大神如果在4.6以上版本UGUI怎么弄啊?
rawimage
大概懂了,谢谢
能说说怎么做么?我遇到这问题了、
哥们这个问题解决了吗?我视频无法拖拽给Mov Texture
Handheld的方式能不能做类似完成回调的东西呢
如果想继续播放该怎么样做呢?
雨哥 您好 如何用进度条控制视频播放
请问如何用如何用进度条控制视频播放?
老师你好 问你一下 我想用unity对视频做一个导航条,可以控制播放进度的,可以达到么?
做不了, 你可以在java或者oc里做
奥 谢谢您 有个插件叫AVProQuickTime您用过么?
大神 这个update是指哪个的update,播放视频的时候程序不执行么?我测试了下播放视频的时候,程序还是继续往下走的。有个问题就是我想知道视频什么时候播放结束了,请大神不吝赐教
大神,你怎么检测的?
MOMO大神,我想在unity3d中渲染android系统中mediaplayer播放的视频帧,目前没什么头绪,请不吝赐教啊~
老师你好,想问一下,怎么能在移动平台上屏幕的一部分播放视频,现在是全屏播放
同求
老师你好,我刚刚接触unity,其实还不是很懂,但是我想继续学习下去。今年的毕业设计选题是基于unity的古剑奇谭宣传片的制作。真是丈二和尚摸不着头脑= =,也没有认识对这方面有研究的人,挺着急的,想问一下老师,这个题目难度大不大我觉得要死了
师傅啊。Handheld.PlayFullScreenMovie介个方法小米3放不出视频来有可能是什么原因呢
大神你好!我是刚刚进入行业的人,原先是学美术的,现在在公司里兼修程序(比较简单的,至少和同事配合起来不会因为完全没概念而降低效率),请教一个问题,如何能在物体上播放视频,而又能实现局部透明的效果?比如我想做一个场景的空间分析图,通常这样的东西是用视频后期做的(我也会),现在的想法是用指示符号单独做一个视频,然后成为material附到一个plane上。。。问题来了,视频输出必定带着背景或者可以导出带Alpha 通道的视频,然后加到plane上还是没有实现局部透明,而如果分开导出视频和通道。。。请问,如何加入通道实现局部的透明的效果??万分感激!
给材质一个带透明通道的shader 你试试。。
1 用movie texture,用里面的shader。。 2视频处理成上下格式 上面是彩色图像 下面是黑白透明通道,要ogv。 3 momo在逗你。