References
Learning & Tutorials
Udemy Unity Course - GameDev TV
During summer, I decided to spend some time familiarising myself with Unity, through the 'Complete C# Unity Game Developer 3D' Udemy course by Ben and Rick at GameDev.tv. Their course provided me with a firm understanding of basic Unity principles and best practices and allowed me to build a 'Game Development in Unity' knowledge base from which I could work from going forward.
During summer, I had access to a VR headset which was provided to me by my lecturer, John Loane. As such, I decided to spend some time learning how to develop VR environments within Unity. I discovered a recently developed YouTube series by a video creator known as 'Valem'. Valem's videos thought me how to set up various VR-related features - such as XR Input (which would allow our game to be launched on multiple VR platforms), interaction with objects, movement in VR using a joystick, and creating interactable VR menu's. Each of the skills that I learned through his channel were instrumental in the early stages of our projects' development.
VR Arm Motion Tutorial - Mr Pineapple Studio
I ran into some trouble when trying to develop a 'rowing motion' system within VR. My intention was to create a system that would track the movement of the players VR controllers. This movement would then need to be converted into a velocity that could be applied to the boat. Mr. Pineapple Studios VR Arm Motion Tutorial demonstrated how it could be implemented using a swinging movement. This provided me with some base code that I could adapt to suit our needs.
Unity Multiplayer FPS Tutorial - Rugbug Redfern
Rugbug Redfern's Multiplayer FPS in Unity Tutorial series helped me to envision how multiplayer may be incorporated into our game. I was originally using Valem's implementation of VR multiplayer, but I soon realised that Valem's design did not work particularly well with our game. Doing some research, I came across Rugbug's tutorial - this better suited our game, as it built around the idea of 'spawning' fully-contained player prefabs into the game world. Luckily for me, this is exactly what I was looking for.
Audio Manager Tutorial - Brackeys
Brackey's Introduction to AUDIO in Unity tutorial helped me to develop up a simple AudioManager class that can easily be used to control audio within Unity. This was useful for stopping and starting the menu music and level loops, and also allowed me to trigger one-shots to play sounds like the oars splashing into the water.
Asset Packs
The Photon PUN asset pack provides multiplayer functionality to our game. Its addition to our project allows players to create or join game rooms in which they can race, chat, or row with each other. This asset pack was free, and can be found on the Unity Asset Store.
Bluetooth LE for iOS, tvOS and Android - Shatalmic LLC
The Bluetooth LE asset pack by Shatalmic LLC provides our game with an interaction layer with essential Android Bluetooth services. It allows us to scan for and connect with Concept2 Performance Monitors, while providing us with functionality for sending commands to retrieve real-time data about the user's current workout. Additionally, Tony Pitman from Shatalmic's support team was very helpful when I quizzed him about various things relating to Bluetooth that I did not fully understand. This asset pack cost me €17, and can be found on the Unity Asset Store.
BoatAttack Assets - Unity Technologies
The BoatAttack demo by Unity Technologies provided us with essential assets for developing our game environment. The water shader, terrain textures, and in-game environment assets (such as rocks, cliffs, and trees) all originated from here. This is an open-source repo on GitHub.
Performance Monitor Integration
Performance Monitor Bluetooth Smart Communications Interface Specification Document - Concept2
The Bluetooth Smart Communications Interface Definitions document by Concept2 was essential to my understanding of Bluetooth communication with Concept2 Performance Monitors This document details in-depth their communication specification and outlines the various services and characteristics available through the device. Through my study of this document, I learned how to connect with Performance Monitors using their base UUID's, and how to request real-time rowing data using various services that are transmitted by the device. I found this document while searching for information on how to communicate with the PM online.
CSAFE Communications Interface Protocol Specification Document - Concept2
After spending some time studying Concept2's Bluetooth Communications document, I decided to contact Concept2 support for more details on how the underlying protocol worked. Scott Hamilton (a member of their support team) provided me with a copy of their detailed CSAFE Communications documentation. CSAFE is the underlying comms protocol that the PM's firmware is built upon, so access to this document provided me with essential information on how data frames are sent from and received by the Performance Monitor. This knowledge would prove invaluable as I started to decipher code written by other developers (namely, the PyRow code mentioned below).
ErgometerJS - Tijmen Van Gulik
Tijmen Van Gulik's ErgometerJS repo on GitHub is an open-source library that contains various multi-platform demos which allow users to connect to their Concept2 performance monitor via Bluetooth. I did not adapt this code, but I often found myself referring to it when I wanted to find out more about how other developers approached communication with the Performance Monitor via Bluetooth (the PyRow code is great, but it communicates with the Performance Monitor via USB, which uses different communication interfaces than Bluetooth). Honestly, the sheer scale of this code scared me quite a lot, but it helped answer many of the questions that I gathered along the way.
I found the PyRow repo while researching ways to communicate with the Performance Monitor. It seemed like an ideal starting point for our game. The PyRow repo is a Python library designed to communicate with Performance Monitors via a Raspberry Pi. Additionally, it communicates via USB, rather than Bluetooth. However, the underlying functionality for reading and writing data to/from the performance monitor proved vital for our project. I contacted James Dowell, Co-founder of WeMakeWaves (the company who developed the PyRow library) and asked him for permission to adapt their code. He was more than happy to allow us, and was excited to hear how our project turned out!
I hit a brick wall while developing a solution for communicating with the Performance Monitor via Bluetooth. During that time, I had been using Android monitor to debug events and logs that were recorded by my phone while testing our game. I had an idea one night to download and scan the logs of a separate app (ErgData) that provides similar functionality (connects to the PM, and records real-time rowing data). Doing this allowed me to gain insight into how ErgData approached communication with the PM via the output logs that their app recorded. The most important element of this was that ErgData worked through Bluetooth and was using native Android - two elements that were separately lacking in the PyRow Library (uses USB comms) and the ErgometerJS library (uses WebApp technology, rather than native Android). This was a small, but important step for our project and the added information proved invaluable!
Media
Team Lead Background Image
Sourced from: https://quodeckspeak.com/2019/02/18/why-is-measuring-training-effectiveness-important-to-team-leaders/
Integration Lead Background Image
Sourced from: https://cyfuture.com/blog/top-custom-software-application-development-trends-to-watch-out-for-in-2020/
VR integration Background Image
Sourced from: https://www.clickz.com/why-ar-is-a-better-investment-for-brands-than-vr/111750/vr-vector-graphic/
Multiplayer Integration Background Image
Sourced from: https://www.esrb.org/blog/what-parents-need-to-know-about-communicate-online/
Hardware Integration Background Image
Sourced from: https://brightlineit.com/replace-computer-hardware-and-networking-systems/170309-update-hardware/
Version Control Lead Background Image
Sourced from: https://www.scnsoft.com/blog/software-development-strategy
Team Project Background Image
Sourced from: https://www.scnsoft.com/blog/software-development-team
Academic Documentation Background Image
Sourced from: https://braydenbrennan.wordpress.com/2020/07/27/software-development-companies-and-the-qualities-of-a-good-software-developer/
Technical Journal Background Image
Sourced from: https://education.jhu.edu/2020/05/the-future-of-online-learning/
References Background Image
Sourced from: https://www.nevillmedia.com/blog/do-you-want-to-learn-multiple-online-skills
Water Loop Background Audio
Sourced from: https://www.epidemicsound.com/track/O7g5RHQYjS/
Water Plop Audio
Sourced from: https://freesound.org/people/jamesabels/sounds/166966/
Rowing Audio
Sourced from: https://www.soundsnap.com/transport_boat_oar_paddle_strokes_16103_wav
Bird 1 Audio
Sourced from: https://freesound.org/people/DCPoke/sounds/387978/
Bird 2 Audio
Sourced from: https://freesound.org/people/InspectorJ/sounds/416529/
Bird 3 Audio
Sourced from: https://freesound.org/people/CarlosCAV/sounds/500999/
Bird 4 Audio
Sourced from: https://freesound.org/people/Anthousai/sounds/398736/
Water Audio
Sourced from: https://freesound.org/people/VlatkoBlazek/sounds/261212/
Wind Audio
Sourced from: https://freesound.org/people/Leandros.Ntounis/sounds/163607/
The Island Background Music
Sourced from: https://www.purple-planet.com/gentle
Tranquillity Background Music
Sourced from: https://www.purple-planet.com/gentle
Waterslide Harmonic Background Music
Sourced from: https://www.purple-planet.com/gentle
Special Thanks
Domenico De Vivo, Scott Hamilton - Concept2
Scott Hamilton from Concept2 support was more than helpful when I contacted them looking for more information on how communication with Performance Monitors worked. Scott referred me to his friend Dom, suggesting that Dom may be able to provide me with the loan of a second-hand Performance Monitor to test our progress on. Dom was extremely helpful and was excited to hear about our project. Additionally, Dom was happy to send us out a Performance Monitor. This was a huge step forward for our project, as it meant that we could now test our game alongside the desired hardware.
James Dowell - WeMakeWaves
James Dowell from WeMakeWaves provided us with permission to adapt their PyRow library for us in our project. This saved us much time and effort trying to determine an algorithm for writing and reading to and from the Performance Monitor.
Tony Pitman - Shatalmic
Tony from Shatalmic helped me to gain a firmer understanding of the Bluetooth communication protocol. He explained how the 'read', 'write', and 'subscribe' characteristic functions worked and explained the underlying processes that happen between each call.
Alan Watters - DkIT Sport
Alan from DkIT Sport provided me with access to their Concept2 Rowing Machine's. This meant that we could do real-time testing of our game to see if it could be controlled entirely through the rowing machine - an essential part of our project's development!
Jonny Carroll - Zoo Fitness
Jonny provided me with access to his gym (Zoo Fitness in Ardee) on a weekly basis (every Thursday for 1.5 hours). Zoo Fitness has two Concept2 RowErg's, and one Concept2 SkiErg. This meant that I could test our app more thoroughly and on a regular basis. Additionally, Jonny allowed Kristine and I to test our app at Zoo Fitness together. We were able to then use this time to record videos for our demonstration.
Robbie Caraher - Louth Physiotherapy
Robbie provided me with access to his physiotherapy clinic (Louth Physio in Dundalk) on a weekly basis (every Saturday for 4+ hours). This meant that I could test our app more throughout and on a regular basis. This amount of access to a Concept2 rowing machine was absolutely instrumental in our project's success. Without Robbie's help, we wouldn't have been able to develop many features of our application.
Kristine Saroka - Teammate
Kristine provided me with some simple (but quite useful!) CSS rules to use in my portfolio. The animated text boxes that provide links to various sections within my portfolio were inspired by similar work done by Kristine on our group project page. I asked her if I could use her CSS as a baseline, and she was more than happy to share.
Christian Rafferty - Classmate
Christian and I planned to be teammates before the semester started. During this time, we were discussing various directions that we could bring our project - Christian was excited about my VR Rowing Game idea, and so decided to buy additional gear (namely an Arduino board and heartrate sensor) to provide biometric-recording options for our game. However, various circumstances led to my departure from that team. Regardless, Christian knew that I was still working on the VR Rowing Game idea, and decided to donate the equipment he bought to me. It was a great gesture and meant a lot to me and the team.