zoukankan      html  css  js  c++  java
  • 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() 视频显示区域即可。

  • 相关阅读:
    I/O多路复用一些概念
    事件驱动模型
    协程-遇到I/O自动切换
    进程间共享数据Manager
    协程
    进程池
    Linux rpm 命令参数使用详解[介绍和应用]
    linux 增加用户 useradd 用法小结及配置文件说明
    java classpath批量设置shell脚本
    bat批处理设置Java JDK系统环境变量文件
  • 原文地址:https://www.cnblogs.com/zerotoinfinity/p/6604150.html
Copyright © 2011-2022 走看看