Skip to content

Installation

Add Tempo to a project

Create your repository from TempoSample as a template, then rename the project:

git clone <your_repo> --recurse-submodules
cd <your_repo>
Scripts/Rename.sh MyProject

Recurse submodules

Tempo is a submodule of TempoSample. If you forget --recurse-submodules, fix it with git submodule update --init --recursive Plugins/Tempo.

Rename early

Scripts/Rename.sh is only meant for a freshly cloned TempoSample. It will not help you rename a project you have already started adding files to.

Clone Tempo into your project's Plugins directory:

cd <your_project>/Plugins
git submodule add https://github.com/tempo-sim/Tempo.git
git submodule update --init --recursive

Disable ROS plugins if unused

Tempo's primary interface is gRPC, which needs no ROS — see Client APIs. TempoROS and TempoROSBridge are optional and TempoSample explicitly enables both. If you are not using ROS, disable them before building:

  • In your .uproject, set the TempoROS and TempoROSBridge entries' Enabled field to false:

    .uproject
    {
        "Name": "TempoROS",
        "Enabled": false
    },
    {
        "Name": "TempoROSBridge",
        "Enabled": false
    }
    
  • Remove CustomStageCopyHandler=TempoROSCopyHandler from Config/DefaultGame.ini.

This avoids requiring a ROS 2 installation and skips building the ROS-dependent modules.

One-time setup

Run Setup.sh (or Setup.bat on Windows) once, from the Tempo root or from Scripts/:

Plugins/Tempo/Setup.sh

This script:

  • Modifies your project's *.Target.cs files to use Tempo's custom toolchain, which is necessary for linking certain third-party dependencies properly
  • Installs the Tempo engine mods, patching your installed Engine in place
  • Downloads third-party dependencies
  • Adds git hooks that keep engine mods and third-party dependencies up to date automatically as you check out different Tempo commits

-skip-hooks is for Tempo developers only

Setup.sh accepts a -skip-hooks flag which suppresses installing the post-checkout and post-merge git hooks. This is intended only for developers actively modifying Tempo itself — when iterating on Tempo source while not touching EngineMods/ or third-party dependencies, the hooks can add noticeable overhead to every git checkout / git merge.

Without the hooks, engine mods and third-party deps will not re-sync automatically when you change Tempo commits, and you must run Scripts/InstallEngineMods.sh and Scripts/SyncDeps.sh manually to keep them in sync. If you are simply using Tempo as a dependency in your project, do not use this flag.

Build and run

Plugins/Tempo/Scripts/Build.sh    # or Build.bat on Windows
Plugins/Tempo/Scripts/Run.sh      # opens the project in Unreal Editor

TempoSample wraps both in project-level Scripts/Build.sh and Scripts/Run.sh, so from a TempoSample-derived project you can just run Scripts/Build.sh.

The build does more than compile C++. It also:

  • Generates C++ and Python code from every .proto file in the project
  • Generates the tempo_sim Python package (plus a project package, if your project defines its own services) and installs both into a virtual environment at <project_root>/TempoEnv
  • Optionally generates Rust and C++ client libraries — see Client APIs

The full set of scripts is documented in the scripts reference.

Verify it worked

Open the project in Unreal Editor and press Play. If the Tempo gRPC server started, the Editor log contains:

LogTempoCore: Display: Tempo gRPC server listening on 0.0.0.0:10001

From another terminal:

source ./TempoEnv/bin/activate            # TempoEnv/Scripts/activate on Windows
python -c "import tempo_sim.tempo_core as tc; print(tc.get_current_level_name())"

If that prints your level's name, the server is up and you are ready for Hello World.