检查 ARCamera 是否第一次检测到标记和 "spawn" 3d 对象
Check if ARCamera first time detect the marker and "spawn" the 3d object
我正在尝试制作一个简单的 AR 应用程序,我尝试制作的应用程序的流程是,相机检测第一个标记 > 做某事,相机检测第二个标记 > 做一些不同的事情
问题是我已经用我能想到的关键字组合进行了谷歌搜索,而且我也在寻找文档,但我找不到任何可以帮助解决我的问题的东西
虽然我最初只是在所述标记上使用脚本并将 "do something" 放在 void OnEnable 上,但无论如何该对象都是启用的,所以它没用
谁能借我一根绳子?
DefaultTrackingEventHandler 是处理跟踪的脚本。在多个标记的示例场景中,它附加到 ImageTarget。
该脚本注册到 TrackableBehaviour 并通过 OnTrackingFound/Lost 方法传播跟踪 found/lost。
在示例场景中,这些方法收集了子对象的碰撞器和渲染器以及enables/disables。
您可以做的是将信息进一步传播给其他听众。在这种情况下,您可以启用运行更新检查条件直到满足条件的脚本,并禁用脚本和匹配的可跟踪行为。
public class DefaultTrackableEventHandler : MonoBehaviour,
ITrackableEventHandler
{
private TrackableBehaviour mTrackableBehaviour;
[SerializedField] private MyConditionClass actionMb = null;
protected virtual void Start()
{
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
}
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();
}
}
protected virtual void OnTrackingFound()
{
// Was already successfully done
if(this.actionMb.ConditionMet == true){ return; }
this.actionMb.enable = true;
}
protected virtual void OnTrackingLost()
{
// Was already successfully done
if(this.actionMb.ConditionMet == true){ return; }
this.actionMb.enable = false;
}
}
public abstract class MyConditionClass : MonoBehaviour
{
public bool ConditionMet{ get; private set; }
protected abstract bool CheckCondition();
protected virtual void Update(){
if(ConditionMet == true){ return; }
ConditionMet = CheckCondition();
}
}
public class MyConditionClassForInput : MyConditionClass
{
protected override bool CheckCondition(){
return (Input.GetKeyDown(KeyCode.Space));
}
}
所以你有一个基础 class 包含所有条件应该通用的数据,比如条件是否已经满足,如图所示。和更新 运行 条件检查。
然后你有子 class 实现条件检查(必须自抽象)。
从 8.6.7 开始,Vuforia 已将 ITrackableEventHandler
重构为基础 class DefaultTrackableEventHandler
而不是接口。
public class MyTrackableEventHandler : DefaultTrackableEventHandler
{
...
}
此外,回调 RegisterTrackableEventHandler
和 UnregisterTrackableEventHandler
也需要更新。现在使用回调方法。
private void OnEnable()
{
_trackableBehaviour = GetComponent<TrackableBehaviour>();
_trackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStateChanged);
}
private void OnDisable()
{
_trackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStateChanged);
}
public void OnTrackableStateChanged(StatusChangeResult obj)
{
if (obj.NewStatus == Status.DETECTED || obj.NewStatus == Status.TRACKED
|| obj.NewStatus == Status.EXTENDED_TRACKED)
{
OnTrackingFound();
}
else
OnTrackingLost();
}
我正在尝试制作一个简单的 AR 应用程序,我尝试制作的应用程序的流程是,相机检测第一个标记 > 做某事,相机检测第二个标记 > 做一些不同的事情
问题是我已经用我能想到的关键字组合进行了谷歌搜索,而且我也在寻找文档,但我找不到任何可以帮助解决我的问题的东西
虽然我最初只是在所述标记上使用脚本并将 "do something" 放在 void OnEnable 上,但无论如何该对象都是启用的,所以它没用
谁能借我一根绳子?
DefaultTrackingEventHandler 是处理跟踪的脚本。在多个标记的示例场景中,它附加到 ImageTarget。
该脚本注册到 TrackableBehaviour 并通过 OnTrackingFound/Lost 方法传播跟踪 found/lost。
在示例场景中,这些方法收集了子对象的碰撞器和渲染器以及enables/disables。
您可以做的是将信息进一步传播给其他听众。在这种情况下,您可以启用运行更新检查条件直到满足条件的脚本,并禁用脚本和匹配的可跟踪行为。
public class DefaultTrackableEventHandler : MonoBehaviour,
ITrackableEventHandler
{
private TrackableBehaviour mTrackableBehaviour;
[SerializedField] private MyConditionClass actionMb = null;
protected virtual void Start()
{
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
}
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();
}
}
protected virtual void OnTrackingFound()
{
// Was already successfully done
if(this.actionMb.ConditionMet == true){ return; }
this.actionMb.enable = true;
}
protected virtual void OnTrackingLost()
{
// Was already successfully done
if(this.actionMb.ConditionMet == true){ return; }
this.actionMb.enable = false;
}
}
public abstract class MyConditionClass : MonoBehaviour
{
public bool ConditionMet{ get; private set; }
protected abstract bool CheckCondition();
protected virtual void Update(){
if(ConditionMet == true){ return; }
ConditionMet = CheckCondition();
}
}
public class MyConditionClassForInput : MyConditionClass
{
protected override bool CheckCondition(){
return (Input.GetKeyDown(KeyCode.Space));
}
}
所以你有一个基础 class 包含所有条件应该通用的数据,比如条件是否已经满足,如图所示。和更新 运行 条件检查。
然后你有子 class 实现条件检查(必须自抽象)。
从 8.6.7 开始,Vuforia 已将 ITrackableEventHandler
重构为基础 class DefaultTrackableEventHandler
而不是接口。
public class MyTrackableEventHandler : DefaultTrackableEventHandler
{
...
}
此外,回调 RegisterTrackableEventHandler
和 UnregisterTrackableEventHandler
也需要更新。现在使用回调方法。
private void OnEnable()
{
_trackableBehaviour = GetComponent<TrackableBehaviour>();
_trackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStateChanged);
}
private void OnDisable()
{
_trackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStateChanged);
}
public void OnTrackableStateChanged(StatusChangeResult obj)
{
if (obj.NewStatus == Status.DETECTED || obj.NewStatus == Status.TRACKED
|| obj.NewStatus == Status.EXTENDED_TRACKED)
{
OnTrackingFound();
}
else
OnTrackingLost();
}