Skip to content


General Debugging

From the Cognitive3D menu, you can select Preferences. The Enable Logging checkbox will log more information from Cognitive3D components. This should be disabled in a release build.

Selecting your SDK

In the Scene Setup window, you can select an SDK for a VR plugin you are using. This will set a scripting define symbol to enable code. If you do not have the SDK in your project or it is not the correct version, you may have compile errors. To manually clear the SDK settings, you can use Edit->Project Settings->Player. In Other Settings, clear any symbols that begin with C3D_.

scripting define symbols

Fixation Recorder

If you are using eye tracking hardware for your project, you can record Fixations to give you a detailed look at how your participants are focusing throughout your experience.

First, make sure you select the correct SDK from the Scene Setup window. Then, attach a Fixation Recorder component to the Cognitive3D_Manager GameObject in your scene. There are several parameters on the component to configure how fixation points are recorded. The default values are taken from several academic papers and should be suitable for most projects.


Some meshes are not exported

  • We do not currently support exporting Line Renderers, Trail Renderers, Particles or procedural meshes that do not reference saved asset files. Some materials (such as transparent materials) may have issues rendering correctly on SceneExplorer.

Meshes that are a child of a Dynamic Object will be exported with that Dynamic Object and NOT exported with the scene.

Some lights are not exported

Area lights are not supported and will be skipped when exporting your scene. Many advanced properties from HDRP and URP lights may not be supported either.

I am getting an error when trying to upload my Scene or Dynamic Objects.

There are a few commons reasons for errors during the upload process:

Do you have both of the Application Key and Developer Key set properly? We do not store the Developer Key in Unity or Unreal project folders for security purposes, and this key may be lost when moving PCs or changing engine versions. You can simply get the Developer Key again from the Dashboard.

In the Advanced Options panel, do you have "Custom Gateway" set to "" ?

Player Position and Gaze Tracking

Main Camera

  • It is expected that the player's HMD will use a camera tagged MainCamera. This is used as a fallback when a camera cannot be found in SteamVR [CameraRig] or Oculus OVRCameraRig. If there are multiple **MainCamera**s in the scene, there may be unexpected results in your session data.

No data uploaded to SceneExplorer

There are a few common reasons data from your play session might not display on SceneExplorer

No Cognitive3D_Manager

Make sure there is a Cognitive3D_Manager in your scene.

The scene does not have a Scene Key associated with it

The Scene Key is the ID used by SceneExplorer to send data to the correct scene. Without a scene key, data is not collected and not uploaded. This is automatically set when you export your scene. You can also see your Scene Settings from the Cognitive3D->Preferences menu.

Application is closed unexpectedly

Unity's implementation of OnQuit does not work as expected when the process is ended without calling Application.Quit. This also doesn't always work as expected on mobile. When possible, call Cognitive3D.Cognitive3D_Manager.FlushData(); to reliably send data to SceneExplorer.

Gaze points aren't visible on SceneExplorer

Gaze points aren't appearing on Dynamic Objects

  • Make sure your Dynamic Objects have a collider and that the collider is not set as 'trigger'. You should also try to get your collider's size to be as close as possible to the surface of your mesh.

Controller Inputs

SteamVR 2.2.0

Controller Input Tracking is supported for the Vive Controller using SteamVR 2.2.0 and Cognitive3D Unity package v0.11.3 or later.

Before running the Cognitive Scene Setup Wizard, you must have opened the SteamVR Input Window and pressed Save and generate. After pressing Setup Controller Dynamics, Append Cognitive Action Set and Add Default Bindings.

Finally, you must open the SteamVR Input Window again and press Save and Generate.

Manual Setup

The Dynamic Object component can track the player's controllers:

  1. Add a Dynamic Object component to the left and right controller GameObjects.
  2. Check 'IsController' in Advanced Options.
  3. Check or uncheck 'IsRight' if this controller is the right hand controller.

controller select


ExitPoll panel never appears

Not spawning from code

This code will log when the ExitPoll Panel is created and the ExitPoll is closed. There may be other issues, but this sanity check can be helpful

    IEnumerator Start()
        yield return new WaitForSeconds(6);
        Debug.Log("Initialize ExitPoll");

        System.Action action = () => Debug.Log("ExitPoll Closed");


Collision is off by default, but make sure the LayerMask is correctly configured when the ExitPoll is spawned. If you are using the Oculus Utilities OVRPlayerCharacter prefab, it could be colliding with the CharacterController collider. It may also be colliding with the player's hands or held items.

Custom Shaders

If you find a surface in SceneExplorer is white, it is likely the surface in Unity is using a material with an unsupported shader.

unsupported shader

When using shader graphs or different render pipelines, materials may use different property names to identify textures and values. We automatically support many shaders that are included with Unity, but you may need to add support for your custom shaders.

First, create a new script in the Cognitive3D/Editor/GLTF folder and name it something to represent the custom shader you wish to support.

shader property class

In Unity, select one of the surfaces that appears white on SceneExplorer. In the top right of the Inspector select the Debug option from the dropdown menu. Notice the material properties at the bottom of the inspector. These values will be used in the script to identify which textures should be exported.

shader properties

Open the script you created earlier. In the constructor you can set names of material properties. In some cases, you may need to override methods and perform additional logic on these values. Below is an example for a simple custom shader. The GLTF exporter will automatically select the correct ShaderPropertyCollection based on the ShaderNames.

using UnityEngine;

public class MyCustomShaderProperties : UnityGLTF.GLTFSceneExporter.ShaderPropertyCollection
    public MyCustomShaderProperties()
        ShaderNames.Add("Custom/My Custom Shader"); //this should match the 'shader name' and not the filename of the shader
        AlbedoMapName = "_AlbedoMap"; //often uses the words: albedo, diffuse, base
        AlbedoColorName = "_Color";
        MetallicPowerName = "_Metalic"; //note the typo. if this is how it is written in the shader, and should match exactly
        RoughnessPowerName = "_Smoothness"; //often roughness, shininess, gloss, smoothness

    //gltf uses roughness. in this case, we can override this method and do some logic
    //roughness = 1 - shininess
    public override bool TryGetRoughness(Material m, out float power)
        power = 1 - m.GetFloat("_Smoothness");
        return true;