VR
Client work
Physiotherapy
Throughout the project I worked in a team of 6 people as a part of the assignment where we worked with an actual client. I was responsive for implemmenting the VR mechanics and AI featuresd to the game.
My focus was largely on enhancing the mechanical experience, developing technical side, integrating audio and dialogue systems to create a more polished and interactive product of an already existing app.
Prototype showcase
🎮 The Showcase Scene was designed to demonstrate the integration of multiple core elements within a single, interactive environment. It serves as a tech preview of the game's functionality, combining character control, AI voice features, and immersive feedback mechanisms. The player controls a humanoid character, equipped with movement capabilities while surrounded by interactive elements.
AI Voices + Implementation
The primary goal behind implementing AI voices was to introduce a greater level of immersion into the virtual environments I created. I wanted to add a sense of interaction—moving beyond the idea that these coaches feel like artificial intelligence or robots. The goal was to enhance the overall user experience by ensuring our virtual coaches felt more humanized, not mechanical.
For this purpose, I used a different web UI this time, relying on a faster fork of a standard text-to-speech model, which outputs longer texts more efficiently.
For the game, we needed voice-overs that would simulate a coach speaking to the player and explaining how to perform the exercises. Instead of traditional hardcoded triggers, I decided to use an alternative I discovered while researching a previous project — a Unity-based dialogue extension that supports node-based interactions.
Since I already had experience with the tool, I introduced it to our other programmer so we could prepare for future teamwork — especially since we plan to collaborate again. I installed the extension and created an example conversation flow in the node editor. This allowed my teammate to immediately start integrating logic conditions without worrying about structure.
The extension supports both option nodes (where players can choose responses) and speech nodes for linear dialogue. Each node can hold: a speaker name, associated text, and linked audio files. You can also define booleans or integers (INTs) for branching conditions based on player actions.
Functions Demonstration
This video demonstrates very early version of interactions that were added to the game
Audio System
This script provides a centralized way to manage and play audio clips. It defines a Sound class to hold audio data (like volume, pitch, loop) and initializes each sound with an AudioSource. The AudioManager class makes sure only one instance exists (singleton pattern) and persists across scenes.
using UnityEngine.Audio;
using UnityEngine;
using System;
[System.Serializable]
public class Sound {
public string name;
public AudioClip clip;
[Range(0f, 1f)]
public float volume = 1;
[Range(0.1f, 3f)]
public float pitch = 1;
public bool loop = false;
[HideInInspector]
public AudioSource source;
}
public class AudioManager : MonoBehaviour {
public Sound[] sounds;
public static AudioManager instance;
void Awake() {
if (instance == null)
instance = this;
else {
Destroy(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
foreach (Sound s in sounds) {
if (!s.source)
s.source = gameObject.AddComponent();
s.source.clip = s.clip;
s.source.volume = s.volume;
s.source.pitch = s.pitch;
s.source.loop = s.loop;
}
}
public void Play(string name) {
Sound s = Array.Find(sounds, sound => sound.name == name);
if (s == null) {
Debug.LogWarning("Sound: " + name + " not found!");
return;
}
s.source.Play();
}
public void Stop(string name) {
Sound s = Array.Find(sounds, sound => sound.name == name);
if (s != null)
s.source.Stop();
}
}
Main Menu System and Environments
One of the final features implemented in our project was a functional main menu system. The goal was to allow users to choose the scene where they want to do their exercises.
Below are the primary environments designed for the project. Each space was crafted to provide distinct moods and immersion depending on the scene’s purpose.
Park Environment: A calm, naturalistic park with cherry blossom trees and a lakeside gazebo, designed to create a peaceful and meditative atmosphere.
Indoor Environment: A cozy apartment interior that gives the user a sense of home and familiarity, suitable for casual interaction or coaching scenes.