Match Action: OnMatchAquire -> tell MARS to stop scanning

Hello everybody,

I’m making a marker-based game and I’m running into some issues. Unity MARS recognizes the image on my wall without problem and places the content correctly.
My game requires the user to alternate between mikro and makro-view (to get close with the phone and then to back up again). During this transition Unity MARS makes a lot of new match aquires, which are not really needed, since the game was placed correctly at the start.
I’d like to use the OnMatchAquire on my Marker-Proxy and add a new event that tells MARS to stop searching for the marker once it has been successfully found.

Is there already a script for something like that. And if not does anybody know how to write something like this?

Thank you for your help.

Hi there! Sorry to hear you’re having trouble.

There are a few ways to stop MARS from doing stuff. The “nuclear option” is MARSCore.Paused, which is a static bool field which can be used to temporarily suspend all MARS systems from running. Data providers won’t update, and the solver won’t solve. Another way is to just get things to slow down by increasing the interval between solves in Project Settings > MARS > Runtime > Evaluation Interval. Using something like 1 second might be a better interval for your particular experience. Or you could switch Startup Mode in that same settings menu to Wait for Request, and use a script to explicitly control when the solver should run.

However, it sounds like what you’re asking for is to just disable image marker tracking when your proxy is acquired. I would do this by adding a MatchAction to the proxy which calls a method on some script. Have this script subscribe to IUsesMarkerTracking and then call this.StopTrackingMarkers(); in that method. This will stop the marker tracking data provider from tracking, so bear in mind that updates to that image (like if it moves) will be missed.

Another approach would be to split the Proxy apart from its content, so that the content can persist even after the match is lost and “reattach” when it is found. The ShowChildrenOnTrackingAction just isn’t built for that kind of situation, as it tries to accurately reflect the tracking data we are getting from the device. To do this, I would recommend that you create a separate object (which is not a child of the proxy) for the content which starts inactive, but exposes public method to activate and update its position, which can be driven by MatchAction events. Basically just ignore the “match loss” event, and your content will stay where it is between matches.

For an example of what I’m talking about with option 2:

using Unity.MARS.Providers;
using Unity.XRTools.ModuleLoader;
using UnityEngine;

public class DisableImageTrackingOnMatch : MonoBehaviour, IUsesMarkerTracking
{
    IProvidesMarkerTracking IFunctionalitySubscriber<IProvidesMarkerTracking>.provider { get; set; }

    public void StopMarkerTracking()
    {
        this.StopTrackingMarkers();
    }

    public void StartMarkerTracking()
    {
        this.StartTrackingMarkers();
    }
}

Thank you @mtschoen for the very detailed answer. I’ll try it right away.

1 Like

Hey all
I have a target tracking in unity MARS. It works perfectly when it found my target, but I need to destroy that object, if there the marker is not tracking (is not seen by camera). What should I do? I tried using Match Action > On Match Acquire to enable game object and then Match Action > On Match Loss to disable it. The enabling action works fine, but the loss action is not working.