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能夠直接識別的.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() 視訊顯示區域即可。