Integration with Game Engines

Unity

Integration with Unity can be done only using C# binding. We tested it only on Windows, but it may work on Linux and MacOS too. Android and IOS are not supported.

Setup

You can build C# binding from source or download precompiled package directly from Nuget.

Here we will provide steps to configure it using precompiled package from Nuget.

  • Download the latest NuGet Unity package from NuGetForUnity

  • Open your Unity project

  • Click on NuGetForUnity.x.x.x.unitypackage and add it into your project

  • In the Unity editor, go to NuGet/Manage NuGet Packages

  • Search for mindrove and click Install

  • After building your game for production don’t forget to copy *Unmanaged(C++)* libraries to a folder where executable is located. ( for example on 64-bit Windows you should copy .dll files from MindRoveSDK )

Now, you are able to use MindRove API in your Unity project.

Examples

For this demo we will create a simple script to read data from the board.

Add a game object to the Scene and attach script below.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using mindrove;
using mindrove.math;

public class SimpleGetData : MonoBehaviour
{
    private BoardShim board_shim = null;
    private int sampling_rate = 0;

    // Start is called before the first frame update
    void Start()
    {
        try
        {
            BoardShim.set_log_file("mindrove_log.txt");
            BoardShim.enable_dev_board_logger();

            MindRoveInputParams input_params = new MindRoveInputParams();
            int board_id = (int)BoardIds.SYNTHETIC_BOARD;
            board_shim = new BoardShim(board_id, input_params);
            board_shim.prepare_session();
            board_shim.start_stream(450000, "file://mindrove_data.csv:w");
            sampling_rate = BoardShim.get_sampling_rate(board_id);
            Debug.Log("Mindrove streaming was started");
        }
        catch (MindRoveError e)
        {
            Debug.Log(e);
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (board_shim == null)
        {
            return;
        }
        int number_of_data_points = sampling_rate * 4;
        double[,] data = board_shim.get_current_board_data(number_of_data_points);
        // check https://mindrove.readthedocs.io/en/stable/index.html for api ref and more code samples
        Debug.Log("Num elements: " + data.GetLength(1));
    }

    // you need to call release_session and ensure that all resources correctly released
    private void OnDestroy()
    {
        if (board_shim != null)
        {
            try
            {
                board_shim.release_session();
            }
            catch (MindRoveError e)
            {
                Debug.Log(e);
            }
            Debug.Log("Mindrove streaming was stopped");
        }
    }
}

Fixing errors

If you get the error: “Failed to load ‘Assets/Packages/mindrove.x.x.x/lib/BoardController32.dll’, expected x64 architecture, but was x86 architecture.” Or similar error for other native libraries from MindRove you should open this library in Unity editor and fix checkboxes for CPU.

  • Find Assets/Packages/mindrove.x.x.x/lib/BoardController32.dll inside Unity Editor and click on properties in context menu

  • In the properties window, on the left tab, under CPU, select “x86”

  • In the properties window, on the right tab, select ONLY the “x86” checkbox

  • Restart Unity Editor

Unreal Engine

We provide Unreal Engine Plugin with instructions how to compile and use it. Check Readme for installtion details.

This blog post can help if you want to write your own plugin or extend existing one.

CryEngine

CryEngine uses CMake, build MindRove by yourself first and check C++ examples for instructions to integrate MindRove into CMake projects.

Keep in mind MSVC runtime linking, default in MindRove is static, you can provide -DMSVC_RUNTIME=dynamic or -DMSVC_RUNTIME=static to control it.