EasyAR尝鲜系列教程之视频播放功能代码

时间:2022-12-25 19:46:23
这个增强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组件。