1、簡介
使用視頻播放器組件可將視頻文件附加到游戲?qū)ο螅缓笤谶\行時在游戲?qū)ο蟮募y理上播放。
- 視頻播放器 (Video Player) 組件:
屬性 | 功能 |
---|---|
Source | 選擇視頻源類型。Video Clip:將視頻剪輯分配給視頻編輯器。使用此字段來定義分配給視頻播放器組件的視頻剪輯。將視頻文件拖放到此字段中,或單擊該字段右側(cè)的圓圈,然后從資源列表中選擇文件(如果該文件位于 Project 文件夾中)。 |
Play On Awake | 勾選 Play On Awake 復(fù)選框可在場景啟動時播放視頻。如果希望在運行時的另一個點觸發(fā)視頻播放,請取消勾選此復(fù)選框。此情況下可使用 Play() 命令通過腳本觸發(fā)視頻播放。 |
Render Mode | 使用下拉選單來定義視頻的渲染方式。Camera Far Plane:在攝像機的遠(yuǎn)平面上渲染視頻。Camera Near Plane:在攝像機的近平面上渲染視頻。Render Texture:將視頻渲染到渲染紋理中。Material Override:通過游戲?qū)ο箐秩酒鞯牟馁|(zhì)將視頻渲染到游戲?qū)ο蟮倪x定紋理屬性中。API Only:將視頻渲染到 VideoPlayer.texture 腳本 API 屬性中。必須使用腳本將紋理分配給其預(yù)期目標(biāo)。 |
2、腳本播放示例
以下腳本演示了 VideoPlayer 組件的一些功能。
- (1)在層級樹上新建一個空對象
- (2)在項目面板通過鼠標(biāo)右鍵菜單,新建一個腳本對象,內(nèi)容如下:
// VideoPlayer 函數(shù)示例
using UnityEngine;
public class Example : MonoBehaviour
{
void Start()
{
// 將一個 VideoPlayer 附加到主攝像機。
GameObject camera = GameObject.Find("Main Camera");
// 將 VideoPlayer 添加到攝像機對象時,
// 它會自動瞄準(zhǔn)攝像機背板,無需更改 videoPlayer.targetCamera。
var videoPlayer = camera.AddComponent<UnityEngine.Video.VideoPlayer>();
// Play on Awake 默認(rèn)為 true。將它設(shè)置為 false 以避免下面設(shè)置的 URL
// 自動開始播放,因為我們處于 Start() 狀態(tài)。
videoPlayer.playOnAwake = false;
// 默認(rèn)情況下,添加到攝像機的 VideoPlayer 將使用遠(yuǎn)平面。
// 讓我們改為瞄準(zhǔn)近平面。
videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.CameraNearPlane;
// 這將使場景通過正在播放的視頻可見。
videoPlayer.targetCameraAlpha = 0.5F;
// 設(shè)置要播放的視頻。URL 支持本地絕對或相對路徑。
// 此處使用絕對路徑。
videoPlayer.url = "file:///D:/basketball.mp4";
// 跳過前 100 幀。
videoPlayer.frame = 100;
// 完成后從頭重新開始。
videoPlayer.isLooping = true;
// 每次到達(dá)結(jié)尾時,我們都會將播放速度減慢 10 倍。
videoPlayer.loopPointReached += EndReached;
// 開始播放。這意味著 VideoPlayer 可能需要做好準(zhǔn)備工作(預(yù)留
// 資源、預(yù)加載幾幀等)。為了更好地控制此項準(zhǔn)備工作
// 帶來的延遲,您可以使用 videoPlayer.Prepare() 及其
// prepareCompleted 事件。
videoPlayer.Play();
}
void EndReached(UnityEngine.Video.VideoPlayer vp)
{
vp.playbackSpeed = vp.playbackSpeed / 10.0F;
Debug.Log("Video: End reached!");
}
}
- (3)將上面的腳本對象Example.script掛在上面新建的空對象上。
- (4)點擊上面的播放按鈕,
- (5)運行如下:
注意:URL 源選項會繞過資源管理,這意味著您必須手動確保 Unity 可以找到源視頻。例如,一個 Web URL 需要由 Web 服務(wù)器托管源視頻,而普通文件必須位于 Unity 可以找到該文件的位置(用腳本表示)。但是,如果內(nèi)容不在 Unity 的直接控制之下,或者您希望避免在本地存儲大型視頻文件,則此功能非常有用。如果將視頻播放器組件源設(shè)置為 URL,也可通過 http:// 和 https:// 從 Web 源讀取視頻。在這些情況下,Unity 會執(zhí)行必要的預(yù)緩沖和錯誤管理。置于 Unity 的 StreamingAssets 文件夾中的文件可通過視頻播放器組件的 URL 選項(見上文)進(jìn)行使用,也可借助特定于平臺的路徑 (Application.streamingAssetsPath) 進(jìn)行使用。
提示:Unity3d 拖拽腳本報錯Can’t add the script component “” because the script class cannot be found
報錯原因:文件名與文件內(nèi)容中的類名不相符。c#文件創(chuàng)建以后再改名,會報錯找不到對應(yīng)類。類名和文件名要一致才行。(這個是Unity要求,c#本身不要求一致)
這里提供兩段網(wǎng)上的示例腳本如下:
- VideoScript1.cs:
using UnityEngine;
using UnityEngine.Video;
public class VideoScript1 : MonoBehaviour
{
void Start () {
var vPlayer = gameObject.AddComponent<VideoPlayer>();
vPlayer.URL = "https://images.nvidia.cn/cn/youtube-replicates/p7RniXWvYhY.mp4";
vPlayer.target = UnityEngine.Video.VideoTarget.CameraFrontPlane;
vPlayer.alpha = 0.8f;
vPlayer.prepareCompleted += Prepared;
vPlayer.Prepare();
Debug.Log("Video: Start!");
}
void Prepared(VideoPlayer vPlayer)
{
Debug.Log("Video: End reached!");
vPlayer.Play();
}
}
- VideoScript2.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
using UnityEngine.UI;
using System;
public class VideoScript2: MonoBehaviour {
//圖像
public RawImage image;
//播放器
public VideoPlayer vPlayer;
public string urlNetWork = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";//網(wǎng)絡(luò)視頻路徑
//播放
public Button btn_Play;
//暫停
public Button btn_Pause;
//前進(jìn)
public Button btn_Fornt;
//后退
public Button btn_Back;
//下一個
public Button btn_Next;
//視頻控制器
public Slider sliderVideo;
//音量控制器
public Slider sliderSource;
//音量大小
public Text text;
//當(dāng)前視頻時間
public Text text_Time;
//視頻總時長
public Text text_Count;
//音頻組件
public AudioSource source;
//需要添加播放器的物體
public GameObject obj;
//是否拿到視頻總時長
public bool isShow;
//前進(jìn)后退的大小
public float numBer = 20f;
//時 分的轉(zhuǎn)換
private int hour, mint;
private float time;
private float time_Count;
private float time_Current;
//視頻是否播放完成
private bool isVideo;
// Use this for initialization
void Start () {
image = obj.GetComponent<RawImage>();
//一定要動態(tài)添加這兩個組件,要不然會沒聲音
vPlayer = obj.AddComponent<VideoPlayer>();
source = obj.AddComponent<AudioSource>();
//這3個參數(shù)不設(shè)置也會沒聲音 喚醒時就播放關(guān)閉
vPlayer.playOnAwake = false;
source.playOnAwake = false;
source.Pause();
//初始化
Init(urlNetWork);
btn_Play.onClick.AddListener(delegate { OnClick(0); });
btn_Pause.onClick.AddListener(delegate { OnClick(1); });
btn_Fornt.onClick.AddListener(delegate { OnClick(2); });
btn_Back.onClick.AddListener(delegate { OnClick(3); });
btn_Next.onClick.AddListener(delegate { OnClick(4); });
sliderSource.value = source.volume;
text.text = string.Format("{0:0}%", source.volume * 100);
sliderSource.onValueChanged.AddListener(delegate { ChangeSource(sliderSource.value); });
}
/// <summary>
/// 初始化VideoPlayer
/// </summary>
/// <param name="url"></param>
private void Init(string url) {
isVideo = true;
isShow = true;
time_Count = 0;
time_Current = 0;
sliderVideo.value = 0;
//設(shè)置為URL模式
vPlayer.source = VideoSource.Url;
//設(shè)置播放路徑
vPlayer.url = url;
//在視頻中嵌入的音頻類型
vPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
//把聲音組件賦值給VideoPlayer
vPlayer.SetTargetAudioSource(0, source);
//當(dāng)VideoPlayer全部設(shè)置好的時候調(diào)用
vPlayer.prepareCompleted += Prepared;
//啟動播放器
vPlayer.Prepare();
}
/// <summary>
/// 改變音量大小
/// </summary>
/// <param name="value"></param>
public void ChangeSource(float value) {
source.volume = value;
text.text = string.Format("{0:0}%", value * 100);
}
/// <summary>
/// 改變視頻進(jìn)度
/// </summary>
/// <param name="value"></param>
public void ChangeVideo(float value) {
if (vPlayer.isPrepared)
{
vPlayer.time = (long)value;
Debug.Log("VideoPlayer Time:"+vPlayer.time);
time = (float)vPlayer.time;
hour = (int)time / 60;
mint = (int)time % 60;
text_Time.text = string.Format("{0:D2}:{1:D2}", hour.ToString(), mint.ToString());
}
}
private void OnClick(int num) {
switch (num)
{
case 0:
vPlayer.Play();
Time.timeScale = 1;
break;
case 1:
vPlayer.Pause();
Time.timeScale = 0;
break;
case 2:
sliderVideo.value = sliderVideo.value + numBer;
break;
case 3:
sliderVideo.value = sliderVideo.value - numBer;
break;
case 4:
vPlayer.Stop();
Init(Application.streamingAssetsPath + "/EasyMovieTexture.mp4");
break;
default:
break;
}
}
// Update is called once per frame
void Update ()
{
if (vPlayer.isPlaying && isShow)
{
//把圖像賦給RawImage
image.texture = vPlayer.texture;
//幀數(shù)/幀速率=總時長 如果是本地直接賦值的視頻,我們可以通過VideoClip.length獲取總時長
sliderVideo.maxValue = vPlayer.frameCount/vPlayer.frameRate;
time = sliderVideo.maxValue;
hour = (int)time / 60;
mint = (int)time % 60;
text_Count.text = string.Format("/ {0:D2}:{1:D2}", hour.ToString(), mint.ToString());
sliderVideo.onValueChanged.AddListener(delegate { ChangeVideo(sliderVideo.value); });
isShow = !isShow;
}
if (Mathf.Abs((int)vPlayer.time - (int)sliderVideo.maxValue) == 0)
{
vPlayer.frame = (long)vPlayer.frameCount;
vPlayer.Stop();
Debug.Log("播放完成!");
isVideo = false;
return;
}
else if (isVideo && vPlayer.isPlaying)
{
time_Count += Time.deltaTime;
if ((time_Count - time_Current) >= 1)
{
sliderVideo.value += 1;
Debug.Log("value:" + sliderVideo.value);
time_Current = time_Count;
}
}
}
private void FixedUpdate()
{
}
void Prepared(VideoPlayer player) {
player.Play();
}
}
Unity5.6提供了多種生成Video Player控件的方式:
1、新建一個空白的Video Player:選擇菜單欄的GameObject->Video->Video Player或者在Hierarchy面板上選擇Create->Video->Video Player或者右擊Hierarchy面板空白處選擇Video->Video Player。
2、直接將導(dǎo)入的VideoClip拖入場景或者Hierarchy面板,生成的VideoPlayer控件的VideoClip將會自動被賦值,如果場景中存在MainCamera,Camera也會被自動賦值為MainCamera。
3、將導(dǎo)入的VideoClip拖動到場景中的Camera物體上,生成的VideoPlayer控件的VideoClip和MainCamera將會自動被賦值,模式默認(rèn)選擇Camera Far Plane。
4、將導(dǎo)入的VideoClip拖動到場景中的2D或者3D物體上,生成的VideoPlayer控件的VideoClip和Renderer將會自動被賦值,模式默認(rèn)選擇Material Override。
5、將導(dǎo)入的VideoClip拖動到場景中的UI物體上,生成的VideoPlayer控件的VideoClip將會自動被賦值,模式默認(rèn)選擇Render Texture。
VideoPlayer的腳本控制與AudioSource相似,有常規(guī)的Play,Pause,Stop方法,也有用于進(jìn)度控制的time,isPlaying,isLooping,frame,frameCount等屬性。
VideoPlayer可以使用一系列事件來監(jiān)聽播放的各個動作:
errorReceived: 錯誤監(jiān)聽到時被執(zhí)行。
frameDropped :有丟幀發(fā)生時被執(zhí)行。
frameReady :新的一幀準(zhǔn)備好時被執(zhí)行。
loopPointReached :播放結(jié)束或播放到循環(huán)的點時被執(zhí)行。
prepareCompleted :視頻準(zhǔn)備完成時被執(zhí)行。
seekCompleted :查詢幀操作完成時被執(zhí)行。
started:在Play方法調(diào)用之后立刻調(diào)用。
3、界面播放示例
3.1 2d界面全屏播放
- (1)在層級樹上鼠標(biāo)右鍵新建一個視頻播放對象如下:
-
(2)設(shè)置視頻對象的參數(shù)
Source:設(shè)置視頻源,Video Clip或URL。這里使用Video Clip,它的視頻資源在項目面板的Assets里面需要提前配置好相關(guān)視頻資源。
Render Mode:這里設(shè)置為在主相機上播放視頻。 -
(3)新建一個腳本對象,綁定在視頻播放對象上(當(dāng)然也可以綁定在其他對象上),用來監(jiān)控視頻播放過程的事件。
Example2.cs:
using UnityEngine;
using UnityEngine.Video;
public class Example2 : MonoBehaviour
{
public VideoPlayer vPlayer;
void Awake()
{
vPlayer = GetComponent<VideoPlayer>();
Debug.Log("Video: Awake";
}
void Start()
{
vPlayer.loopPointReached += VideoEnd;
vPlayer.Play();//播放視頻
//vPlayer.Pause();//暫停視頻
//vPlayer.Stop();//停止視頻
//vPlayer.playbackSpeed = 1;//播放速度
Debug.Log("Video: Start";
}
void Update()
{
Debug.Log("Video: Frame " + vPlayer.frame);
}
/// <summary>
/// 監(jiān)聽視頻是否播放結(jié)束,結(jié)束時調(diào)用
/// </summary>
/// <param name="vp"></param>
void VideoEnd(VideoPlayer vp)
{
Debug.Log("愛看書的小沐:視頻播放結(jié)束");
Vp.Play();//重新播放視頻
}
}
點擊系統(tǒng)的播放按鈕運行如下:
3.2 2d界面部分區(qū)域播放
在2D界面播放視頻和在3D游戲體上播放,原理及代碼是一樣的,區(qū)別是要把Mesh組件換成RawImage,然后VideoPlayer的RenderMode選項選擇RenderTexture或者其他選項。
這里需要把RenderMode 渲染模式改為 Rendertexture ,Canvas畫布下創(chuàng)建 RawImage , 在Project 視圖下創(chuàng)建 RenderTexture,將RenderTexture 拖入RawImage 的Texture中。
(1)新建一個視頻播放對象,并改名為“小沐視頻播放”。
(2)在層級樹上,新建一個raw image對象
新建之后在Canvas下面出現(xiàn)一個RawImage節(jié)點。
修改RawImage在屏幕上的位置;
(3)Project 視圖下創(chuàng)建 RenderTexture。它的屬性可以保持默認(rèn),不修改。
(4)修改上面的RawImage對象的屬性。將Texture屬性關(guān)聯(lián)上面新建的RenderTexture對象。
(4)修改上面的視頻播放對象的屬性。將Target Texture屬性關(guān)聯(lián)上面新建的RenderTexture對象。
(5)點擊系統(tǒng)的播放按鈕運行如下:
3.3 3d模型表面播放
-
(1)新建一個視頻播放對象,如上。
-
(2)新建一個立方體對象,如下
-
(3)修改視頻對象的屬性:
設(shè)置視頻源:Source
設(shè)置渲染目標(biāo):Render Mode修改為Material Override,同時將Renderer修改為Cude(上面新建的立方體對象)。 -
(4)預(yù)覽如下:
如果想在立方體的某一個面上播放的話,方法如下: -
(5)在Cude對象下面新建一個網(wǎng)格對象Quad.
-
(6)并在三維空間中調(diào)整網(wǎng)格對象的位置,相對立方體。
-
(7)修改視頻對象的屬性:
將Renderer的值修改為網(wǎng)格對象Quad. -
(8)預(yù)覽如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-622583.html
結(jié)語
如果您覺得該方法或代碼有一點點用處,可以給作者點個贊,或打賞杯咖啡;
╮( ̄▽ ̄)╭如果您感覺方法或代碼不咋地//(ㄒoㄒ)//,就在評論處留言,作者繼續(xù)改進(jìn);
o_O???如果您需要相關(guān)功能的代碼定制化開發(fā),可以留言私信作者;
(????)感謝各位大佬童鞋們的支持!
( ′ ▽′ )? ( ′ ▽′)っ!??!文章來源地址http://www.zghlxwxcb.cn/news/detail-622583.html
到了這里,關(guān)于【小沐學(xué)Unity3d】Unity播放視頻(VideoPlayer組件)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!