我试图制作一个简单的AR应用程序,我尝试制作的应用程序的流程是,摄像头检测第一个标记>做某事,相机检测第二标记>做一些不同的事情
问题是我已经用谷歌搜索了我能想到的关键字组合,而且我也寻找文档,但我真的没有找到帮助解决我的问题
我的第一个问题是,只需在上述标记上使用一个脚本,并执行"做某事" on void OnEnable,但无论如何都要启用对象,所以它无用
谁能借给我一根绳子?答案 0 :(得分:2)
DefaultTrackingEventHandler是处理跟踪的脚本。在多个标记的示例场景中,它附加到ImageTarget。
该脚本注册到TrackableBehaviour并通过OnTrackingFound / Lost方法传播找到/丢失的跟踪。
在示例场景中,这些方法收集子对象的对撞机和渲染器并启用/禁用。
您可以做的是将信息进一步传播给其他听众。在这种情况下,您可以启用运行更新检查条件的脚本,直到满足条件并禁用脚本并匹配可跟踪行为。
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));
}
}
因此,您有一个基类,其中包含所有条件应该共有的数据,例如是否已满足条件,如图所示。和更新运行条件检查。
然后你有子类实现条件检查(必须自抽象)。