这个增强
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 组件。