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() 视频显示区域即可。

时间: 2024-10-14 19:57:15

Unity3D两种方式实现游戏视频播放的相关文章

Unity3D两种方式播放视频

  Unity3D中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上.第二种是在GUI层面上播放视频.播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类,那么本章我们就好好学习一下Unity中播放视频的这两种方式.哇咔咔-           Unity支持的播放视频格式有.mov..mpg..mpeg..mp4..avi和.asf.只需将对应的视频文件拖拽入Project视

Cocos2d-x学习笔记(五岁以下儿童) 精灵两种方式播放动画

 这几天在看控件类,临时没有想好实际运用的方向.单纯的创建网上已经有非常多这方面的样例,我就不写了.接下来是学习精灵类.精灵类若是单独学习也是非常easy.于是我加了一些有关动画方面的知识点与精灵类一起使用.让精灵播放简单的帧动画. 首先我们准备好动画素材,我在网上下了一个小游戏.将里面的素材做成了png和plist大图以供程序调用.我是用TexturePackerGUI来生成plist的.我选的是一个简单的待机动作,我们的目的就是让这张图动起来~ 第一种方式:使用CCSpriteFrame

Unity知识三:两种方式实现切水果的刀痕

Unity作为游戏开发平台之一,还是有很多实用的小技巧的,今天来学习一下怎样用两种方式来显示切水果游戏中的刀痕: 1.正常显示下的刀痕: 什么叫正常显示下的呢?我们所接触过的切水果游戏一般都是2D游戏,那我们知道,2D游戏可以用Unity直接来做,还可以使用NGUI.UGUI或者其他方法通过UI来实现. 所以我们第一种方法就是不借助UI来做. 首先来看看我们刀痕的素材:(需要的同学可以右键另存.^_^) 打开Unity: 新建一个空游戏体,命名为"BackGround",然后在组件面板

em创建的两种方式

em创建(两种方式1,图形dbca,当然了,前提是先创建一个监听. 2,手工命令安装em)手工命令创建em(确保数据库开启,确保监听正常并且最好是动态监听,确保system表空间够用大概1G左右),我的空间有限只给了800M,如下 select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name like 'SYSTEM';alter database datafile '/u01

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 选择调用的进程为 24 i386 getuid sys_getuid1647 i386 getgid sys_getgid16 使用库函数API方式 使用C代码中嵌入汇编代码方式

Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态.然后等待消费者消费了商品,然后消费者通知生产者队列有空间了.同样地,当

senchaTouch 给组件传参的两种方式

在senchaTouch 页面跳转中,有时我们需要将其前一个页面的相关参数传入到新的页面或者新的控件中,这是我们该如何传递参数进去呢,一下有两种方式: var arg;//定义将要 传入的参数 Ext.define('MyApp.view.Init',{ extend:'Ext.Container', id:'chat_more_btm', xtype:'init', config:{ layout:'fit', myarg:arg//把将要传入的参数映射到一个属性上面 }, initializ

通过编码和xml文件两种方式实现tween动画

tween有四种动画效果:alpha(透明).rotate(旋转), translate(移动),scale(缩放); 可以通过硬编码和xml文件这两种方式来实现. xml实现: 第一步:在项目的res文件下面新建一个文件夹名字是anim(必须) 第二步:在anim文件夹下面新建新的xml文件,在xml文件中具体设置动画效果 第三步:在Activity中使用 AnimationUtils.loadAnimation(MainActivity.this,R.anim.xx);来获取. 1.alph

关于Mysql删除表数据的两种方式对比

1.delete from table_name 一行一行删除,只删除表数据,auto_increament仍停留在最后一天数据的下一个值. 2.truncate table_name 快捷删除表数据.先删除整个表,然后重新建表结构.auto_increament从1开始. 关于Mysql删除表数据的两种方式对比,布布扣,bubuko.com