C# 检查ARCamera是否首次检测到标记,并;“繁殖”;三维对象
我正在尝试制作一个简单的AR应用程序,我尝试制作的应用程序的流程是,camera detect first marker>做事,camera detect Second marker>做事 问题是我已经用我能想到的关键字组合在谷歌上搜索了,而且我也在寻找文档,但我真的找不到对我的问题有帮助的东西 我最初的想法是在所说的标记上使用一个脚本,并在void-OnEnable上添加“do-something”,但该对象无论如何都是enable的,所以它是无用的C# 检查ARCamera是否首次检测到标记,并;“繁殖”;三维对象,c#,unity3d,vuforia,C#,Unity3d,Vuforia,我正在尝试制作一个简单的AR应用程序,我尝试制作的应用程序的流程是,camera detect first marker>做事,camera detect Second marker>做事 问题是我已经用我能想到的关键字组合在谷歌上搜索了,而且我也在寻找文档,但我真的找不到对我的问题有帮助的东西 我最初的想法是在所说的标记上使用一个脚本,并在void-OnEnable上添加“do-something”,但该对象无论如何都是enable的,所以它是无用的 有人能借我一根绳子吗?DefaultTra
有人能借我一根绳子吗?DefaultTrackingEventHandler是处理跟踪的脚本。在多个标记的示例场景中,它附着到ImageTarget 该脚本注册到TrackableBehavior,并通过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));
}
}
公共类DefaultTrackableEventHandler:MonoBehavior,
ITrackableEventHandler
{
私人可追踪行为;
[SerializedField]私有MyConditionClass actionMb=null;
受保护的虚拟void Start()
{
mtrackablebhavior=GetComponent();
if(MTrackableBehavior)
{
mtrackablebhavior.RegisterTrackableEventHandler(此);
}
}
公共无效OnTrackableStateChanged(
可跟踪行为。状态优先状态,
可跟踪的行为。状态(状态)
{
if(newStatus==trackablebehavior.Status.DETECTED||
newStatus==trackablebehavior.Status.TRACKED||
newStatus==trackablebehavior.Status.EXTENDED\u TRACKED)
{
OnTrackingFound();
}
其他的
{
OnTrackingLost();
}
}
受保护的虚拟空间OnTrackingFound()
{
//已成功完成
如果(this.actionMb.ConditionMet==true){return;}
this.actionMb.enable=true;
}
受保护的虚拟空间OnTrackingLost()
{
//已成功完成
如果(this.actionMb.ConditionMet==true){return;}
this.actionMb.enable=false;
}
}
公共抽象类MyConditionClass:单行为
{
公共布尔条件集{get;private set;}
受保护的抽象bool CheckCondition();
受保护的虚拟无效更新(){
如果(ConditionMet==true){return;}
ConditionMet=CheckCondition();
}
}
公共类MyConditionClassForInput:MyConditionClass
{
受保护的覆盖布尔检查条件(){
返回(Input.GetKeyDown(KeyCode.Space));
}
}
因此,您有一个基类,其中包含所有条件所共有的数据,如图所示,条件是否已经满足。以及运行条件检查的更新
然后就有了实现条件检查的子类(必须从抽象开始) DefaultTrackingEventHandler是处理跟踪的脚本。在多个标记的示例场景中,它附着到ImageTarget 该脚本注册到TrackableBehavior,并通过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));
}
}
公共类DefaultTrackableEventHandler:MonoBehavior,
ITrackableEventHandler
{
私人可追踪行为;
[SerializedField]私有MyConditionClass actionMb=null;
受保护的虚拟void Start()
{
mtrackablebhavior=GetComponent();
if(MTrackableBehavior)
{
mtrackablebhavior.RegisterTrackableEventHandler(此);
}
}
公共无效OnTrackableStateChanged(
可跟踪行为。状态优先状态,
可跟踪的行为。状态(状态)
{
if(newStatus==trackablebehavior.Status.DETECTED||
newStatus==trackablebehavior.Status.TRACKED||
newStatus==trackablebehavior.Status.EXTENDED\u TRACKED)
{
OnTrackingFound();
}
其他的
{
OnTrackingLost();
}
}
受保护的虚拟空间OnTrackingFound()
{
//已成功完成
如果(this.actionMb.ConditionMet==true){return;}
this.actionMb.enable=true;
}
受保护的虚拟空间OnTrackingLost()
{
//已成功完成
如果(this.actionMb.ConditionMet==true){return;}
this.actionMb.enable=false;
}
}
公共抽象类MyConditionClass:单行为
{
公共布尔条件集{get;private set;}
受保护的抽象bool CheckCondition();
受保护的虚拟无效更新(){
如果(ConditionMet==true){return;}
ConditionMet=CheckCondition();
}
}
公共类MyConditionClassForInput:MyConditionClass
{
受保护的覆盖布尔检查条件(){
返回(Input.GetKeyDown(KeyCode.Space));
}
}
因此,您有一个基类,其中包含所有条件所共有的数据,如图所示,条件是否已经满足。更新运行一个condi