第一种方法:在ARCamera下创建空物体,作为拖卡之后模型的目标位置,然后在脱离识别图后模型移动到空物体下。
/*==============================================================================
Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
All Rights Reserved.
Confidential and Proprietary - Protected under copyright and other laws.
==============================================================================*/
using UnityEngine;
namespace Vuforia
{
/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
/// </summary>
public class MyDefaultTrackableEventHandler : MonoBehaviour,
ITrackableEventHandler
{
#region PRIVATE_MEMBER_VARIABLES
private TrackableBehaviour mTrackableBehaviour;
#endregion // PRIVATE_MEMBER_VARIABLES
//存储模型预制件名字,用于动态加载
public string[] prefabName;
//动态加载后的模型对象
private GameObject[] prefabObj;
//拖卡后的目标位置对象
public GameObject[] targetPosition;
#region UNTIY_MONOBEHAVIOUR_METHODS
void Start()
{
//初始化数组
prefabObj = new GameObject[prefabName.Length];
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
}
#endregion // UNTIY_MONOBEHAVIOUR_METHODS
#region PUBLIC_METHODS
/// <summary>
/// Implementation of the ITrackableEventHandler function called when the
/// tracking state changes.
/// </summary>
public void OnTrackableStateChanged(
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
OnTrackingFound();
}
else
{
OnTrackingLost();
}
}
#endregion // PUBLIC_METHODS
#region PRIVATE_METHODS
private void OnTrackingFound()
{
//如果识别到目标,并且目标不为空,要销毁对象,卸载资源
if (prefabObj[0] != null)
{
for (int i = 0; i < prefabObj.Length; i++)
{
GameObject.Destroy(prefabObj[i]);
}
Resources.UnloadUnusedAssets();
}
//动态加载预制件对象,并设置预制件父对象为imageTarget
for (int i=0;i<prefabObj.Length;i++)
{
prefabObj[i] = Instantiate(Resources.Load(prefabName[i])) as GameObject;
prefabObj[i].transform.parent = this.transform;
}
}
private void OnTrackingLost()
{
//当目标丢失后,把模型父对象设置后目标对象,
if (prefabObj[0] != null)
{
for (int i = 0; i < prefabObj.Length; i++)
{
prefabObj[i].transform.parent = targetPosition[i].transform;
//设置坐标,两种方法都可以
//prefabObj[i].transform.localPosition = Vector3.zero;
prefabObj[i].transform.position = targetPosition[i].transform.position;
}
//Resources.UnloadUnusedAssets();
}
}
#endregion // PRIVATE_METHODS
}
}
|