技术标签: 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() 视频显示区域即可。
来源:网络
导入的视频不能直接放StreamingAssets下,否则不可识别为视频文件 使用2比1的全景视频,把VedioPlayer组件加到球体上。 因为球体是使用mesh,会受到光照的影响,导致视频可能出现一边明一边暗情况,所以把球的shader换为自发光...
1在网上找到这款插件,导入unity。。。。。。 2创建一个plane面板,并添加一个display imgui组件, 3创建一个media player,指定要播放的视频 4回到plane面板,指定你刚才创建的media player到plane组件 5点击运行就可以播放视频了...
前提条件:Eclipse已经整合了Maven。 简单配置Maven 已经配置好的,请跳过 配置Maven的路径: window - preferences 找到Maven展开 点击ADD 在弹出的对话框中点击 Directory,选择Maven的路径,选择到Maven的根目录即可,不需要到bin目录!! 勾选新添加的Maven安装路径,点击Apply 配置Maven的仓库 ...
本地安装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.分段区间的数据查询...
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.1—集合分组下的活动使用[上]-WF4.0》如何使用集合Collection活动完成工作流的设计与开发,本篇我们将要继续 讲述集合活动内的另外二个活动的用法。 摘要 本篇我们是扩展篇的第二篇,本篇主要是讲述Collection的用法,一般来说...
webpack是开发Vue单页应用必不可少的工具,它能管理复杂的构建步骤,并且优化你的应用大小和性能, 使你的开发工作流更加简单。 在这篇文章中,我将解释使用webpack提升你的Vue应用的4种方式,包括: 单文件组件 优化Vue构建过程 浏览器缓存管理 代码分离 关于vue-cli 如果你在使用 vue-cli 提供的模板来构建你的应用,那么webpack的相关配置已经提供好了,这些配置已经经...
啥也不说了直接上代码 第一步:先创建一个空文件夹(名字可以自定义) 第二步:在上一步创建的空文件夹里面在创建一个空文件夹 第三步:在里面这个空文件夹上面右键点击会出来这个白色框框找到里面的 新建component 点击 第四步: 新建component 点击后会出来一下四个文件(一定要包裹在第二次创建的空文件夹里面) 第五步: 到这就创建好了接下来引入组件 第六步:子组件在js中通过propert...
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...
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...
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....
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...
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...