准備工作
由於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 }
第二種播放視頻的方式基於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() 視頻顯示區域即可。