A Unity 6 application applying the Method of Loci to technical education.
Developed at the Department of Chemical Engineering, IIT Kanpur.
Authors: Aaditya Amlan Panda (220007) · Abhijit Dalai (220030)
Note: This is the desktop / web build of the project — it runs in the Unity Editor or as a standalone desktop application using a keyboard+mouse FPS rig, without requiring a VR headset. The full Meta Quest XR build lives in a separate private repository.
Memory.Palace.ChE.Edition_comp1.mp4
▶ Launch WebGL Build on Unity Play →
The backend may take up to 60 s to wake up on first load (free-tier cold start). Concepts will appear automatically once the server responds. A local CSV fallback activates if the backend is unreachable.
- Overview
- Research Background
- Pilot Study Results
- Project Structure
- Tech Stack
- Prerequisites
- Getting Started
- API Reference
- Concept Data Model
- Spatial Mnemonic Design
- Desktop Controls
- Web Review Dashboard
- Key Scripts
- Unity Packages
- Known Issues / TODOs
- Future Work
- Contributors
- Participants
Memory Palace places learning content inside a navigable 3D apartment. Each room object (e.g. a bathtub, lamp, door) is bound to one or more Chemical Engineering concepts stored in a PostgreSQL database via a REST API. Learners walk through the space, aim at objects, and are shown floating concept text labels and slide image panels — reinforcing spatial memory encoding without needing to imagine a palace from scratch.
After exploring, a companion web review dashboard (served by the same backend) lets users rate each concept's recall difficulty using a traffic-light system, which feeds a spaced-repetition strength score.
The dataset covers 114 Chemical Engineering concepts across material balances, thermodynamics, phase equilibria, equations of state, reaction engineering, and heat transfer.
The Method of Loci exploits the well-established superiority of spatial over verbal memory encoding. Neuroimaging studies show that navigating a familiar environment activates the hippocampus and parahippocampal place area — regions central to spatial and episodic memory consolidation. Dresler et al. (2017) demonstrated that six weeks of Method-of-Loci training produced durable changes in brain connectivity and recall performance persisting at a four-month follow-up.
VR and 3D environments extend this by providing a persistent, richly navigable space that the learner genuinely inhabits rather than merely imagines, adding a proprioceptive and navigational layer on top of visual instruction.
Gap addressed: Very few prior studies have combined an explicit Method-of-Loci protocol with a fully interactive 3D environment for abstract technical undergraduate content, and compared trained participants against a retention baseline on identical quiz items in a controlled two-day setting.
- Legge et al. (2012). Building a memory palace in minutes: Equivalent memory performance using virtual versus conventional environments. Acta Psychologica, 141(3), 380–390.
- Dresler et al. (2017). Mnemonic training reshapes brain networks to support superior memory. Neuron, 93(5), 1227–1235.
- Parong & Mayer (2018). Learning science in immersive virtual reality. Journal of Educational Psychology, 110(6), 785–797.
- Maguire et al. (1998). Knowing where and getting there: a human navigation network. Science, 280(5365), 921–924.
A six-participant pilot study was conducted with undergraduate students from IIT Kanpur (five non-ChE disciplines + one final-year ChE student). Participants completed two rounds of exploration followed by a multiple-choice quiz each round. One participant (benchmark) answered the quiz 2.5 hours after the session ended, serving as a delayed-recall reference.
| Participant | Dept. | Q-Set | Round 1 (%) | Round 2 (%) | Δ (pp) |
|---|---|---|---|---|---|
| Akarsh | Economics | 2 | 78.0 | 90.2 | +12.2 |
| Arjit | Civil Engg. | 1 | 70.2 | 57.9 | −12.3 |
| Dhruv | Aerospace Engg. | 2 | 66.7 | 80.6 | +13.9 |
| Jagdeesh | Mechanical Engg. | 2 | 76.0 | 96.0 | +20.0 |
| Snehil | Chemical Engg. | 1 | 73.2 | 78.0 | +4.9 |
| Group Mean | 72.8 | 80.5 | +7.7 | ||
| Amit (benchmark) | Mat. Sci. & Engg. | 2 | — | 73.3 | — |
Average per-question response time dropped 60.8% across all five gameplay participants — from 20.2 s (Round 1) to 7.9 s (Round 2). The benchmark participant averaged 11.6 s, slower than every Round 2 gameplay participant.
Hint dependency collapsed between rounds. Three of five participants reached 0% hint usage in Round 2, indicating that spatial associations replaced textual scaffolding as the primary retrieval cue.
Post-session Likert ratings averaged 8.5 / 10 for overall learning effectiveness. The highest-rated item (9.0 / 10) was "how well exploration aided quiz performance." The lowest-rated item (7.2 / 10) was topic locatability — identified as the key UX improvement target.
.
├── Assets/ # Unity project assets
│ ├── Scripts/ # All C# game scripts
│ │ ├── XR/ # FPS rig, door interaction, concept manager
│ │ ├── Models/ # Data model classes and UI card scripts
│ │ ├── UI/ # CSV loader, concept list/form UI
│ │ └── Managers/ # App-level and wall UI managers
│ ├── Scenes/ # Unity scenes (MainScene, MainSceneNew)
│ ├── Prefabs/ # Reusable prefabs
│ ├── Resources/ # Runtime-loaded assets (concepts CSV)
│ ├── XR/ # XR loader and OpenXR settings
│ └── [Third-party assets] # Brick Project Studio, ithappy, Hovl Studio, etc.
├── Backend/
│ └── memorypalace/ # Spring Boot REST API
│ ├── src/main/java/com/verstappen/memorypalace/
│ │ ├── controller/ # ConceptController, HelloController
│ │ ├── model/ # Concept entity
│ │ ├── service/ # ConceptService, CsvLoaderService
│ │ ├── dto/ # ConceptDTO, ReviewDTO
│ │ ├── repository/ # ConceptRepository (Spring Data JPA)
│ │ └── config/ # WebConfig (CORS)
│ └── src/main/resources/
│ ├── application.properties
│ ├── static/index.html # Web review dashboard
│ └── data/concepts.csv
├── Packages/
│ └── manifest.json # Unity package dependencies
└── ProjectSettings/
| Layer | Technology |
|---|---|
| Game Engine | Unity 6 (URP 17.3.0) |
| XR / Input | OpenXR 1.16.1, New Input System |
| Language (Unity) | C# (.NET) |
| Backend Framework | Spring Boot 3.5.11 |
| Language (Backend) | Java 21 |
| Database | PostgreSQL |
| ORM | Spring Data JPA / Hibernate |
| CSV Parsing | OpenCSV 5.9 |
| Build Tool | Maven |
| Web Browser in VR | Unity Web Browser (Voltstro, CEF) |
- Java 21+
- Maven 3.8+
- PostgreSQL (running locally on port
5432)
- Unity 6 (LTS) with Universal Render Pipeline
- No VR headset required for the desktop build
-
Create the database
CREATE DATABASE memory_palace;
-
Configure credentials
Edit
Backend/memorypalace/src/main/resources/application.properties:server.port=8080 spring.datasource.url=jdbc:postgresql://localhost:5432/memory_palace spring.datasource.username=postgres spring.datasource.password=your_password_here spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
-
Run the server
cd Backend/memorypalace ./mvnw spring-boot:runThe API will be available at
http://localhost:8080. -
Seed initial data
On first run,
CsvLoaderServiceautomatically imports 114 concepts fromsrc/main/resources/data/concepts.csvif the database is empty. Image URLs follow the pattern:https://raw.githubusercontent.com/Aadityaamlan-Panda/CSE-Topics/main/ChemE_Enhanced/Slide{N}.jpg
- Open the project root in Unity Hub and select the Unity 6 editor version.
- Let the Package Manager resolve all dependencies from
Packages/manifest.json. - Open the scene:
Assets/MainSceneNew.unity - In Project Settings → XR Plug-in Management, enable OpenXR (or leave it unchecked to run in pure desktop mode).
- Ensure the backend is running, then press Play.
Base URL: http://localhost:8080
| Method | Endpoint | Description |
|---|---|---|
GET |
/concepts |
List concepts (paginated, default 200/page) |
GET |
/concepts/all-sorted |
All concepts, ordered by ID ascending |
GET |
/concepts/{id} |
Get single concept by ID |
GET |
/concepts/search?keyword= |
Search concepts by keyword |
POST |
/concepts |
Create a new concept |
PUT |
/concepts/{id} |
Update a concept |
DELETE |
/concepts/{id} |
Delete a concept |
PATCH |
/concepts/{id}/review |
Submit a recall review score |
{ "score": 2 }| Score | Meaning | Strength change |
|---|---|---|
2 |
Easy | +2 |
1 |
Medium | +1 |
0 |
Tough | −2 |
| Field | Type | Description |
|---|---|---|
id |
Long | Auto-generated primary key |
title |
String | Concept name |
description |
String | Full description (up to 1000 chars) |
mediaUrl |
String | GitHub-hosted slide image URL |
memoryObject |
String | Key linking concept to scene object — must exactly match the Unity GameObject name |
location |
String | Room/area in the Memory Palace |
visualCue |
String | Short mnemonic hint |
strength |
int | Recall strength score (adjusted by review) |
repetitions |
int | Total number of review sessions |
lastReviewed |
DateTime | Timestamp of the most recent review |
createdAt |
DateTime | Auto-set on create |
updatedAt |
DateTime | Auto-updated on save |
Example CSV row:
815,Manometry,"Explains pressure measurement using manometers...",https://...Slide3.jpg,BathTub,,,1,,
Each concept is anchored to a scene object chosen for a meaningful mnemonic relationship — objects whose function or appearance bears a logical connection to the concept:
| Scene Object | Concept | Mnemonic Rationale |
|---|---|---|
BlenderContainer |
Extent of Reaction | Blender and reactor both transform raw inputs into products |
CoffeeMaker_Apt_01 |
Reactive Material Balances | Coffee extraction consumes reactants and produces a product stream |
Fridge_01 |
Vapour-Compression Refrigeration Cycle | Fridge is the refrigeration cycle |
Stove_Top |
Combustion Reactions | Direct functional match |
Toilet_Apt_01 |
Water-Air VLE & Psychrometric Chart | Water vapour flow analogy |
BathTub |
Manometry | Fluid-level / pressure analogy |
Trash_apt_01 |
Recycle Mass Balances | Recycle loop analogy |
Range_Hood |
Ideal Gas Law | Gas extraction / flow |
Mech_apt_01 |
Mechanical Energy Balance | Mechanical → mechanical energy |
The project ships an FPS desktop rig (XRSimpleRig.cs) as a drop-in replacement for the Meta XR controller rig.
| Input | Action |
|---|---|
WASD |
Move |
Mouse |
Look around (cursor auto-locked; Esc to release, RMB to re-lock) |
Q / E |
Fly up / down |
F |
Interact with door, sliding panel, or teleport trigger |
G |
Show concept text labels and image panel for the object in the crosshair |
Crosshair feedback:
- Left half green → a door/slide/teleport is in view
- Right half green → a concept-linked object is in view (press
Gto reveal) - Both halves dim → nothing interactive in range
Served at http://localhost:8080/index.html (or the deployed backend URL).
The dashboard presents all 114+ concepts as priority-sorted review cards. The priority algorithm is:
priority(item) = item.strength − item.repetitions × 0.5
A concept with low or negative strength and few repetitions rises to the top. A well-learned concept sinks to the bottom.
Features:
- Traffic-light recall buttons: 🟢 Easy / 🟡 Medium / 🔴 Hard — each click calls
PATCH /concepts/{id}/review - Concept images loaded from GitHub at runtime
- Shared database with the Unity client — review state updated here is reflected the next time Unity fetches concepts
| Script | Location | Purpose |
|---|---|---|
XRSimpleRig.cs |
Scripts/XR/ |
FPS movement, mouse look, raycasting, crosshair feedback, key bindings |
XRConceptManager.cs |
Scripts/XR/ |
Spawns / destroys concept text labels and image panels in world space |
XRConceptInteractable.cs |
Scripts/XR/ |
Per-object interaction bridge; fires OnSelected() to notify the manager |
XRDoorInteract.cs |
Scripts/XR/ |
Smooth door open/close with side-detection and collider management |
ConceptItem.cs |
Scripts/Models/ |
Populates text label prefabs; applies traffic-light strength colour indicator |
ConceptImagePanel.cs |
Scripts/Models/ |
Downloads mediaUrl image via UnityWebRequestTexture; falls back to red texture on failure |
CSVLoader.cs |
Scripts/UI/ |
Offline fallback: loads concepts directly from a local CSV in Resources/ |
ConceptScrollerController.cs |
Scripts/Models/ |
Scrollable concept list UI in-world |
BrowserLoader.cs |
Scripts/ |
Loads concept mediaUrl in the embedded CEF browser panel |
AppManager.cs |
Scripts/Managers/ |
App-level initialisation and scene management |
| Package | Version | Purpose |
|---|---|---|
com.unity.render-pipelines.universal |
17.3.0 | Universal Render Pipeline (URP) |
com.unity.xr.openxr |
1.16.1 | OpenXR support |
com.unity.xr.management |
4.5.4 | XR plugin management |
com.meta.xr.sdk.all |
(local) | Meta/Oculus XR SDK |
com.google.xr.cardboard |
git | Google Cardboard XR plugin |
com.unity.inputsystem |
1.18.0 | New Input System |
com.unity.cinemachine |
3.1.6 | Camera management |
com.unity.ai.navigation |
2.0.9 | NavMesh / AI navigation |
dev.voltstro.unitywebbrowser |
2.2.8 | Embedded Chromium browser (CEF) |
com.unity.postprocessing |
3.5.1 | Post-processing effects |
com.unity.shadergraph |
17.3.0 | Shader Graph |
-
application.propertiescontains a hardcoded password — move to environment variables before deploying - CORS is configured globally via
WebConfig.java— tighten allowed origins for production - Desktop FPS mode and XR mode share the same scene; a build-time flag or separate scene would be cleaner
-
ConceptFormUI.csis currently empty — concept creation from inside the app is not yet implemented -
XRConceptInteractable.csis no longer in the critical interaction path (G key calls manager directly); remove or re-wire if the Meta XR build is revisited - The embedded browser (
BrowserLoader.cs) requires the CEF engine; Linux x64 binary is included but Windows/Mac builds may need additional setup
- Larger participant pool — current n=5 (complete data) is insufficient for statistical inference; a study with 20+ participants per condition is needed.
- True no-VR control condition — participants who review the same concept slides without spatial encoding, to isolate the Method-of-Loci effect from repeated concept-image exposure.
- Longitudinal spaced-repetition testing — the
strength/repetitionsinfrastructure is already in place; follow-up quizzes at 1-day, 1-week, and 1-month intervals would test durability of spatial encoding. - Progressive hint fading — automatically reduce hint availability across rounds to force deeper spatial encoding.
- Mini-map and waypoint markers — address the lowest-rated feedback item (topic locatability, 7.2/10) with a HUD showing unvisited concept locations.
- Controlled anchor quality variation — compare semantically coherent anchors (blender → reaction) against arbitrary placements to quantify how much effect is due to mnemonic quality vs. spatial encoding alone.
- Uniform question set — eliminate the Set 1 / Set 2 confound by administering the same question type to all participants.
| Name | Roll No. | Department |
|---|---|---|
| Aaditya Amlan Panda | 220007 | Chemical Engineering, IIT Kanpur |
| Abhijit Dalai | 220030 | Chemical Engineering, IIT Kanpur |
Additional contributions: Shorya Agarwal (resource contributions).
The following students from IIT Kanpur volunteered to participate in the pilot study. All provided informed consent prior to the session.
| Name | Department | Question Set | Role |
|---|---|---|---|
| Akarsh V. | Economics | Set 2 | Gameplay participant |
| Arjit Verma | Civil Engineering | Set 1 | Gameplay participant |
| Dhruv Bansal | Aerospace Engineering | Set 2 | Gameplay participant |
| Jagdeesh | Mechanical Engineering | Set 2 | Gameplay participant |
| Snehil Tripathi | Chemical Engineering | Set 1 | Gameplay participant |
| Amit Kumar | Materials Science & Engineering | Set 2 | Retention benchmark participant |
The benchmark participant (Amit Kumar) completed two full gameplay rounds but answered the quiz 2.5 hours after the session ended due to a system failure. His data serves as a delayed-recall reference rather than a standard gameplay round.