When I started my Udacity VR Nano degree I knew I was in for a challenge. Now that I’ve successfully completed my final assignment I thought I’d share some lessons learnt. So in no particular order:
Use version control. Thankfully I started doing this very early on. I had heard of the benefits and for whatever reason actually took them seriously. I started a religious habit of regularly pushing changes to GIT. I only used GIT to roll back to previous versions of projects hand handful of times, but had I not had the option I would have had a much bigger problem on my hands.
Don’t underestimate the time required. Taking on any study that requires large blocks of time can’t be taken lightly. It’s not going to be enough to only do a 30 min stretch at lunch, or an hour once the kids are in bed. You’re going to need a clear half day at least once a week to make real progress. Also, make sure you know what’s going to consume your time on projects in any given block. No sense clearing 4 hours for study only to have 3 hours of that time consumed rendering a 4k 360 video.
Don’t forget to look after yourself. With pressure on your time, it’s easy to cut out things like exercise or time with your family. Don’t do that. Cut out things that are actually a waste of time instead. TV is a big one but also think of ways of compressing your time. Like listening to audio books while you go for a run rather than reading a book alone.
Take breaks. If your mind is cluttered you’re not going to learn as well as you might. I found when I spent more than an hour trying to solve an issue the thing to do was take a 20-minute walk, clear my head, then take another crack at it. It’s amazing how often your mind will solve problems for you when you let it.
Take notes. Even if you never refer to them, take them anyway. Do this with a pen and paper (or a tablet and a pencil). It’s all about making the information get in your head. I almost never refer to my notes, I don’t take them to remember later. I take them to remember them now.
Try and integrate your life into your study. I did this by using my kids as the target audience for my projects and used them as user testing subjects while developing. It let me spend quality time with them and get some study done. It was also an education for them too so a real win-win.
Scope out what you’ll need before you begin. I started my course with a late 2009 Mac Mini. While old, it was fine for much of the course. The later parts that required 4k 360 video editing, not so much. This sort of thing can add considerable costs to your study budget so make sure you have a line of sight on this and save accordingly.
Get involved in the community. A huge part of successful study for me was the community of learners and educators around the subject. Help others and ask for help when you need it. Don’t waste time beating yourself to death if you get stuck. Solving your problem on a public forum helps everyone else with the same issue in future. So don’t be selfish, ask for help.
Be grateful. To your partner for looking after the kids. To your friends for listening to your ramblings about project issues. To your classmates and mentors for helping you along the way. Be grateful.
Stick it out. Software development is hard. It’s not supposed to be easy. It is literally constant problem-solving. There will be times you’ll think “maybe I’m just not good at this”. Just keep going.
I’ve been AFK for a while (holiday) so I just wanted to post the details of the final version of “night at the museum” I finished a few weeks ago that I delivered as part of my Udacity VR course.
The project went well (in that I passed) but I have to admit it was an exercise in restraint as much as anything. Like a lot of people, I tend to have big plans for everything I make but those plans are not always practical. This project was no exception. While I am ultimately happy with what I created, I do consider it very much a minimum viable project. When it comes to working on assignments like this there are a number of things to consider. First and foremost for me is available time.
I’m totally loving learning VR development, at this point, I spend almost all my free time doing it. But working full time and having a young family is a busy time in life, so if I want to progress projects I have to be efficient with my time or things can stagnate. Also, I currently pay for my studies via a monthly subscription so every extra month a project slips into comes at a significant extra cost.
Just to give you a few examples of compromises made on this project:
Playing content at each of the stations was fairly limited and doesn’t have much finesse. For example, the final build allows the user to play audio from all 5 stations at the same time, this leads to a fairly horrible experience if a user does this
I reused a museum model from a previous project because it was faster than building my own. This means it’s not really an ideal setup. Space feels a little constrained and doesn’t provide much room to move about. Most real museums are quite spacious so it didn’t really fit the aesthetic I was aiming for
I wasn’t that happy with the spatial audio implementation. The environment had a bit too much reverberated for my liking and given more time I would have improved this a bit
There’s no environmental audio, just the content of the stations. I’d preferred to add some atmosphere to the scene just to add the feel of the place
There are loads of other things that could be better about the final deliverable, but ultimately what was made “did the job”. Creating anything is always a series of compromises and I think delivering something you can live with and (resourcing permitting) can be built upon, is more important than getting things perfect. Perfection, after all, is the enemy of the shipped.
It’s hard to not have “all the feels” watching the above video (Ideally in VR if you’ve got a cardboard headset). The creators have done such an amazing job of crafting a great story with some seriously well thought out VR technique.
For example transitions/cuts within a 360 video like this can be very jarring, and require the user to reorientate themselves with each cut. In this video, they’ve used the fixed position of the car interior to ground the viewer. It’s extremely effective at controlling the flow of the experience.
The audio is also exceptional. Not only does the song do a great job of creating an emotional connection to the characters, but the changes in audio based on when the characters are inside or outside the car are just wonderful. Spatial audio at its finest.
The more I create C# scripts in Unity the more I learn about optimising those scripts. With code there are 100s of ways to solve a problem, not all of them efficient, so learning to check your codes performance seems like a must.
Things to look for
So far I’ve come across a few simple things to look out for on the projects I’ve been coding. I’ll post more as I come across them in future.
Anything that’s called every frame creates consistent load on the CPU, GPU or both. If what’s called is inefficient or large it will have a negative effect on frame rate. In VR this is particular bad given low frame rates can make your user physically sick. Be sure to look at what’s in the Update and FixedUpdate methods and do your best to optimise the code as much as possible.
Working on mobile we will almost always be maxing out the graphics capability of the device. This effects the performance of the Update method. On the other hand FixedUpdated runs in sync with Unity’s physics engine. This will make sure your physics will be the most accurate and consistent. FixedUpdate is called every “physics step”, so is regularly used for adjusting physics (rigid body) objects. Make sure you always put your physics code in FixedUpdate.
Avoid using GameObject.Find. It basically requires the system to cycle through all of the GameObjects in the game to find the right one, which obviously is expensive for the CPU. If you know what object we are using ahead of time, define the object at the top of the script and reference it that way. GameObject.Find is useful for testing out ideas, but that’s about it.
As with most things in Unity, there’s a fairly reasoned logic to how this is done. You need three main things:
An audio source. You can think of this as the media player, it is literally the source of the audio within your environment
An audio clip. This is the actual audio file that will be played by your audio source. So think of this as the song that will be played by your media player
An audio listener. This is effectively your virtual ears within the virtual world. Normally this is attached to your main camera.
To give you an example of how I this works in practice. I first attached a GvrAudioListener to my main camera. This will allow my player to hear the sounds produced. Next, add a GvrAudioSource to a GameObject you want to produce a sound. Now load your audio source (your media player) with an audio clip. There are a few different supported formats, any old mp3 will work nicely. Just drag your MP3 into the audio click field of your GvrAudioSource. By default, the audio will play on wake, so just hit play to enter game mode and you should hear your new audio right away.
For more information on the ins and outs of Google Cardboard Audio capabilities, check out the documentation.
If you find your audio doesn’t play, try clicking edit -> project settings -> audio and make sure the “Spatializer plugin” is set to Gvr.
VR working properly again (at least I think I have)
select objects again
the FPS back over 60
Unfortunately I still can’t compile to my phone but hopefully, the weekend sorts that. It’s funny how breaking this thing has been possibly the most educational part of the course so far. I’m not saying I’d make a habit of it, but it was a net positive overall.
Making stuff is difficult, especially when that stuff is new. This is something I’m all too aware of. I was progressing nicely with my Night at the Museum project when (in my wisdom) I decided to upgrade my production tools mid-project. A word of advice, never do that.
Spending hours fixing a long list of issues is frustrating, but it isn’t a total loss. The key to success when you hit a bump in the road (like sucking at it, hating self etc) is to keep going! It’s not always easy but if you ever want to get good at anything, the key is preserving. Even in the face of self-loathing and a general distrust of your own abilities.
When you’re doing something new, embracing the tough times and roadblocks as an opportunity is key. You’ve got to see it as a way to toughen your resolve. If you can’t turn adversity into a win, then that adversity will win and you’ll stop progressing.
So the next time you find yourself making a virtual museum experience and your:
VR cameras stop working
you can no longer select items
your frame rate drops to a nausea-inducing 27 fps
you can no longer compile to a device
all of the above is your fault because you made an idiotic decision
delays cost you $300 per month in additional course fees (seriously send money now!)
Don’t give up, keep going! Not only that, tell other people about it. Seeing other peoples screw-ups is encouraging to others on the path to something new.