這個增強ImageTarget是指在ImageTarget的基礎上融入VideoPlayerBehaviour的功能,因爲按照官方的示例來考慮,這兩部分功能是獨立的,博主希望讓大家在製作識別圖的時候完全忘記區別ImageTarget和VideoTarget,這樣我們可以更爲專注地製作識別圖,因爲視頻組件就只是設置參數這一件事情,完全可以一次性搞定,所以我們首先來定義一個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組件。
* 在Assets/EasyAR/Prefabs目錄下找到EasyAR這個預製體,添加EasyARConfig組件,然後填寫KEY。
* 在Assets/EasyAR/Prefabs目錄中找到ImageTarget這個預製體,然後使用VideoTargetBaseBehaviour組件替換默認的ImageTargetBehaviour組件。