Experiential Design - Task 3 : Project MVP Prototype
21/04/2025 - ( Week 7 - Week 11 )
Ho Winnie / 0364866
Experiential Design / Bachelor's of Design Honors In Creative Media
Task 3 : Project MVP Prototype
1. Task 3 : Project MVP Prototype
1️⃣ Feeding the Pet ( Done by Guo Ying )
One of the core interactions is feeding. Users can tap to spawn the cat bowl and watch as their companion happily eats. This small gesture helps users feel a daily sense of care and connection. As the pet eats, its health or mood bar visibly increases, reinforcing the impact of the user’s actions.
2️⃣ Sleep Mode – Play Soft Music ( Done by Me )
Sometimes, companionship simply means peaceful presence. In Sleep Mode, users can switch their pet to ambient mode, where it lies down and gently sleeps beside them in AR. While the pet rests, soft background music plays to create a soothing atmosphere—perfect for unwinding, studying, or calming anxiety. User can toggle a button to on and off music.
3️⃣ Crafting Potion by Finding 3 Ingredients ( Done by Me )
To add a touch of fantasy, MystiAR includes a magical potion crafting feature. Users collect and drag three mystical ingredients into an AR cauldron placed in their environment. As the potion brews, animated effects and sparkles make the process feel alive and magical. The finished potion can then be given to the pet to boost its health, mood, or special traits, deepening the sense of interactive care.
4️⃣ Playing Fetch with the Pet ( Done by Guo Ying )
No pet is complete without playful moments. Users can tap a ball icon to spawn a 3D ball, then swipe or drag to throw it in the AR scene. The pet reacts by chasing and fetching the ball, wagging its tail or jumping with joy. This playful interaction strengthens the bond between user and pet while gently lifting the pet’s mood bar, making the relationship feel responsive and real.
What has not been done ?
Currently, the health and mood bars displayed above the pet are static because we haven’t fully implemented the logic to update them yet. The next step is to write scripts that dynamically increase the health bar when the pet eats a potion and boost the mood bar when the pet plays fetch.
Progression For My Parts :
D. Scene Manager From Login To Main Page
SceneManager.LoadScene()
so I can set the scene name in the Inspector and trigger it through UI buttons.Fig 1.1 Scene Manager Script |
To make the transition feel polished and magical, I also used Unity’s Animator panel. I set up animations to make the cat character fade in gently on the homepage, together with the main button that invites users to step into the pet’s world. By combining these scripted transitions with fade-in animations, the app feels more immersive and welcoming right from the first interaction.
To start off, I designed a custom 3D cauldron in Nomad Sculpt and exported it for use in Unity. Once the cauldron model was ready, I imported it into my Unity project and placed it in the AR scene canvas where the potion crafting interaction happens.
In Unity, the cauldron uses a Mesh Renderer component. This is important because the Mesh Renderer is what actually draws the 3D model in the scene—it takes the raw mesh data (the 3D shape) and renders it with the assigned material, lighting, and shading. By adjusting the Mesh Renderer settings, I can control how the cauldron looks in AR, including shadows, reflections, and transparency
CauldronManager
class that acts as the main controller for the entire cauldron interaction. This script keeps references to key objects like the cauldron model, the final potion GameObject, and an array to store the ingredients the user drags in. When an ingredient is dragged into the cauldron, the OnDraggedIngredient()
method checks if the total is enough to start brewing: if (draggedIngredient != null) { ingredientsCount++; if (ingredientsCount >= 3) { StartCoroutine(MakePotion()); } }
. This ensures that only when the player places three valid ingredients will the potion brewing sequence begin.Fig 1.5 Cauldron Manager Script 1/3 |
The brewing itself is managed by the
MakePotion()
coroutine, which simulates the process by adding a short delay and then making the final potion visible in the AR scene. For example, IEnumerator MakePotion() { yield return new WaitForSeconds(2f); if (potionFinal != null) { potionFinal.SetActive(true); } }
waits for two seconds, which can be synced with a bubbling or glowing animation on the cauldron. Once the wait is over, the potion appears, giving users immediate visual feedback that they successfully combined the ingredients to craft something new.Fig 1.6 Cauldron Manager Script 2/3 |
HidePotion()
method to clear it from the scene: public void HidePotion() { if (potionFinal != null) { potionFinal.SetActive(false); } }
. This keeps the AR space clean and reusable for the next round of crafting. Together, these small logic blocks tie the user’s drag-and-drop action to an interactive, repeatable system that makes the potion crafting feature feel magical but manageable inside Unity.Fig 1.8 Placing Ingredients In Canvas |
To make the potion crafting feel hands-on and immersive, I wrote a
DraggableIngredient
script that turns each ingredient into an interactive object players can grab in AR. The class starts by caching the main camera so it can translate screen touches into world space. It also tracks whether the ingredient is being dragged and whether it has already disappeared to avoid duplicate interactions. For example, the script declares private Camera mainCam; private bool isDragging = false; private bool hasDisappeared = false;
and then sets mainCam = Camera.main;
in Start()
so the raycasting logic works properly during drag actions.Update()
. When the user taps or clicks the ingredient, a ray is cast from the camera to detect if the object is hit: Ray ray = mainCam.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) { if (hit.collider.gameObject == this.gameObject) { offset = transform.position - hit.point; isDragging = true; } }
. While isDragging
is true, the script continuously updates the ingredient’s world position by projecting the touch or mouse point back into the scene and adding the offset. This works for both editor and mobile by handling Input.GetMouseButtonDown
and Input.GetTouch
with a switch on TouchPhase
.Fig 2.0 Draggable Ingredients Script 2/3 |
DisappearAndNotify()
method checks if it hasn’t already been hidden, then disables the object and calls the manager: void DisappearAndNotify() { if (!hasDisappeared) { hasDisappeared = true; gameObject.SetActive(false); CauldronManager.Instance?.OnIngredientUsed(); } }
. This keeps everything modular—once dragged in, the ingredient visually vanishes, and the cauldron’s ingredient counter goes up, smoothly linking the drag interaction to the brewing sequence.Fig 2.1 Draggable Ingredients Script 3/3 |
To make the brewing process more rewarding and magical, I added a particle system that activates when the potion is fully brewed. After all three ingredients are dragged into the cauldron, the script triggers a custom Particle System to emit sparkles and glowing effects above the cauldron. This visual feedback makes the brewing feel alive and helps the player know instantly that the potion is ready.
I set up the particle system directly in Unity by adjusting parameters like emission rate, lifetime, color gradients, and shape to match the mystical theme. The system stays inactive by default and is enabled by a line of code in the CauldronManager: for example, brewingEffect.Play();
runs once the ingredient counter reaches three. Combining this with sound effects creates a satisfying payoff and makes the AR experience more immersive and fun to watch.
Fig 2.2 Particle Effect Animation Once Brewing Is Done |
In Unity, I made sure to assign a Box Collider and attach the DraggablePotion
script. This makes the potion interactive — the script handles user input for dragging and dropping. By placing it directly in the scene hierarchy, it’s easy to manage its transform, rotation, and scale to align nicely with the AR plane.
Fig 2.3 Collider Placed For Potion Prefab |
To make giving the potion to the pet feel satisfying and interactive, I wrote a DraggablePotion script that makes the final potion draggable in AR. The script starts by setting up references to the camera and tracking whether the potion is being dragged or has already been used, so it can’t be fed multiple times. For example, the script declares private Camera mainCam;
, private bool isDragging = false;
and private bool used = false;
at the top, then assigns mainCam = Camera.main;
inside Start()
to prep the raycasting for both mouse and touch input.
The main dragging logic happens in Update()
. If the potion hasn’t been used yet, it listens for a click or touch, fires a ray into the scene, and checks if the player grabbed the potion: Ray ray = mainCam.ScreenPointToRay(Input.mousePosition);
then if (Physics.Raycast(ray, out RaycastHit hit)) { if (hit.collider.gameObject == this.gameObject) { offset = transform.position - hit.point; isDragging = true; } }
. While dragging, the script constantly updates the potion’s position using Vector3 worldPos = GetWorldPoint(Input.mousePosition); transform.position = worldPos + offset;
. This makes the drag smooth and lines up the model with the user’s finger or mouse in real time.
Fig 2.4 Draggable Potion Script 1/2 |
When the drag ends—either on mouse up or after the player lifts their finger—the script calls DisappearAndNotify()
to handle the hand-off. Inside DisappearAndNotify()
, the potion hides itself and triggers feeding by calling the cat controller.This guarantees the potion can only be fed once. After GivePotionToCat()
runs, the OnPotionDrank()
callback can handle any bonus animations or effects. This whole flow makes dragging, dropping, and feeding the pet feel rewarding and ties the final crafted potion back into the pet’s wellbeing loop, completing the brewing cycle.
Fig 2.5 Draggable Potion Script 2/2 |
F. Ambient Mode Feature - Pet Sleeps and Can Toggle Music Button
Next, I moved on to building the Sleeping Ambient Mode MVP. The goal here was to let users press a simple Ambient Mode button that makes the AR pet lie down and sleep peacefully while calming background music plays. First, I set up the UI buttons in the canvas. In my Unity canvas, I arranged a dedicated button with a moon icon to represent Sleep Mode, plus a small music status text that says “Playing Soft Music” to indicate when the ambient audio is active.
To connect this visually and functionally, I created a simple toggle script so that when the Sleep button is pressed, it switches the pet’s animator to its sleep state and plays a looping ambient audio clip. The UI text changes dynamically to “Playing Soft Music” when active and can be switched off with another tap. This way, users have full control to let the pet rest beside them while enjoying a soothing vibe — an important feature for MystiAR’s goal of creating a calming, emotionally supportive presence anytime the user wants to unwind.
Fig 2.6 Placing the buttons |
To handle the actual animations, I connected an Animator component with my custom InstructionsPanel
Animator Controller. This allows the panel to smoothly play transitions like “Step 1”, “Step 2”, or exit animations as the user moves through the onboarding. I also wrote an Instruction UI Manager script, which you can see attached here. This script references the InstructionsPanel
Animator as well as Step1Animator
and Step2Group
for multi-step sequences. I linked the Cat
AR object so I can show or hide it based on the instructions, and I added my next button (NextBtn2
) so users can tap through each stage.
Finally, I included Plane Finder Logic references for the AR placement — for example, Ground Plane Stage
— so the instructions can also toggle the AR plane and manage where the pet appears in the scene. Altogether, this Inspector setup keeps my onboarding clear, animated, and connected to the AR interactions, so the moment a user hits “ambient mode” or starts the experience, everything feels guided and intuitive.
Fig 2.7 Instruction UI Manager |
To complete the Sleep Mode MVP, I needed to make sure that when users switch their pet to ambient mode, they also hear soft music that enhances the calming vibe. For this, I added an Audio Source component in Unity and linked it to a relaxing piano cover of Dandelions. In the Inspector, I made sure the clip is set to Loop, so it plays continuously while the pet is sleeping, but I disabled Play On Awake — this way, the audio only starts when the user toggles it.
To give the player direct control, I also wrote a small MusicToggleButton script. This script references the Audio Source and the Play Music Btn (a simple Unity Button
). When the player taps the button, the script checks if the audio is playing and either starts or stops it accordingly. For example, the MusicToggleButton
holds a public AudioSource musicSource;
and a public Button playMusicBtn;
, and the toggle function simply does if (musicSource.isPlaying) { musicSource.Stop(); } else { musicSource.Play(); }
.
Fig 2.8 Music Toggle Script & Audio Source |
Google Drive Submission : https://drive.google.com/drive/folders/1xlEuyDF4LUV_oF5FDu7LrbL311e7fsg3?usp=sharing
-
0:00 – 0:08: Login scene animation and transition to homepage – Winnie
-
0:08 – 0:15: AR pet plane detection and ground placement – Guo Ying
-
0:18 – 0:33: AR pet feeding interaction – Guo Ying
-
0:37 – 0:48: AR pet playing fetch with the ball – Guo Ying
-
0:50 – 1:09: Ambient sleep mode with music toggle – Winnie
-
1:20 – 1:44: Potion brewing system with draggable ingredients – Winnie
Presentation Slides :
2. Feedback
3.Reflection
Comments
Post a Comment