Мне лично не нравится, как Vuforia настраивает объекты.Это имеет смысл, только если цель изображения постоянно отслеживается.
Обычно я полностью отделяю отслеживание от объектов, которые я хочу позиционировать.
Для этого я использую настроенный DefaultTrackableEventHandler
, расширяющий его с помощьюUnityEvent
s (аналогично onClick
из UI.Button
)
// We need a custom UnityEvent for passing on the
// ImageTargets transform reference
[Serializable]
public class TransformEvent : UnityEvent<Transform> { }
public class VuforiaTargetEvents : DefaultTrackableEventHandler
{
public TransformEvent onTargetFound;
public TransformEvent whileTargetTracked;
public TransformEvent onTargetLost;
protected override void OnTrackingFound()
{
base.OnTrackingFound();
onTargetFound.Invoke(transform);
StopAllCoroutines();
StartCoroutine(WhileTracked());
}
protected override void OnTrackingLost()
{
base.OnTrackingLost();
onTargetLost.Invoke(transform);
StopAllCoroutines();
}
// For more information about Coroutines see
// https://docs.unity3d.com/Manual/Coroutines.html
private IEnumerator WhileTracked()
{
// looks dangerous but is ok inside a Coroutine
// as long as you yield somewhere
while(true)
{
whileTargetTracked.Invoke(transform);
yield return null;
}
}
}
Поместите этот компонент в ImageTarget.
Поместите Quad
отдельногде-нибудь в сцене и присоедините к нему следующий компонент
public class PlaceOnImageTarget : MonoBehaviour
{
// In the Inspector configure
// if this object should be enabled or disabled at start
public bool startEnabled;
private void Awake()
{
gameObject.SetActive(startEnabled);
}
public void UpdatePosition(Transform imageTarget)
{
transform.position = imageTarget.position;
transform.rotation = imageTarget.rotation;
gameObject.SetActive(true);
}
}
, теперь в ImageTarget в событии onTargetFound
добавьте 1 элемент и перетащите в объект Quad
.Чем выбрать из списка метод PlaceOnImageTarget
-> UpdatePosition
(обязательно выберите тот, который говорит dynamic
->, он не должен давать поля для ввода, но вместо этого будет использовать значение, которое мы передаем при вызове события)
Если вы хотите, чтобы оно постоянно обновлялось во время отслеживания ImageTarget, повторите то же самое и для события whileTargetTracked
.
Печатается на смартфоне, поэтому никаких гарантий, но янадеюсь, идея прояснится.