1. 程式人生 > >Unity3D兩種方式實現遊戲視訊播放

Unity3D兩種方式實現遊戲視訊播放

轉至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() 視訊顯示區域即可。