{"id":49308717,"url":"https://github.com/sun-lab-nbb/sollertia-unity-tasks","last_synced_at":"2026-04-26T11:03:06.939Z","repository":{"id":316802459,"uuid":"991426369","full_name":"Sun-Lab-NBB/sollertia-unity-tasks","owner":"Sun-Lab-NBB","description":"Provides assets to create and execute Virtual Reality (VR) tasks for Sollertia platform data acquisition systems.","archived":false,"fork":false,"pushed_at":"2026-04-20T01:53:08.000Z","size":13009,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-20T03:39:05.352Z","etag":null,"topics":["data-acquisition","experiment","game-engine","sollertia","unity","virtual-reality"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Sun-Lab-NBB.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-27T15:52:26.000Z","updated_at":"2026-04-20T01:53:13.000Z","dependencies_parsed_at":"2025-09-26T20:52:02.558Z","dependency_job_id":"5ff79cad-2dee-4f9e-a1ed-ab609e16507b","html_url":"https://github.com/Sun-Lab-NBB/sollertia-unity-tasks","commit_stats":null,"previous_names":["sun-lab-nbb/sl-unity-tasks","sun-lab-nbb/sollertia-unity-tasks"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/Sun-Lab-NBB/sollertia-unity-tasks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-Lab-NBB%2Fsollertia-unity-tasks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-Lab-NBB%2Fsollertia-unity-tasks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-Lab-NBB%2Fsollertia-unity-tasks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-Lab-NBB%2Fsollertia-unity-tasks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Sun-Lab-NBB","download_url":"https://codeload.github.com/Sun-Lab-NBB/sollertia-unity-tasks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-Lab-NBB%2Fsollertia-unity-tasks/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32294592,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-acquisition","experiment","game-engine","sollertia","unity","virtual-reality"],"created_at":"2026-04-26T11:03:04.695Z","updated_at":"2026-04-26T11:03:06.930Z","avatar_url":"https://github.com/Sun-Lab-NBB.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sollertia-unity-tasks\n\nProvides assets to create and execute Virtual Reality (VR) tasks for Sollertia platform data acquisition systems.\n\n[![C#](https://tinyurl.com/bdd689s9)](https://docs.microsoft.com/en-us/dotnet/csharp/)\n[![Unity](https://img.shields.io/badge/Unity-6000.3.3f1_LTS-000000?logo=unity\u0026logoColor=white)](https://unity.com/)\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)\n\n___\n\n## Detailed Description\n\nThis project is part of the [Sollertia](https://github.com/Sun-Lab-NBB/sollertia) AI-assisted scientific data\nacquisition and processing platform, built on the [Ataraxis](https://github.com/Sun-Lab-NBB/ataraxis) framework and\ndeveloped in the Sun (NeuroAI) lab at Cornell University. It provides assets and bindings for building Virtual Reality\n(VR) tasks used by Sollertia platform data acquisition systems to conduct experiments. Primarily, the project is\ndesigned to construct an **infinite linear corridor** environment and display it to the animal during runtime using a\nset of three Virtual Reality monitors (screens).\n\nThis project is specialized to work with the\n[sollertia-experiment](https://github.com/Sun-Lab-NBB/sollertia-experiment) library used by all Sollertia platform data\nacquisition systems. It uses [MQTT](https://mqtt.org/) to bidirectionally communicate with the sollertia-experiment\nruntimes and relies on sollertia-experiment to provide it with the data on animal's behavior during the VR task\nexecution.\n\nThis project extends the original [GIMBL](https://github.com/winnubstj/Gimbl) VR framework, which has been inlined\ninto the project under `Assets/Gimbl/`. The refactored framework provides an interface for building and modifying tasks\nusing prefabricated assets ('prefabs'), deprecates GIMBL functionality now handled by sollertia-experiment (logging,\nunused MQTT topics), and removes legacy technical debt.\n\n___\n\n## Features\n\n- Runs on Windows, Linux, and macOS.\n- Supports tasks with multiple corridor segments and probabilistic transitions between them.\n- Includes agentic coding support with Claude Code skills for codebase exploration and style guide compliance.\n- Provides automated task structure verification to validate prefab positions against YAML template constants.\n- Exposes an HTTP-based MCP bridge for AI agent integration with the Unity Editor.\n- Apache 2.0 License.\n\n___\n\n## Table of Contents\n\n- [Dependencies](#dependencies)\n- [Installation](#installation)\n- [Usage](#usage)\n  - [Creating New Tasks](#creating-new-tasks)\n  - [Loading Existing Tasks](#loading-existing-tasks)\n- [Developer Notes](#developer-notes)\n- [Versioning](#versioning)\n- [Authors](#authors)\n- [License](#license)\n- [Acknowledgments](#acknowledgments)\n\n___\n\n## Dependencies\n\n### Internal Dependencies\n\nThese dependencies are included in the project as .dll files in `Assets/Plugins/`:\n\n- [MQTTnet](https://github.com/dotnet/MQTTnet) — MQTT 5.0 client for broker communication.\n- [YamlDotNet](https://github.com/aaubry/YamlDotNet) — YAML parser for task template loading.\n\n### External Dependencies\n\nThe following dependencies must be installed before working with this Unity project:\n\n- [MQTT broker](https://mosquitto.org/) version **2.0.21**. This project was tested with the broker running locally,\n  using the **default** IP (127.0.0.1) and Port (1883) configuration.\n- [Unity Game Engine](https://unity.com/products/unity-engine) version **6000.3.3f1 LTS**.\n- [Blender](https://www.blender.org/download/) version **4.5.0 LTS**. Only required for creating or modifying 3D\n  assets (corridor models). Not needed to run existing tasks.\n\n___\n\n## Installation\n\n### Source\n\n1. Install the [Unity hub](https://unity.com/download) and use it to install the required Unity Game Engine version.\n2. Download this repository to a local machine using a preferred method, such as Git-cloning. Use one of the stable\n   releases from [GitHub](https://github.com/Sun-Lab-NBB/sollertia-unity-tasks/releases).\n3. From the Unity Hub, select `add project from disk` and navigate to the local folder containing the downloaded\n   repository: \u003cbr\u003e \u003cimg src=\"imgs/AddProjectFromDisk.png\" width=\"300\"/\u003e\n\n**Hint.** If the correct Unity version is not installed when the project is imported, the Unity Hub displays a warning\nnext to the project name. Click on the warning and install the recommended Unity version:\n\u003cbr\u003e \u003cimg src=\"imgs/InstallRecommendedVersion.png\" width=\"600\"/\u003e\n\n___\n\n## Usage\n\nThis section discusses how to use existing tasks to conduct experiments and create new tasks using the project.\n**Note!** This library is specifically written to work with the\n[sollertia-experiment](https://github.com/Sun-Lab-NBB/sollertia-experiment) library and will likely not work in other \ncontexts without modification.\n\n### Creating New Tasks\n\nThe key feature of this project is the **task creator**: a system for quickly making any infinite corridor task with or\nwithout probabilistic transitions between corridor segments.\n\n#### Task Definition\n\nEach **task** can be conceptualized as a set of infinite corridor **segments** and the **transition probabilities**\nbetween them. Each segment is split into **cues**, which are portions of the corridor walls that have different\ncolors/textures. Since each task segment typically contains a stimulus trigger zone that conditionally delivers stimuli\nto the animal (water rewards, air puffs, etc.), traversing each segment typically constitutes a single **experiment\ntrial**. Therefore, the sequence of wall cues that makes each segment is referred to as the **cue sequence** in task\nconfiguration files.\n\nOverall, a set of segments can represent any task graph depicting transitions between infinite corridor cues. For\nexample, the cue graph below can be represented by two segments with uniform transition probabilities between\neach other:\n\n\u003c!--suppress CheckImageSize --\u003e\n\u003cimg src=\"imgs/cue_graph.png\" width=\"233\" alt=\"graph picture\"\u003e\n\n1. **Segment 1**: A, B, C\n2. **Segment 2**: A, B, D, C\n\nDuring experiment, both segments are typically reused many times to create a long sequence of segments to be experienced\nby the animal during runtime.\n\nIn addition to the general task structure, there are additional parameters to be considered for each task, including:\n\n- The length of each cue region.\n- The length of non-cue ('gray') wall regions between the cue regions.\n- The graphical texture (pattern) of each wall cue.\n- The graphical texture of non-cue wall regions (usually gray color, hence the name **gray regions**).\n- The graphical texture of the corridor floor.\n- The stimulus trigger zone locations and the conditions for the animal to receive the stimulus.\n\n#### Implementation\n\nTo create a task according to the desired specification, two assets need to be generated: a Unity prefab for each\nsegment and a YAML configuration file. The easiest way to create these assets is to start with an already existing\ntask and modify it to match the desired parameters. Use ctrl/cmd D to duplicate existing segment prefabs and copy\nexisting `.yaml` files from `Assets/InfiniteCorridorTask/Configurations/`.\n\n#### Segment Prefabs\n\nAll segment prefabs must be placed in the directory **Assets/InfiniteCorridorTask/Prefabs**. Double-clicking on a prefab\nopens up Unity's prefab editor. **Hint!** To verify that the file being edited is a prefab and not a GameObject, ensure\nthat the scene has a **blue** background.\n\n\u003cimg src=\"imgs/segment_prefab.png\" width=\"600\" alt=\"\"\u003e\n\nEach prefab includes several key elements:\n\n- **Stimulus Trigger Zone**: The parent zone that manages stimulus delivery. Its behavior depends on which child zone\n  is present (Guidance Zone or Occupancy Zone).\n- **Guidance Zone**: A child of the Stimulus Trigger Zone used in lick mode trials.\n- **Reset Zone**: After successfully triggering a stimulus delivery, the animal must pass through this zone before\n  another stimulus can be triggered.\n- **Occupancy Zone** *(optional)*: A child of the Stimulus Trigger Zone used in occupancy mode trials.\n\n**Zone Behavior Modes:**\n\nThe Stimulus Trigger Zone operates in one of two modes based on which child zone is present. The trigger mode\ndetermines *how* a stimulus is delivered, not *what* stimulus is delivered. Any stimulus type (water, air puff, etc.)\ncan be paired with either trigger mode.\n\n1. **Lick Mode** (with Guidance Zone child):\n   - When **Require Lick** is enabled: The animal must lick within the Stimulus Trigger Zone to receive the stimulus.\n   - When **Require Lick** is disabled (guidance mode): The stimulus is delivered automatically when the animal reaches\n     the Guidance Zone. The animal can still lick anywhere in the Stimulus Trigger Zone to receive the stimulus early.\n\n2. **Occupancy Mode** (with Occupancy Zone child):\n   - The animal must remain in the Occupancy Zone for the required duration to **disarm** the trigger zone's boundary.\n   - If the animal leaves early and collides with the boundary while it is still **armed**, the stimulus is delivered.\n   - When **Require Wait** is disabled (guidance mode): The library sends an MQTT message requesting the treadmill\n     brakes to lock, enforcing the occupancy requirement by preventing the animal from leaving early.\n\n**Note:** By convention, lick mode is typically used for reward delivery (water) and occupancy mode for aversion\nstimuli (air puff), but this pairing is not a technical requirement. Future experiments may use different\nstimulus-trigger combinations.\n\nOnce each prefab segment is created, an additional prefab must be made for padding. This padding prefab should be a long\nempty corridor, and it is used during task runtime to give the animal an illusion that the corridor is infinite.\n\n#### YAML Configuration File\n\nThe **task configuration file** ties the segment prefabs together and is required for creating and running tasks. These\nfiles are stored in `Assets/InfiniteCorridorTask/Configurations/` with a `.yaml` extension.\n\n**Note:** The configuration schema is derived from the\n[sollertia-shared-assets](https://github.com/Sun-Lab-NBB/sollertia-shared-assets) library and always matches the \ncurrent state of that library's data classes. See `task_template_data.py` in sollertia-shared-assets for the \nauthoritative schema definition.\n\n**File Naming Convention:**\n\nTemplate files follow the pattern `ProjectAbbreviation_TaskDescription.yaml`:\n\n| Abbreviation | Project Name      |\n|--------------|-------------------|\n| MF           | MaalstroomicFlow  |\n| SSO          | StateSpaceOdyssey |\n\n- Use `_Base` suffix for single-segment training configurations (e.g., `SSO_Shared_Base.yaml`).\n- Capitalize each word in the task description.\n- The template name and Unity scene name are derived from the filename (without `.yaml`).\n\n**Header Format:**\n\nEach template file must begin with a YAML comment header containing four fields:\n\n```yaml\n# Project: [Full project name]\n# Purpose: [Single sentence describing the task structure]\n# Layout:  [Segment names with cue letters and zone placements]\n# Related: [Related template file (parenthetical explanation)]\n```\n\nFor multi-line fields, align continuation text with the first character after the field name:\n\n```yaml\n# Layout:  Segment ABC with the rewarding stimulus (water) trigger zone in cue C.\n#          Segment ABDC with the rewarding stimulus (water) trigger zone in cue C.\n```\n\n**Schema:**\n\nThe structure is:\n\n- **cue_offset_cm** *(number)*: The offset in centimeters from the reset zone to the first cue.\n\n- **cues** *(array\\\u003cCue\u003e)*: The list of all cues used by any segment.\n    - **Cue**\n        - **name** *(string)*: The unique human-readable label for the cue (e.g., `\"A\"`, `\"Gray\"`).\n        - **code** *(integer, 0-255)*: The unique integer code for the cue used in logging.\n        - **length_cm** *(number)*: The length of the cue in centimeters.\n        - **texture** *(string)*: The filename of the texture image in `Assets/InfiniteCorridorTask/Textures/`\n          (e.g., `\"Cue 016 - 4x1.png\"`).\n\n- **segments** *(array\\\u003cSegment\u003e)*: The list of all segments.\n    - **Segment**\n        - **name** *(string)*: The name of the segment prefab (e.g., `\"Segment_abc_40cm\"`). Must match the prefab file\n          name in **Assets/InfiniteCorridorTask/Prefabs**.\n        - **cue_sequence** *(string[])*: The ordered list of cues in the segment.\n        - **transition_probabilities** *(number[])*: The probabilities of transitioning to each segment. Must sum to 1.\n          Optional; if unspecified, uniform transitions are assumed.\n\n- **vr_environment** *(object)*: VR corridor configuration.\n    - **corridor_spacing_cm** *(number)*: Distance between consecutive corridors in centimeters.\n    - **segments_per_corridor** *(integer)*: Number of segments per corridor. Setting this to 3 is generally enough to\n      give the illusion of an infinite corridor.\n    - **padding_prefab_name** *(string)*: The name of the padding prefab (usually `\"Padding\"`).\n    - **cm_per_unity_unit** *(number)*: Conversion factor from centimeters to Unity units.\n\n- **trial_structures** *(dict\\\u003cstring, TrialStructure\u003e)*: Maps trial names to their spatial configurations.\n    - **TrialStructure**\n        - **segment_name** *(string)*: The segment this trial uses.\n        - **stimulus_trigger_zone_start_cm** *(number)*: Start of the stimulus trigger zone in centimeters.\n        - **stimulus_trigger_zone_end_cm** *(number)*: End of the stimulus trigger zone in centimeters.\n        - **stimulus_location_cm** *(number)*: Position of the stimulus boundary in centimeters.\n        - **show_stimulus_collision_boundary** *(boolean)*: Determines whether to show the stimulus boundary to the\n          animal.\n        - **trigger_type** *(string)*: The trigger mode for the zone. Must be `\"lick\"` for segments with a\n          Guidance Zone child or `\"occupancy\"` for segments with an Occupancy Zone child. This field specifies the\n          trigger mechanism, not the stimulus type.\n\nSee existing configuration files in `Assets/InfiniteCorridorTask/Configurations/` for examples.\n\n***Note,*** the [sollertia-shared-assets](https://github.com/Sun-Lab-NBB/sollertia-shared-assets) MCP server provides a\n`validate_prefab_against_template` tool that validates configuration template files against existing prefabs via the\nMcpBridge. Developers and AI agents are highly encouraged to use this tool when creating or modifying configuration\nfiles to ensure zone positions, segment lengths, and other spatial parameters match the actual prefab state.\n\n#### 'CreateTask' Tab\n\nOnce the YAML configuration file is created, use the **CreateTask → New Task** command. This will open a file window to\nselect the YAML configuration file. Once the file is selected, a secondary prompt will open to name and save the prefab.\nOnce created, the prefab can be loaded and executed as described in [Loading Existing Tasks](#loading-existing-tasks).\n\n\u003cimg src=\"imgs/createTask.png\" width=\"700\" alt=\"\"\u003e\n\n### Loading Existing Tasks\n\nTask prefabs are generated locally using the CreateTask editor tool and saved to\n`Assets/InfiniteCorridorTask/Tasks/`. This directory does not exist in a fresh checkout and is created when the first\ntask is generated. To load a task into a scene, follow these steps:\n\n1. Create a new scene by clicking File → New Scene. Instead of using the default scene template, select\n   **ExperimentTemplate** as the template. ***Note,*** the first time this Unity project opens, it uses an empty scene.\n   If prompted, do ***not*** save this empty scene.\n   \u003cbr\u003e \u003cimg src=\"imgs/newScene.png\" width=\"600\"\u003e\n2. Navigate to **Assets/InfiniteCorridorTask/Tasks**. This folder contains task prefabs generated via the CreateTask\n   editor tool. Drag the prefab for the desired task into\n   the hierarchy window and wait for it to be loaded into the scene. **Note!** If Preferences \u003e Scene View \u003e 3D\n   Placement Mode is set to \"World Origin,\" then dragging the prefab into the hierarchy window will automatically\n   position the task correctly.\n   \u003cbr\u003e \u003cimg src=\"imgs/hierarchy_window.png\" width=\"800\"\u003e\n3. Select the task's **GameObject** in the **Hierarchy** window and view the **Inspector** window. The **Inspector**\n   window reveals the **Transform** component and the **Task** script. There are two things that must be verified at\n   this point:\n    1. That the transform's position is set to (0, 0, 0).\n    2. That the **Actor** parameter is set. If it is None, use the dropdown menu to set it to the **Actor Object** in\n       the scene.\n4. The *Task* script contains additional parameters which should not need to be modified:\n    - **Require Lick**: Determines whether the animal must lick within the stimulus trigger zone to receive the\n      stimulus. If disabled (guidance mode), the stimulus is delivered automatically when the animal reaches the\n      guidance zone. **Note!** During sollertia-experiment runtimes, this parameter is automatically overridden by the\n      sollertia-experiment GUI and runtime logic.\n    - **Require Wait**: Determines whether the animal must remain in the occupancy zone for the required duration to\n      disarm the trigger zone's start boundary. If disabled (guidance mode), the library sends an MQTT message\n      requesting the treadmill brakes to lock, enforcing the occupancy requirement.\n      ***Note,*** during sollertia-experiment runtimes, this parameter is automatically overridden by the\n      sollertia-experiment GUI and runtime logic.\n    - **Track Length**: The length of the track's wall cue sequence, in Unity units, to pre-create before runtime. This\n      is most relevant for tasks with multiple segments and random transitions between them. Pre-creating the cue\n      sequence before runtime allows sollertia-experiment to accurately track transitions between trials and support\n      trial-specific logic while treating the experiment runtime as a monolithic sequence of trials. **Note!** If the\n      animal traverses the entire pregenerated track, the Unity task starts making on the fly decisions about which\n      segment the animal enters at the end of each trial. Likely, this will cause sollertia-experiment to abort\n      with an error,\n      as it is not notified of these additional trials. Therefore, **it is advised to pre-generate a long cue sequence\n      at each runtime, guaranteeing the animal is not able to fully traverse it at runtime**.\n    - **Track seed**: The seed to use for resolving random transitions between segments. This is helpful when running\n      many experiments with the exact same pattern of segment transitions. If set to -1, then no seed is used and\n      transitions are randomized at each task runtime.\n    - **Config Path**: The file path to the YAML configuration file associated with the task. **Note!** If the\n      configuration file specified by this parameter is no longer found at the target path, the game becomes\n      non-functional. To fix this, change this parameter to specify the correct path (relative to the local root) or\n      recreate the task. See the ['creating new tasks'](#creating-new-tasks) section for more details about this file.\n5. Select File \u003e Save As to save the scene in *Assets/Scenes*.\n6. Select the **DisplaysWindow** tab located to the right of the Inspector tab. If the tab is not present, reopen it\n   by selecting Window \u003e Gimbl. Press `Refresh Monitor Positions`. This reveals a list of the monitors connected\n   to the computer. Assign **Camera: LeftMonitor**, **Camera: RightMonitor**, and **Camera: CenterMonitor** to the\n   corresponding monitors used for display to the animal. To verify that the monitors were assigned correctly, press\n   `Show Full-Screen Views`. For more information about configuring displays, consult the\n   [original GIMBL repository](https://github.com/winnubstj/Gimbl?tab=readme-ov-file#setting-up-the-actor).\n   **Warning!** Since rebooting the system frequently changes the Monitor output ports, always verify\n   monitor assignments before running experiment tasks.\n   \u003cbr\u003e \u003cimg src=\"imgs/display_tab.png\" width=\"300\"\u003e\n7. Press the play button to run the VR task. Verify that there are no errors displayed in the console window after\n   starting (playing) the task. **Hint!** If errors appear, start debugging by examining the **first** error\n   printed, which is likely the true error. Subsequent errors are likely a result of running a broken game loop after\n   the initial error. **Note!** The template environment is designed for experiments, where motion and licks should be\n   sent over the MQTT protocol. To test the task manually, replace the *linear controller* with a *simulated linear\n   controller*. Consult\n   [Setting Up the Actor](https://github.com/winnubstj/Gimbl?tab=readme-ov-file#setting-up-the-actor)\n   for instructions on this process.\n\n___\n\n## Developer Notes\n\nThese notes are primarily directed to project developers and task creators.\n\n* Be careful about modifying segment prefabs. Even after task creation, the task prefab relies on the existence of the\n  segment prefabs to run as expected. This means that if segment prefabs are modified later, it will also modify all\n  tasks using that prefab. To make small changes to many tasks, use the same segment prefab multiple times to\n  automatically synchronize the changes across all modified tasks. To modify one task without changing other tasks\n  that use the same prefab, make a new prefab that is a duplicate of the old one and modify the YAML configuration files\n  accordingly.\n* Most changes to the task structure can be implemented by modifying the segment prefabs. However, modifying a prefab\n  may invalidate all configuration files using that prefab. The YAML configuration file contains a lot of\n  information that needs to match the exact state of each prefab, so it is a good practice to ensure the validity\n  of all configuration files after modifying the prefab. Also, it is good practice to recreate the task from the\n  YAML configuration file following\n  prefab modification. If the newly created task uses the same name as the old task, it will replace the old task\n  prefab.\n* The [Loading Existing Tasks](#loading-existing-tasks) section explains how to create a scene to hold the desired task.\n  When running multiple experiments (using different tasks) from the same computer, it may be cumbersome to maintain\n  multiple Unity projects or to have one Unity project and switch the active task between experiments (within the same\n  scene). The best practice is to create a separate scene for each experiment as part of the same Unity project and\n  switch between scenes by double-clicking on them. When starting a new experiment, open the desired scene and run the\n  task. **Note!** The display configurations are scene-specific, so displays must be reconfigured separately for each\n  scene.\n* Be cautious when pushing and pulling code with GitHub. Merging branch conflicts is challenging with Unity and will\n  likely require changing one of the conflicting branches completely. Try to avoid merge conflicts and focus on making\n  changes to assets (prefabs) while avoiding making large changes to the scene. Additionally, it is a good practice to\n  close the Unity project before pushing/pulling.\n* The original GIMBL package was designed to log all non-brain-activity experiment data. Since this project is\n  explicitly designed to work with sollertia-experiment that now does all logging, **all Unity logging has been removed \n  from this project**.\n* For information on how to send MQTT messages to Unity, see\n  [here](https://github.com/winnubstj/Gimbl/wiki/Example-code-of-MQTT-subscribing-and-publishing).\n\n* Additional cue textures can be found [here](https://github.com/sprustonlab/vr-visual-cues). To use a new cue:\n    1. Convert an `.ai` file to `.png`.\n    2. Import the `.png` into Unity as an asset. Place the asset in the `Assets/InfiniteCorridorTask/Textures/` folder.\n    3. Reference the texture filename in the YAML configuration file's `texture` field for the desired cue entry.\n    4. The CreateTask editor tool automatically generates cue prefabs (with Left and Right Quad children) and materials\n       from the texture references in the YAML file. Existing cue prefabs and materials in\n       `Assets/InfiniteCorridorTask/Cues/` and `Assets/InfiniteCorridorTask/Materials/` are reused if already present.\n\n### MCP Bridge\n\nThe project includes an MCP bridge plugin (`McpBridge`) that starts an HTTP listener on `localhost:8090` when the\nUnity Editor loads. This bridge enables AI agents (via the\n[sollertia-shared-assets](https://github.com/Sun-Lab-NBB/sollertia-shared-assets) MCP server) to control the Unity\nEditor programmatically. The following tools are available through the bridge:\n\n| Tool                              | Description                                                        |\n|-----------------------------------|--------------------------------------------------------------------|\n| `generate_task_prefab`            | Creates a task prefab from a YAML template                         |\n| `inspect_prefab`                  | Returns hierarchy, components, and zone details of a prefab        |\n| `validate_prefab_against_template`| Validates that prefab zone positions match the template            |\n| `list_unity_assets`               | Lists Unity assets by type within a search path                    |\n| `list_scenes`                     | Lists all scene assets and identifies the active scene             |\n| `open_scene`                      | Opens a scene in the Editor                                        |\n| `create_scene`                    | Creates a new scene from the ExperimentTemplate                    |\n| `enter_play_mode`                 | Enters Play Mode                                                   |\n| `exit_play_mode`                  | Exits Play Mode                                                    |\n| `get_play_state`                  | Returns the current play state and active scene name               |\n\n### AI-Assisted Development\n\nClaude Code skills and AI development assets for this project are distributed through two marketplaces:\n\n- [sollertia](https://github.com/Sun-Lab-NBB/sollertia) marketplace:\n    - **assets** plugin — registers the `sollertia-shared-assets` MCP server (which also relays commands to the\n      Unity Editor's `McpBridge`) and provides skills for authoring task template YAMLs and experiment configurations.\n    - **unity** plugin — provides skills that drive Unity Editor operations through the `McpBridge` relay (prefab\n      generation, scene management, Play Mode control, asset enumeration, MQTT topic reference, Display rig setup,\n      and segment prefab authoring).\n- [ataraxis](https://github.com/Sun-Lab-NBB/ataraxis) marketplace: Provides shared development skills that enforce\n  coding conventions (C# style, README style, commit messages) and general-purpose codebase exploration tools via the\n  **automation** plugin.\n\nInstall all three plugins (`assets`, `unity`, and `automation`) to make the full skill set available to compatible AI\ncoding agents. The `unity` plugin depends on the `assets` plugin for the backing MCP server.\n\n___\n\n## Versioning\n\nThis project uses [Semantic Versioning](https://semver.org/). For available versions, see the\n[tags on this repository](https://github.com/Sun-Lab-NBB/sollertia-unity-tasks/tags).\n\n___\n\n## Authors\n\n- Jacob Groner ([Jgroner11](https://github.com/Jgroner11))\n- Ivan Kondratyev ([Inkaros](https://github.com/Inkaros))\n\n___\n\n## License\n\nThis project is licensed under the Apache 2.0 License: see the [LICENSE](LICENSE) file for details.\n\n___\n\n## Acknowledgments\n\n- All Sun Lab [members](https://neuroai.github.io/sunlab/people) for providing the inspiration and comments during the\n  development of this library.\n- The creators of the original [GIMBL](https://github.com/winnubstj/Gimbl) package and all dependencies used by that\n  package.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsun-lab-nbb%2Fsollertia-unity-tasks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsun-lab-nbb%2Fsollertia-unity-tasks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsun-lab-nbb%2Fsollertia-unity-tasks/lists"}