Guide
Note
Currently we only support AR Foundation 4 or older and Vuforia version 9.x. Support for ARFoundation 5 and Vuforia 10.x will be coming on future releases.
Quickstart
AR Foundation
Either starting from an empty project or an existing one, open the Package Manager window by clicking
on Window -> Package Manager and install the AR Foundation package, as well as the AR Core XR Plugin
and/or the AR Kit XR Plugin, depending on which platforms you are targeting.

Next, import the Unity AR+GPS Location package, either from the asset store, or from a .unitypackage you
have downloaded from our github repository.

Then, remove the default 'Main Camera' from the scene.

Right-click on the Hierarchy and go to AR+GPS -> Create Basic Scene Structure.

This will automatically populate the scene with all the Game Objects and Components for a basic AR+GPS experience!

Now just click on the GPS Stage Object and on the Inspector window, go into Location Options -> Location, and put the geographical coordinates of the location you want the object to appear at.

That's about it! Now you just need to build the project. On iOS just remember to set the Camera Usage Description and Location Usage Description strings on the Player Settings, and set the Achitecture to ARM64.

Now build and deploy the project onto your device, and you should the the object at the location you placed it at!
Note
If you are using AR Foundation 4.0 or newer, you will also need to configure the Plugin Provider. To do that go
to the Project Settings window, and then to XR Plug-in Management.

For more information on how to setup AR Foundation, please refer to the AR Foundation manual.
Vuforia
For Vuforia, starting with an empty project, open the Package Manager window by clicking
on Window -> Package Manager and install the AR Foundation package. This is necessary to avoid
scripting errors in the project, even though AR Foundation is not actually used here.

Next, import the Unity AR+GPS Location package, either from the asset store, or from a .unitypackage you
have downloaded from our github repository.

Make sure the current platform is set to either Android or iOS in the Build Settings window.

After that, navigate to the Resources/ARLocationConfig asset in the Project window, check the Use Vuforia option in the inspector, and wait for Vuforia to be imported into the project.

Then, remove the default 'Main Camera' from the scene.

Right-click on the Hierarchy and go to AR+GPS -> Create Basic Scene Structure.

This will automatically populate the scene with all the Game Objects and Components for a basic AR+GPS experience!

Now just click on the GPS Stage Object and on the Inspector window, go into Location Options -> Location, and put the geographical coordinates of the location you want the object to appear at.

Go to Resources -> VuforiaConfiguration and make sure that Device Tracker -> Track Device Pose is checked and that Tracking Mode is set to POSITIONAL. It also recommended that you enable ARCore support by
following the instructions here, and setting ARCore Requirement to OPTIONAL in the configuration.

That's about it! Now you just need to build the project. On iOS just remember to set the Camera Usage Description and Location Usage Description strings on the Player Settings.

Now build and deploy the project onto your device, and you should the the object at the location you placed it at!
Basic scene structure
AR Foundation
To create a basic scene structure manually, you need to first create the basic AR Foundation game objects by going to the Game Object menu (i.e., right-click on the Hierarchy window) on clicking on the following items:
XR -> AR SessionXR -> AR Session Origin

Resulting in the following scene structure:

Next, click on the AR Session Origin object, and add a ARPlaneManager component to it.

Then create a AR+GPS -> ARLocationRoot object as a child of the AR Session Origin.


Ok, now the basic AR+GPS structure is laid out! All we need now is an object to be positioned
in a given geo-location. There are a few components that will do that in different ways, as we will
see later. For now, let's create a AR+GPS -> GPS Stage Object.

This creates an empty GameObject with a PlaceAtLocation component added to it. So, for something
to actually appear, we should, for instance, child it to this component. Here we just create a Capsule
as a child.

Again, all is needed is to set the desired geographical coordinates in the inspector for the PlaceAtLocation component of the GPS Stage Object to place the object in the correspond location!
Vuforia
Again, starting with a new scene, delete the old Main Camera. Then, create a Vuforia Engine -> AR Camera and a Vuforia Engine -> Ground Plane -> Plane Finder, to create the basic Vuforia structure, like bellow.

As mentioned in the last section, check that Vuforia is properly configured for positional tracking.
Now, create a AR+GPS -> ARLocationRoot object at the root of the scene, and the basic structure is complete.

You can add a AR+GPS -> GPS Stage Object and add some renderable object as it's child, setting the
desired geographical coordinates at the PlaceAtLocation inspector for the GPS Stage Object.

Concepts
The AR+GPS system works by mixing the incoming GPS data from the device with the underlying AR tracking done by AR Foundation of Vuforia.
Both in AR Foundation and Vuforia, the AR tracking moves the camera (which starts at the origin of the world coordinates) around so that it matches the real movement of the device.
What the AR+GPS system does it to calculate the position and orientation of the gps-positioned objects relative to the user/camera, both in terms of position and orientation.
For that, it is essential that at ARLocationRoot object exists in the scene, as a sibling of the AR Camera used by the AR Tracker. Hence, in the case of AR Foundation, it will be a child of the AR Session Origin, while in the case of Vuforia it will be placed at the root of the scene.
The ARLocationRoot object must contain both a ARLocationManager and a ARLocationOrientation components. These components will ensure that the ARLocationRoot game object is aligned with the geographical directions, so that the objects are positioned correctly.
The ARLocationProvider handles all the GPS data incoming from the device. It can be placed anywhere in the scene. This data is filtered via the used configuration used by the ARLocationProvider.
These components are the foundation of the AR+GPS system. All the components that will actually place the objects in the scene will listen to events emitted by them to perform all the updates.
Altitude
Since the altitude data from mobile devices is usually unreliable, there are a few different ways of indicating altitude/height in the Unity AR+GPS Location plugin. The Altitude property in all locations will be interpreted differently depending on the mode that is chosen.
AbsoluteUse device's altitude data, and consider theAltitudeas absolute, relative to the sea-level.DeviceRelativeConsiders theAltitudeas being relative the the device.GroundRelativeConsiders theAltitudeas being relative the the nearest detected ground plane.IgnoreDisregard altitude in the calculations.
Stability and Precision
There is a certain trade-off between stability and precision; more measurements will mean, usually, better precision, but the objects will also move with each position update, disrupting stability and the persistence of the experience.
There are two situations in which objects will move due to the AR+GPS system: whenever there is a location update, and whenever there is a orientation update.
So, to make objects appear more stable, use low values of Max Number Of Location Updates, either in the individual components, or in the ARLocationProvider and in the ARLocationOrientation (but not zero, since that means infinite number of updates).
Components
ARLocationManager

The ARLocationManager components manages the interface between the AR+GPS plugin and the underlying AR session. This component is required for the AR+GPS system to function.
It should be placed in the ARLocationRoot object, which will be either a child of the AR Session Origin (AR Foundation) or at the root of the scene (Vuforia).
Properties:
CameraThe AR Camera that will be used for rendering the AR content. If this is not set, the camera tagged as 'MainCamera' will be used.Wait For AR Traking To StartIf true, wait until the AR Tracking starts to start with location and orientation updates and object placement. Recommended.Restart When AR Tracking Is RestoredIf true, every time the AR tracking is lost and regained, the AR+GPS system is restarted, repositioning all the objects.Set Target Frame Rate To 60MhzIf true, the manager will set 'Application.targetFrameRate' to 60.Debug ModeWhen debug mode is enabled, this component will print relevant messages to the console. Filter by 'ARLocationManager' in the log output to see the messages.
Events
On Tracking StartedEmitted when the AR tracking starts for the first time.On Tracking LostEmitted whenever the AR tracking is lost.On Tracking RestoredEmitted whenever the AR tracking is restored after being lost.
ARLocationProvider

This component manages all the data incoming from the GPS and magnetic sensors. The data is filtered according to the settings used, but you can also have access to the raw data. This component is required for the AR+GPS system to function.
Properties:
Time Between UpdatesThe minimum time between consecutive location updates.Min Distance Between UpdatesThe minimum distance that will trigger location updates.Accuracy RadiusThe desired accuracy radius. For instance, setting this to 25 will block any data with error radius larger than 25 meters.Max Number Of UpdatesThe global maximum number of location updates. Setting to low numbers will help block moving/repositioning of objects. Can also be set individually for each component.Mock Location DataThe mock location used in-editor.Max Wait TimeThe maximum time to wait for location to be enabled on start-up.Start Up DelaySets a delay for the location provider to start requesting updates. Useful for when using Unity Remote.Debug ModeWhen debug mode is enabled, this component will print relevant messages to the console. Filter by 'ARLocationProvider' in the log output to see the messages.
Events:
On EnabledEmitted when the first location reading is received.On Location UpdatedEmitted whenever a new (filtered) location data is received.On Raw Location UpdatedEmitted whenever a new (raw) location data is received.On Compass UpdatedEmitted whenever a new compass/heading data is received.
ARLocationOrientation

This component manages the orientation of the ARLocationRoot Game Object, so that that it is in synch with the geographical directions, by using the data from the device's magnetic sensors. It should be placed on the ARLocationRoot Game Object, and is required for the AR+GPS system to function.
Properties:
Max Number Of UpdatesThe maximum number of orientation updates. The updates will be paused after this amount. Zero means there is no limit and the updates won't be paused automatically.Average CountOnly update after measuring the heading N times, and take the average.Low Pass Filter FactorThis is the low pass filter factor applied to the heading values to reduce jitter. A zero value disables the low-pass filter, while a value of 1 will make the filter block all value changes.Use Raw Until First AverageIf set to true, use raw heading values until measuring the first average.Movement Smoothing FactorThe smoothing factor on the orientation rotation on change. Zero means disabled.True North OffsetA custom offset to the device-calculated true north direction. When set to a value other than zero, the device's true north will be ignored, and replaced by the magnetic heading added to this offset.Apply Compass Tilt Compensation On AndroidIf true, apply a tilt-compensation algorithm on Android devices.
Events:
On Orientation UpdatedEmitted after the orientation has been updated.On Before Orientation UpdatedEmitted just before the orientation has been updated, with the newyEuler angle as argument.
PlaceAtLocation


This component will place the Game Object it is attached to at a given geographical location. This is the easiest way to place gps-positioned AR content.
Properties:
Location Input TypeThe type of location coordinate input used. Either 'Location' to directly input location coordinates, or 'LocationData' to use a ScriptableObject.LocationInput the desired GPS coordinates here.Location DataA LocationData ScriptableObject storing the desired GPS coordinates to place the object.Override Altitude DataIf true, override the LocationData's altitude.Movement SmoothingThe smoothing factor for movement due to GPS location adjustments; if set to zero it is disabled.Max Number Of Location UpdatesThe maximum number of times this object will be affected by GPS location updates. Zero means no limits are imposed.Use Moving AverageIf true, use a moving average filter.Hide Object Until It Is PlacedIf true, the object will be hidden until the object is placed at the geolocation. If will enable/disable the MeshRenderer or SkinnedMeshRenderer when available, and enable/disable all child game objects.
Events:
Object Location UpdatedEvent called when the object's location is updated. The arguments are the current GameObject, the location, and the number of location updates received by the object so far.Object Position UpdatedEvent called when the object's position is updated after a location update. If the Movement Smoothing is larger than 0, this will fire at a later time than the Location Updated event. The arguments are the current GameObject, the location, and the number of position updates received by the object so far.
PlaceAtLocations

This component will take an array of Locations and instantiate a given Prefab, placing the instances in the given locations.
Hotspot

This component will create a AR Hotspot. Given a geo-location, when the user is inside the Activation Radius from that point, the hotspot will be activated, and the Prefab will be instantiated, either in front of the camera, at a given Distance From de Camera, or at the center of the Hotspot.
Properties:
PrefabThe prefab/GameObject that will be instantiated by the Hotspot.Position ModeThe positioning mode. 'HotspotCenter' means the object will be instantiated at the Hotpot's center geo-location. 'CameraPosition' means it will be positioned at the front of the camera.Activation RadiusThe distance from the center that the user must be located to activate the Hotspot.Align To CameraIf true, align the instantiated object to face the camera (horizontally).Distance From CameraIf 'PositionMode' is set to 'CameraPosition', how far from the camera the instantiated object should be placed.
Events:
On Hotspot ActivatedEmitted when the hotspot is activated
MoveAlongPath

Moves a game object along a given LocationPath.
Properties:
Location PathThe LocationPath describing the path to be traversed.SpeedThe speed along the path.UpThe up direction to be used for orientation along the path.LoopIf true, play the path traversal in a loop.Auto PlayIf true, start playing automatically.Spline Sample CountThe number of points-per-segment used to calculate the spline.Line RendererIf present, renders the spline in the scene using the given line renderer.OffsetThe parameters offset; marks the initial position of the object along the curve.Altitude ModeThe altitude mode. 'Absolute' means absolute altitude, relative to the sea level. 'DeviceRelative' means it is relative to the device's initial position. 'GroundRelative' means relative to the nearest detected plane, and 'Ignore' means the altitude is ignored (equivalent to setting it to zero).Max Number Of Location UpdatesThe maximum number of times this object will be affected by GPS location updates. Zero means no limits are imposed.
PlaceAlongPath

Instantiates the given Prefab, placing the instances along the Path.
Properties:
PathThe LocationPath describing the path where objects will be placed.PrefabThe prefab to be instantiated.Object CountHow many instances will be created.Spline Sample SizeThe number of points-per-segment used to calculate the spline.Movement SmoothingThe smoothing factor for movement due to GPS location adjustments; if set to zero it is disabled.Max Number Of Location UpdatesThe maximum number of times this object will be affected by GPS location updates. Zero means no limits are imposed.Use Moving AverageIf true, use a moving average filter.Hide Object Until It Is PlacedIf true, the object will be hidden until the object is placed at the geolocation. If will enable/disable the MeshRenderer or SkinnedMeshRenderer when available, and enable/disable all child game objects.
RenderPathLine

Renders the given LocationPath using a LineRenderer.
Properties:
Location PathThe LocationPath that will be rendered.Altitude ModeThe altitude mode. 'Absolute' means absolute altitude, relative to the sea level. 'DeviceRelative' means it is relative to the device's initial position. 'GroundRelative' means relative to the nearest detected plane, and 'Ignore' means the altitude is ignored (equivalent to setting it to zero).Spline Sample CountThe number of points-per-segment used to calculate the spline.Line Render Sample CountThe number of points-per-segment used draw the spline.Line RendererThe LineRenderer to render the Path with.
ScriptableObjects
LocationData

Holds the geo-coordinates for a location. To create, go to Create -> AR+GPS -> Location.
LocationPath

Holds data for a path/curve in space, defined by a set of geo-coordinates. To create, go to Create -> AR+GPS -> Path.
ARLocationConfig

This holds the global configuration for the Unity AR+GPS Location. The plugin will automatically create a configuration file at Resources/ARLocationConfig.
Properties:
Earth Radius in KMThe value of the Earth's radius, in KM, used for distance calculations.Distance FunctionThe distance function used to calculate geographical distances.Initial Ground Height GuessThe initial guess for the distance between the device and the ground.Min Ground HeightThe minimum distance between the device and the ground (for when detecting the floor planes)Max Ground HeightThe maximum distance between the device and the ground (for when detecting the floor planes)Vuforia Ground Hit Test DistanceThe minimum distance, in meters, between Hit tests when detecting the nearest ground plane in Vuforia.Ground Height Smoothing FactorThe movement smoothing for when the ground plane height changes.Use VuforiaEnable/disable Vuforia.
Scripting
Placing objects at runtime
Suppose you want to place a single object at a given location, at runtime.
var loc = new Location()
{
Latitude = myLatValue,
Longitude = myLngValue,
Altitude = myAltValue,
AltitudeMode = AltitudeMode.GroundRelative
};
var opts = new PlaceAtLocation.PlaceAtOptions()
{
HideObjectUntilItIsPlaced = true,
MaxNumberOfLocationUpdates = 2,
MovementSmoothing = 0.1f,
UseMovingAverage = false
};
PlaceAtLocation.AddPlaceAtComponent(gameObject, loc, opts);
You can also use the PlaceAtLocation.CreatePlacedInstance to instantiate a given Prefab/game object at a given location.
If you have many objects/location, simply loop trough all of them, applying the formula above.
Updating the object location
If you placed an object using the PlaceAtLocation component, you can easily update it's geographical
location:
var newLocation = new Location()
{
Latitude = myLatValue,
Longitude = myLngValue,
Altitude = myAltValue,
AltitudeMode = AltitudeMode.GroundRelative
};
var placeAtLocation = GetComponent<PlaceAtLocation>();
placeAtLocation.Location = newLocation;
Distance from the user to a placed object
Once an object has been placed using the PlaceAtLocation component, you
can monitor the distance from the user to the object by calling
var distance = placeAtComponent.SceneDistance;
This simply a shorthand for the distance between the game object and the camera. You can also get the raw/unfiltered gps distance by doing
var rawDistance = placeAtComponent.RawGpsDistance;
Both can be useful for triggering actions based on the distance of the user to the object.
Resetting
To reset both the AR tracker and the AR+GPS system, call
ARLocationManager.Instance.ResetARSession((() =>
{
Debug.Log("AR+GPS and AR Session were restarted!");
}));
If you want to reset only the AR+GPS system, you can write
ARLocationManager.Instance.Restart();
Custom Location Providers
The location provider that is used by the AR+GPS system, is the UnityLocationProvider class. If, for some reason, you wish to use your own custom location provider (e.g., you want to use a native module, or have a special type of device you want to support), just create a class that implements the ILocationProvider interface. Then add ARGPS_CUSTOM_PROVIDER to the Scripting Define Symbols in the Player settings, and finally, edit the script ARLocation/Scripts/Components/ARLocationProvider and on line 130, instantiate your provider:
#elif ARGPS_CUSTOM_PROVIDER
// If you want to use a custom location provider, add 'ARGPS_CUSTOM_PROVIDER' to the define symbols in the Player
// settings, create a implementation of ILocationProvider, and instantiate it in the line below.
Provider = new ARGpsCustomLocationProvider();
#else
Geographical Location From World Position
If you need the geographical coordinates for a given world-position (for instance, if you want the user to place objects around him, and get the lat/lon coordinates to save these locations to be restored in another session), use the following code:
Location location = ARLocationManager.Insance.GetLocationForWorldPosition(worldPosition);
Troubleshooting
Some tips to avoid common errors:
- Make sure your device has a working GPS and magnetic sensors.
- When using AR Foundation, always check if ARKit and/or ARCore are installed.
- When using Vuforia, make sure
AR Foundationpackage is installed but that ARKit and ARCore are not. - Don't use landscape mode on Android, since the tilt-compensation algorithm currently does not support it.
- Always make sure the
AR Camerais tagged as theMainCameraor that it is set in theARLocationManageras theCameraproperty. - When using Vuforia, make sure positional tracking is activated.
Debugging
Many components have a
Debug Modeproperty that, when set, will print relevant information to the devices console. For instance, when using thePlaceAtLocationcomponent, you can use this to keep track of the position changes of the object.The
Prefabs/Debug/ARLocationInfoprefab contains aCanvaswhich will display useful information on the screen.
Reporting bugs
You can report bugs here.
You can also ask questions, submit other issues and/or feature requests in this link.