EasyAR嚐鮮系列教程之視頻播放功能代碼

這個增強ImageTarget是指在ImageTarget的基礎上融入VideoPlayerBehaviour的功能,因爲按照官方的示例來考慮,這兩部分功能是獨立的,博主希望讓大家在製作識別圖的時候完全忘記區別ImageTargetVideoTarget,這樣我們可以更爲專注地製作識別圖,因爲視頻組件就只是設置參數這一件事情,完全可以一次性搞定,所以我們首先來定義一個VideoTargetBaseBehaviour類,一起來看代碼:
  
  
  
{
  
    ///  <summary>
  
    /// 視頻播放模塊
  
    ///  </summary>
  
    private VideoPlayerBehaviour videoPlayer;
  
    ///  <summary>
  
    /// 視頻文件路徑
  
    ///  </summary>
  
    public string VideoPath;
  
    ///  <summary>
  
    /// 是否自動播放視頻
  
    ///  </summary>
  
    public bool VideoEnableAutoPlay = true;
  
    ///  <summary>
  
    /// 是否允許視頻循環
  
    ///  </summary>
  
    public bool VideoEnableLoop = true;
  
    ///  <summary>
  
    /// 視頻類型
  
    ///  </summary>
  
    public VideoPlayer.VideoType VideoType =  VideoPlayer.VideoType.TransparentSideBySide;
  
    ///  <summary>
  
    /// 視頻資源類型
  
    ///  </summary>
  
    public StorageType VideoStorage = StorageType.Assets;
  
    ///  <summary>
  
    /// 視頻是否加載
  
    ///  </summary>
  
    private bool isVideoLoaded;
  
    protected override void Start()
  
    {
  
        //在Start方法中加載視頻、隱藏模型
  
        base.Start();
  
        LoadVideo();
  
        HideObjects(transform);
  
    }
  
    ///  <summary>
  
    /// 加載視頻
  
    ///  </summary>
  
    private void LoadVideo()
  
    {
  
        //創建子物體VideoObject併爲其添加視頻組件
  
        GameObject  VideoObject = new GameObject("VideoObject");
  
        videoPlayer  = VideoObject.AddComponent<VideoPlayerBehaviour>();
  
        VideoObject.transform.SetParent(transform);
  
        VideoObject.transform.localPosition  = Vector3.zero;
  
        VideoObject.transform.localRotation  = Quaternion.identity;
  
        VideoObject.transform.localScale  = Vector3.one;
  
        //設置視頻組件相關參數
  
        videoPlayer.Storage  = VideoStorage;
  
        videoPlayer.Path  = VideoPath;
  
        videoPlayer.EnableAutoPlay  = VideoEnableAutoPlay;
  
        videoPlayer.EnableLoop  = VideoEnableLoop;
  
        videoPlayer.Type  = VideoType;
  
        videoPlayer.VideoReadyEvent+=videoPlayer_VideoReadyEvent;
  
        videoPlayer.VideoReachEndEvent+=videoPlayer_VideoReachEndEvent;
  
        videoPlayer.VideoErrorEvent+=videoPlayer_VideoErrorEvent;
  
        videoPlayer.Open();
  
        videoPlayer.Play();
  
    }
  
    #region  視頻組件相關事件定義
  
    public virtual void videoPlayer_VideoErrorEvent(object sender, System.EventArgs e)
  
    {
  
    }
  
    public virtual void videoPlayer_VideoReachEndEvent(object sender, System.EventArgs e)
  
    {
  
    }
  
    public virtual void videoPlayer_VideoReadyEvent(object sender, System.EventArgs e)
  
    {
  
    }
  
    #endregion
  
    ///  <summary>
  
    /// 隱藏模型的方法
  
    ///  </summary>
  
    ///  <param name="trans">要隱藏的Transform</param>
  
    void HideObjects(Transform trans)
  
    {
  
        for (int i = 0; i < trans.childCount; ++i)
  
            HideObjects(trans.GetChild(i));
  
        if (transform != trans)
  
            gameObject.SetActive(false);
  
    }
  
    ///  <summary>
  
    /// 顯示模型的方法
  
    ///  </summary>
  
    ///  <param name="trans">要顯示的Transform</param>
  
    public void ShowObjects(Transform trans)
  
    {
  
        for (int i = 0; i < trans.childCount; ++i)
  
            ShowObjects(trans.GetChild(i));
  
        if (transform != trans)
  
            gameObject.SetActive(true);
  
    }
  
    ///  <summary>
  
    /// 實現ITargetEventHandler接口中的OnTargetFound方法
  
    ///  </summary>
  
    ///  <param name="target">識別目標</param>
  
    void ITargetEventHandler.OnTargetFound(Target target)
  
    {
  
        if (videoPlayer)
  
        videoPlayer.Play();
  
        ShowObjects(transform);
  
    }
  
    ///  <summary>
  
    /// 實現ITargetEventHandler接口中的OnTargetLost方法
  
    ///  </summary>
  
    ///  <param name="target">識別目標</param>
  
    void ITargetEventHandler.OnTargetLost(Target target)
  
    {
  
        if (videoPlayer)
  
            videoPlayer.Pause();
  
        HideObjects(transform);
  
    }
  
    ///  <summary>
  
    /// 實現ITargetEventHandler接口中的OnTargetLoad方法
  
    ///  </summary>
  
    ///  <param name="target">識別目標</param>
  
    void ITargetEventHandler.OnTargetLoad(Target target, bool status)
  
    {
  
    }
   ///  <summary>
  
    /// 實現ITargetEventHandler接口中的OnTargetUnload方法
  
    ///  </summary>
  
    ///  <param name="target">識別目標</param>
  
    void ITargetEventHandler.OnTargetUnload(Target target, bool status)
  
    {
  
    }
  
}
在這段代碼中博主採用了動態創建視頻組件的方法,這樣我們在製作VideoTarget的時候只需要按照以下步驟即可: 
Assets/EasyAR/Prefabs目錄下找到EasyAR這個預製體,添加EasyARConfig組件,然後填寫KEY
Assets/EasyAR/Prefabs目錄中找到ImageTarget這個預製體,然後使用VideoTargetBaseBehaviour組件替換默認的ImageTargetBehaviour組件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章