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

技术标签: unity

转至https://www.cnblogs.com/zerotoinfinity/p/6604150.html

准备工作

  由于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:播放全景视频(解决视频播放过暗问题)

导入的视频不能直接放StreamingAssets下,否则不可识别为视频文件 使用2比1的全景视频,把VedioPlayer组件加到球体上。 因为球体是使用mesh,会受到光照的影响,导致视频可能出现一边明一边暗情况,所以把球的shader换为自发光...

基于Unity3D ScrollRect的游戏摇杆实现

ScrollRect是UGUI提供的基础拖动组件,给它的Content绑定一个滑块就能工作了。如图 代码如下:  ...

unity3d场景播放视频插件的应用(初级交流,大神勿扰)

          1在网上找到这款插件,导入unity。。。。。。 2创建一个plane面板,并添加一个display imgui组件, 3创建一个media player,指定要播放的视频 4回到plane面板,指定你刚才创建的media player到plane组件 5点击运行就可以播放视频了...

Eclipse中创建一个简单的Maven项目(详细)

前提条件:Eclipse已经整合了Maven。 简单配置Maven 已经配置好的,请跳过 配置Maven的路径: window - preferences 找到Maven展开 点击ADD   在弹出的对话框中点击 Directory,选择Maven的路径,选择到Maven的根目录即可,不需要到bin目录!! 勾选新添加的Maven安装路径,点击Apply 配置Maven的仓库 ...

本地安装Nacos,启动时报错 Unable to start embedded Tomcat

本地安装Nacos,启动时报错 Unable to start embedded Tomcat org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerEx...

猜你喜欢

多条件查询+反向查询+分段区间数据查询+最后几行的数据+

VLOOKUP和MATCH函数 INDEX和MATCH函数 2.INDEX MATCH 反向查找 反向查找方法2: choose函数 =VLOOKUP(B2,CHOOSE({1,2},$E2:2:2:E9,9,9,D2:2:2:D$9),2,) 反向查找方法3: IF函数 =VLOOKUP(B2,if({1,2},$E2:2:2:E9,9,9,D2:2:2:D$9),2,) 3.分段区间的数据查询...

Mac安装MySQL的过程

1、先下载MySQL,下载地址:https://dev.mysql.com/downloads/file/?id=476460 如图选择下载: 2、下载后解压对应的文件mysql-8.0.11-macos10.13-x86_64.dmg,得到如下图所示的pkg包,双击下面的pkg包, 3、双击后显示下图,并点击“继续”按钮。 4、一路点击“继续”就可...

WorkFlow扩展篇Step.2—集合分组下的活动使用[下]-WF4.0

开篇         上篇我们主要是讲述了《WorkFlow扩展篇Step.1—集合分组下的活动使用[上]-WF4.0》如何使用集合Collection活动完成工作流的设计与开发,本篇我们将要继续 讲述集合活动内的另外二个活动的用法。 摘要 本篇我们是扩展篇的第二篇,本篇主要是讲述Collection的用法,一般来说...

使用webpack提升vue应用的4种方式

webpack是开发Vue单页应用必不可少的工具,它能管理复杂的构建步骤,并且优化你的应用大小和性能, 使你的开发工作流更加简单。 在这篇文章中,我将解释使用webpack提升你的Vue应用的4种方式,包括: 单文件组件 优化Vue构建过程 浏览器缓存管理 代码分离 关于vue-cli 如果你在使用 vue-cli 提供的模板来构建你的应用,那么webpack的相关配置已经提供好了,这些配置已经经...

关于——小程序如何拆分组件

啥也不说了直接上代码 第一步:先创建一个空文件夹(名字可以自定义) 第二步:在上一步创建的空文件夹里面在创建一个空文件夹 第三步:在里面这个空文件夹上面右键点击会出来这个白色框框找到里面的 新建component 点击 第四步: 新建component 点击后会出来一下四个文件(一定要包裹在第二次创建的空文件夹里面) 第五步: 到这就创建好了接下来引入组件 第六步:子组件在js中通过propert...

问答精选

C++ NetBeans - Removing Console from Win32

I have a Win32 app that displays a console window in the back. How can I, using NetBeans/C++, remove this console window? Thanks in advance. you might want to go for "Right-Mouse-Button: Properti...

Node losing gravity after SCNAction

I'd like to drop an object and then move it back to the top and let it fall again. The first part is working, but then the node seems to lose its gravity and isn't falling again. It looks like its phy...

PyQt5 store time of keyPressEvent

Issue: I have a program where I will be showing several pages with a stacked widget, and users will have to press a button (using code I've written below) to go to the next page of the stacked widget....

How to initialize a systemc port name which is an array?

I wanted to initialize a port name. The port is an array and my code does not work. The code below would work by giving clk with a name "clk". However clk port is not an array: How do I name...

Java source code can not be found in eclipse

In an xpages application a javav source code was added to the Local folder within the Lotus nsf file. Now can not be seen, and can not be found with search. The code still woking, but it is not possib...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答