Unity3D – Implementation Roadmap

Unity3D – Implementation Roadmap (aka What Do I Need to Make a Game?)

Whether you are just getting started using Unity3D or a veteran Unity developer who started in the mid-noughties (get it?) there will inevitably be something you want to create which requires skills and techniques that you don’t yet have.  Thats just what tutorials are for!  There are a LOT of tutorials out there for Unity3D and in one of my other articles I am keeping track of some of them so that we can best leverage what they have to offer, however even with all of the resources that provides I feel like there is something missing …

What do you need to make a game?

You need implementations.  Pretend that you would like to make just one level of a Super Mario Bros style platform game.  You will need to know how to make Unity3D do a certain number of basic things before you can really expect to complete the game:

  • displaying your character, control of the character in 2d, walking, running, jumping, affecting movement in the air, friction on the ground, collision between the top of your character and the bottom of a block, death upon collision with an enemy unless you stomp on the enemy or unless you are temporarily invincible,
  • enemies roaming with varying movement patterns, growing your sprite or changing its colors when you get a power-up, popping power-ups out of blocks, moving the power-ups around in different ways, mushroom collisions with the environment, popping coins out of blocks, making question mark bricks shimmer,
  • timing the level, keeping track of score, death when falling into a pit, enemy death animations, character death animation,
  • stomped turtles turning into a shell, shell movement and physics, collisions between your feet and the shell, determination of which side of the shell your feet have collided with (to deterimine direction), collision with flagpole, sliding down flagpole, fireworks , animating dropping into pipes, switching to dungeon screens, animating crouch, shooting fireballs, fireball movement, fireball collision with enemies, etc.

That is just off the top of my head and there is undoubtedly more that I didn’t think of (and I didn’t get into sound or music at all).

Implementations + Content = Game

I’m going to start calling the ‘things’ above ‘implementations‘.   An implementation is something you need to know how to do in order to create a game.  Each of the actions, skills, tricks, simulations, activities, animations, collisions, conditions, sprites, characters, projectiles, or whatever is an ‘implementation‘ of something and when you combine some of these implementations with content to make it look and sound interesting you get a game.

The above list of implementations was targeting a Super Mario Bros. style platform game, but for every other type of game there will be a similar list of implementations.  Perhaps the list will be longer, perhaps it will be shorter. Perhaps the implementations will be more difficult to implement, perhaps they will be easier.  Perhaps there will be tutorials for them, perhaps not.  Perhaps you will wish to make new and original implementations for gameplay that hasn’t been done before, or combine existing implementations in new ways from which original or fun gameplay emerges.  In any of these cases you need implementations.

How to find implementations

One way (not recommended) is to overwhelm yourself with information.  You attempt to learn everything that anyone might ever need to know about Unity3D and then after you’ve ‘mastered’ it all you can begin to build your game since you will then know how to make all of the implementations on your own and you won’t need johnmcgarey.com anymore.  That is perhaps the slowest, least effective, and most frustrating way to approach game development.  Additionally if you ask 12 experts they will all have a different list of things you must learn before you start developing games in Unity.

Poppycock.

The way to find implementations and really make a game is to figure out what you need to do and then watch tutorials and read questions on forums and try stuff until you figure out the solution.  The rest of this article will help with that.

Implementations that I have found so far

  • Ending the game and allowing the player to restart the game
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Using coroutines to allow for wait times
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Adding a simple HUD with text
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Keeping track of score
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Adding audio to events
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Adding background music
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Making your player explode when it collides with an enemy
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Making the enemy explode when it collides with your bolt
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Making waves of enemies come in from outside of the screen
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Constraining the movement planes of enemies
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Physics Updates (FixedUpdate) vs Input Updates (Update)
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Deleting projectiles when they leave the playfield
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Getting random vector3 values
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Making an object rotate randomly
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Shooting a projectile in a straight line from where the player is facing
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Creating a cool laser bolt projectile
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Setting up a new project
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Packaging a game to publish to the web
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Make a player look like it is lit by a bright star
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Make a player look well lit
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Make a camera which doesn’t care about depth (orthographic)
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Writing, Compiling, and Running a Player Controller
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Moving a player in 3D
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Moving a player in 3D by mapping input values directly to velocity
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Exposing public variables to adjust values at runtime in the Unity inspector
    • http://johnmcgarey.com/2017/08/02/meta-tutorial-of-the-space-shooter-tutorial-using-unity3d-2017-1/
  • Limiting movement when the player isn’t being animated
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Blending animations together to make them look smooth
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Triggering a random animation from between several possiblities
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • 3D walking player animation
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • 3D running player animation
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Making a character into a physics object (by adding a rigid body)
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Passing parameters into an animator
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Making something happen when a key is pressed
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Downloading a character from the asset store
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Assigning an animator to a character
    • http://johnmcgarey.com/2017/08/08/unity-5-animation-control-meta-tutorial/
  • Animation of objects using keyframes (in this case a title)
    • https://www.youtube.com/watch?v=ifvB_Cl3NIQ
  • Making great looking text with Text Mesh Pro
    • https://www.youtube.com/watch?v=UBf8YRBM5Ls

Levels

  • [Blender] Creating a simple terrain in Blender using a heightmap ( a greyscale picture) and the displace modifier

Best Resources for Game Development

Best Resources for Game Development

When you begin to build a game in Unity3D or any other engine, Framework, or SDK you are likely going to need resources to use (unless you want to build everything yourself which is admirable but can take a long time) so here is a running list of the best resources I have found so far.

Meshes

Textures and Materials

Shaders

Music

  • Absolutely Free Music
  • Procedurally Generated Chiptunes
    • https://pernyblom.github.io/abundant-music/index.html
  • Procedurally Generated Tunes – Export to MIDI or MP3
    • http://tones.wolfram.com/generate/GBRfJxMC2bszyCvCDbuBZLMHX6NccJ4Q23w9moQIF
    • Note: Rumor has it you can’t use these tones

Sound Effects

  • Procedurally Generated
    • https://www.leshylabs.com/apps/sfMaker/
    • https://www.bfxr.net

Level Design

Game Design

Fonts

  • FontSquirrel – They’ve already ferreted out the fonts that are free for commercial use

Model Creation Tools

  • MCS – A really cool morphable character which you can change from within Unity (even from within scripts)
  • UMA2 – make characters within Unity
  • Mixamo – free from Adobe
  • Daz3D – a whole world of professional character creation
  • Blocks – Design 3D Models in VR
  • Tiltbrush – Paint in 3D in VR worlds
  • MagicaVoxel – Make models from Voxels
  • Structure Synth –  with a specification language you can make some incredible odd models

Other Lists of Resources

Testing

Entire Working Systems

  • FPS Starter Kit – a good starting point if you are interested in making a first person shooter
  • Angry Birds Clone
    • Its the mechanics of just one level but it works well for what it is
  • Unity Pong
    • A simple Pong Game in Unity
  • A large list of games on Github
    • This is a list of games that are open source and although many don’t use Unity they can be studied and examined.

Models – Not Unity Specific

Note: These aren’t as likely to be plug and play as ones purchased from the unity asset store

2D Overhead Art (RPG Style)

Sprites

Motivation and Support for Game Development

This site encourages you to release one game every month

It is a really encouraging site which is not a competition but a personal challenge

  • http://www.onegameamonth.com/faq

This site hosts listings of gamejams

  • http://www.indiegamejams.com
  • so does this (plus has an advantage since its a hub of indie games)
    • https://itch.io/jams

This is a hub of indie games

Games can be sold here and they can even let the player name the price they want to pay.

  • https://itch.io

Game Development Philosophy and Principles

Modern Game Engines

There are getting to be a shit-ton of game engines out there in the world and some of them can demonstrate really freaking amazing technology, but there are some things to consider above and beyond the technologies that the game engine advertises and provides and the single most important of those imho being an extensive, significant, and engaged user community.  Without that you will have to figure everything out by yourself, and perhaps more importantly, if you have a major problem with the engine you could be the only one complaining to the developer.  With an extensive user community those things become less likely.

A few things:

  • If an engine is not being regularly maintained I don’t want it on this list.
  • Just because it has 3D support or 3D acceleration doesn’t mean its a 3D engine
    • To be clear those things are fantastic and important regardless of whether I label it as a 3D engine.
  • A big part of my analysis about these engines is the quality of what has already been made in them.

Modern Full-3D Engines with significant user communities

Modern 2D Game Engines with significant user communities

Modern 2D Game Engines for Rapid Game Development

  • Stencyl
    • Advertised as “the quickest and easiest way to build a game”
  • Construct 2
    • Programming not required
    • Native Asset Store
  • Defold
    • Solves technical problems so you can focus on building great games
  • Corona
    • “Amazing learning curve” “You can go as fast as you want, learning and building game from ground up.”
  • Bitsy
    • This is a tiny game engine thats just right for making super simple Atari level pixel art games where you explore and interact with people and things using text

Publishing Games

 

Useful Asssets

  • ProjectPrefs lets you store preferences for your game as a .ini file
    • This means that you can (in some cases) ship your game and allow your users to reconfigure it in the field.

Scripts

 

Unity 5 Animation Control Meta-Tutorial

Unity 5 Animation Control Meta-Tutorial

In this Meta-Tutorial* I will be walking through the Unity 5 Animation Control tutorial by Aaron Hibberd.  The tutorial was made in August 2015 using Unity3D 5.1.2f1 (from 2015) but I will be using Unity3D 5 2017.1.

* Meta-Tutorial – a walkthrough of a tutorial which shows the ins and outs and ups and downs of the tutorial and proves out that it isn’t too ‘rotten’ (see tutorial-rot in my other articles)

Part 1: Setting up the project

In this section Aaron talks about why he is creating the video and downloads a great character called “Unity-chan!”.

Warning Pop Up:

He shows you how to download Unity Chan but I noticed one thing that happened for me but not for him: I got a warning pop-up from the asset store indicating that Unity-Chan was created for Unity 4.6 and therefore some scripts may not work with Unity 5.

Decision:

I am going to choose to ignore that warning since Aaron has made this tutorial specifically with Unity 5 in mind so I believe he will address most or all of the compatibility issues necessary to complete the tutorial.

License:

Unity-Chan has her own EULA (End-User License Agreement)!

How to view Unity-Chan License
How to view Unity-Chan License

I bet if I keep my eyes peeled for this I’ll see more examples of it but I haven’t previously seen an asset having a license that they made just for that asset and to me that is kind of cool and it means they take their asset seriously as a product in and of itself.

I like how Aaron is showing the steps clearly and fast and not wasting time waxing poetic about his opinions about what is going on and why which should allow him to get through more tutorial content in a tighter video package and I appreciate that.  He also edits the video to remove any dead space that was previously there.

In this section we are asked to make an ‘animator’ to control the animation.  This is entirely new to me so I’m glad he explained adding the animator window. He’s walking us through this with an excellent understanding of what exactly we need to know.

Importing Animations

At this point while you are in play mode (and once you have unchecked maximize on play) if you right click on any of the wait animations in the animator window and select ‘Set as Layer Default State’ you can see that animation take over instantly.  Unity’s real-time response to changes and updates like this is remarkable and powerful.

He shows you how to transition from one animation to another and how to set a default, and then how to write a simple script that will soon let us control our animations but when he is compiling and running the first script at first I was concerned about all of the warnings I saw in the console but I see in Aarons window that he has many or all of the same warnings which I believe come from the Unity-Chan scripts not being completely up to date with the latest version of the API and everything works fine.

Here’s a simple ‘gotcha’ thats worth looking out for

I noticed that the first time I dragged the script onto my unity-chan character it seemed to add that component to the character but the next time I hit ‘run’ the script was no longer attached.  This was because I had dragged it while I was still in ‘run’ mode and changes made while you are in run mode are not maintained.  Once I dragged it over when I was not in run mode it attached and worked well.

What can you do with those animations

He explains what the final parameter is in the anim.Play command and shows what happens when you change that value to 0.5f.  He also shows how to get input from keys, the mouse, and from the default input controller (no matter what that is configured to be)  and how to use that information to trigger different animations, even choosing an animation randomly from between several possibilities.  He shows how to pass floats via public attributes in the script through to the animator and how to see them update live as you press your input keys

Sending Floats into the animator
Sending Floats into the animator

I experimented with the ‘mirror’ property in one of the animations and it seemed to flip left to right but also to start the animation at the end and work backwards.

Unity3D Animator Mirror Option
Unity3D 2017.1 Animator Mirror Option

He shows how to create a new state machine from a blend tree and how to descend in to that state machine and then how to make a 2d simple directional walk animation and then adding a ‘motion field’ and how to use that field.

Movements

Once he got the wait states working he added a script to move the character based on all of the directions. He showed how to change the character to a physics object (added a rigid body) and how to add forward and backward motion and limit velocity when the character isn’t being animated.  He showed how to add run animations based on a boolean parameter which was based on having the shift key depressed and how to make her move faster when the shift key was depressed.  Finally he shows how to implement a jump and then slide animation.

All Animations
All Animations

Conclusion

Overall this was an effective and tight tutorial showing everything clearly and without fluff or wasted time.  It gives you a good understanding of the Unity animator state machine system and with this you could code up some really complex and interesting characters.  Even though the tutorial was made in 2015 there really weren’t any stumbling blocks and certainly no show-stopping issues and I am grateful to Aaron Hibbard for creating this video.

Thank you for reading and please check out the other tutorials and meta-tutorials on this site.

Meta-Tutorial of the Space Shooter Tutorial using Unity3D 2017.1

Observations from the Unity3D Space Shooter Tutorial using 2017.1

I’m starting this Space Shooter tutorial now and I’m going to log my comments, thoughts, impressions, and observations here in order to help others (and my future self) best leverage this material. The Space Shooter tutorial was created by the Unity3D team in 2013 using the latest version of unity at the time.  Since the tutorial is four years old it has experienced substantial “tut-rot”* so in this article I’m going to use my Code-DeLorean to bring this space shooter into 2017 and make it work with Unity3D version 2017.1.  Since this is in some sense a walkthrough of a tutorial, I’ll call this a Meta-Tutorial*.

New Lingo:

* Tut-Rot – Tutorial Rot – The incompatibilities created as a result of toolsets upgrading while tutorials do not.

* Meta-Tutorial – Just coined it! See above for the explanation.

* Code-DeLorean – Bringing old code up to speed with new tools.

For Further Information

If you have trouble that isn’t addressed in this article, visit this thread on the Unity Forums which has 53+ pages of Q&A all entirely specific to this Space Shooter Tutorial.  There is also a Unity 5 Upgrade Guide which is linked from the main tutorial page which describes some of the differences between the video and the current version of Unity, however its … well … spotty with messy formatting, missing letters and words, etc.  I’m guessing it was based on a poorly done export of the youtube annotations of the tutorial videos, but the guide is certainly more explanatory and helpful than the annotations alone.

Lets Get Started!

While in this article I’m being picky about the details of the tutorial, I am actually a fan of this tutorial (evidenced by the time I’m taking to dig into it and write this article).  I am glad the author created it and I think that combined with this article the tutorial will be useful to you.  Lets Get Started!

Gathering the Assets

On the main Space Shooter Tutorial page: there is a link which purports to let you “download the assets for free” however sometimes that link inexplicably (though reproducibly) takes me to the main asset store page from whence I must search for “Space Shooter Tutorial” to get to the intended location.

Afterwards there is a link to “Download” or “Open In Unity” and a process of putting the content into a download manager queue, downloading it, then opening a new project with the new content you’ve downloaded.  THEN from within the new project it asks you to download the content again.

Importing the content from within Unity
Importing the content from within Unity

There are various dialog boxes and buttons to click and none of it is too complicated but all told I found this step confusing and potentially frustrating and it delayed me to the tune of 2-3 minutes.  Still in a good mood (probably since I just got engaged to be married … YAY!) I proceeded to the next steps.

Setting Up the Project

Youtube Video for this Section of the Tutorial

This video goes into some detail about how to create a blank project.  There is a short section about  importing the Space Shooter Tutorial content which has rotted entirely and it doesn’t seem to show anything about how to do that part so you’ll have to poke around a bit.  It shows how to change the screen resolution of your final published game and also has some good discussion of build settings and of editor layouts and how to save them.

A slight discrepancy between the video and the latest version of Unity3D is the non-existant “project creation wizard” that they speak of.  A totally forgivable Tutorial-Rot problem which I think most people will be able to figure out.

From the Video:

Unity3D Missing Project Wizard
Unity3D Missing Project Wizard

From the latest Unity 2017.1

Unity3D 2017.1 Project Wizard
Unity3D 2017.1 Project Wizard

Note: Since I hadn’t installed the WebGL platform when I installed Unity I had to do that during this step.  There was a convenient link in the Build settings which let me download the package for Mac, and the installer worked well even when I had Unity still open, however I had to restart Unity for it to really recognize that it could publish to WebGL.

The Player GameObject

Youtube video for The Player GameObject section of this tutorial

This section has a number of youtube annotations that provide corrections to the instructions given in the video and although most of them aren’t that critical, Youtube annotations aren’t typically visible on mobile devices so keep in mind that you may be missing a few things if you are watching on your phone most notably:

Youtube Annotation Must make Collider Convex
Youtube Annotation Must make Collider Convex

In my case without ‘convex’ selected, the mesh collider didn’t even show up in the scene view!?!

Making Mesh Collider Convex
Making Mesh Collider Convex

 

Camera and Lighting

Youtube Video for this Section of the Video

This video adds in three directional lights to make the ship look like it is lit from a bright star off to the right but also enough ambient and ‘rim’ lights to be able to see the ship clearly during gameplay.

When this part talked about removing the directional light and skybox I got momentarily lost because the ambient lighting menu is VERY different now, however one of the annotations in the Youtube video pointed me in the right direction: Window(Menu)->Lighting->Settings.  From there although he talks a lot really all you need to do is make the ambient lighting totally black.

Late in the video an annotation pops up suggesting that due to changes in the engine’s lighting pipeline you should set your lighting intensity to about double what is suggested in the video.  I had to go back and set the main light to 1.5 instead of 0.75 and when I did everything looked much better.

Adding a Background

Youtube video for this section

This video shows how to add an image (aka texture) to a flat mesh called a quad to create a background and also speaks of how to properly arrange, and scale that mesh, and how to light it without affecting the lighting that applies to the ship.  At the end we move the background down and out of the way of the ship which interestingly doesn’t affect how the camera sees the background since we previously set it to ‘orthographic’.

 

Get the ship moving

Youtube video for this section

Now we’re finally adding some gameplay.  I feel like this would have been cool to have going in the first or second video because its motivational to see things actually happen in game.  This section uses a clever (though ultimately really simple) mapping of input values to velocity to move the ship around using physics.

Its impressive to me how easy it is to get the ship moving.  This video talks about how to speed up the movement of the ship using public variables and how to set those inside of the unity editor (so you don’t even have to touch the code to change the value) by exposing the public variables to the Unity Inspector.  One thing I noticed was that you can actually change the speed value WHILE you are playing the game to test out different values and see which one you feel best suits the gameplay.  He shows something cool about [System.Serializable] which is a magic word that exposes public variables of a class to be visible in the Unity Inspector.  This is imho an AWESOME feature which enables a tight integration between the code and Unity Engine GUI.

In this section he reminds us that to get to the scripting documentation when in Monodevelop is CMD+’ on the Mac.

There is a critical annotation here saying that we have to use “GetComponent” explicitly even though the code in this section doesn’t do so.  This is addressed somewhat in the “Unity 5 Upgrade Guide” that is linked from the main tutorial page, however in that guide the code has a typo.

private Rigidbody;
should be
private Rigidbody rb;

Not a big change of course but the code won’t work without it.

Creating Shots

This section talks about creating a material for the bolt that your ship is going to shoot and then adding the script to send it flying forward on the screen.  Its not yet hooked up to the ship specifically but just launching from the origin point.  Pretty early on in this section I got stuck.
How to select a texture for a material
How to select a texture for a material

It said to just click on ‘select’ and I could select a texture for my material but tut-rot strikes again and there was no select button.  It gave me the apparently helpful hint that “Albedo” was what I was looking for but I don’t see a select button on that either!?!  Referring back to the Unity5 Upgrade Guide I found nothing of value.

How to select a material in Unity4
How to select a material in the Unity4 based Tutorial

I tried dragging the texture onto the sphere at the bottom, and tried dragging it onto the Albedo field with no success.  I also tried dragging the texture onto the material in the Project Browser but no luck.  I jumped the gun a bit when I dragged the texture onto the VFX that we just made in the Heirarchy and it looked pretty good at that point, however that didn’t help with the point of this part of the tutorial: making a new material with an associated texture.

Eventually I figured it out!  When looking at some of the documentation I noticed a texture in a place that I didn’t expect: I didn’t realize that the little check box to the left of the Albedo property is actually not a check box at all (I was wondering why it wasn’t checking when I clicked on it!?!) Instead it functions as the texture box and the even tinier icon to the right of that box brings up the select window.  Having learned this lesson I will never have a problem with this again and will always see those “checkboxes” as “texture boxes and selectors”, but that was less than obvious and I don’t feel bad for not having seen that right off the bat.

Texture Finally Attached to Albedo Field!
Texture Finally Attached to Albedo Field!

The rest of this lesson went well and smooth.

Shooting Shots

The youtube video for this section

This lesson discusses the difference between FixedUpdate() and Update() in scripts. Thats something that has been discussed before in these tutorials and basically the difference relates to whether physics are involved (FixedUpdate()) or not (Update()).  It goes into quite a bit of detail about exactly what the code does (possibly TMI).

In the process of getting this working they show you how to create a constant stream of shots and although they don’t show this in the video its pretty fun to play with!

Sending out a stream of shots
Sending out a stream of shots

Note: I left gravity on my bolts on purpose to see what it would do 😀

I tried something here: I tried to make my shots veer to the right or left by adjusting velocity.  It didn’t work so I asked my fiancé for a failure high five!

Failed Code Idea to influence velocity
Failed Code Idea to influence velocity

Boundary

Youtube video of this part of the tutorial

This section is about making your shot game objects delete themselves when they get outside of the play field.  This is so we don’t make too terribly many game objects that never get deleted.

Before dinner today I took a stab at this and it totally worked!

Made a simple distance boundary.
Made a simple distance boundary.

However the way they are going to do it is more elegant and useful.  They are making a boundary box into a trigger collider so they can test for objects to cross that boundary and therefore be destroyed.  In one of the previous episodes I had left the gravity on the bolt, but at this point I removed it since the bolt was leaving the boundary box early (through the bottom actually).

 

Creating Hazards

Youtube video of this part of the tutorial

This tutorial shows you how to make an asteroid.  It talks about the Random.insideUnitSphere function which returns a random vector 3 value which we can use to set the angular velocity of the asteroid (making it rotate).

Asteroid Rotating
Asteroid Rotating

It talks about destroying the asteroid by programming some trigger collider interaction.

I liked the narration around 9m30s.  He finds a bug, feigns surprise, and then says “No we aren’t standing at a flux point in the probability field.  We have a bug.”

Making it Interesting (Explosions)

Youtube video for this section

In this tutorial he shows us how to make the asteroid move, and explode which will effectively make it more interesting.  It shows how to instantiate an explosion GameObject at the location and rotation of the asteroid which makes a pretty effective explosion effect imho.  It instantly added a level of fun to the game and made me want to have more asteroids to blow up (which I’m pretty sure they are about to show us).

Shooting an Asteroid
Shooting an Asteroid

This tutorial also shows how to make the ship explode when it hits the asteroid.  That is in fact a built in feature of the scripts as we have them written but I believe he is about to special case the ship explosion to make it more interesting (and so we can keep track of the score).

I noticed something:  When you make a public class variable and don’t set it in unity, the execution effectively ends instantly.  Example: I just added a playerExplosion public variable but didn’t set it and now my collisions don’t work anymore.  It didn’t just not-instantiate the explosion that I didn’t set, it just gave up!

Execution Stops Here
Execution Stops Here

Game Controller

Youtube video for this section

This video shows us how to create the game controller that will send the asteroids flying down at us like a digital-Zeus but with asteroids instead of lightning bolts.

In the process I did an experiment and moved my half developed “SpawnWaves” from Start() to Update().  I got this:

Asteroids Out Of Control
Asteroids Out Of Control

Interesting: Some are just disappearing.  I don’t know why.

Waves of Hazards

Youtube video for this section

This guy is claiming that one asteroid per game is too easy … ok he might be right.  This video will spawn waves of them.  In this video he is a bit judgmental about code he deems to be ugly … ok he might be right about that too. :p

In this section he spends a lot of time on a ‘for-loop’ which is a standard programming thing that imho he could have skipped over or referred to another resource, still he did a great job explaining it!

Wait! That is a legitimate problem

Problem: that problem in the “asteroids out of control” gif above (the one where the asteroids are deleting themselves for no reason) that is much more significant now that I’ve got fewer of them and its not happening in the video. This means I have a bug in my code somewhere and I have to debug it.  I’m going to try to do that now before I go any further.

I put a line of code in the DestroyByBoundary class to show me when something exits the boundary and that seems to be the problem:

Debug Exit on Boundary
Debug Exit on Boundary

But why?  I’m guessing that the asteroids have a vector in the y direction and are escaping out of the top or bottom.

I noticed that there is only a problem when the asteroids collide with one another so one way to fix it *seems* to be to make the asteroid prefab into a trigger collider because then its physics aren’t interacting with other asteroids physics, but I looked carefully through the videos and immediately prior to making the asteroid prefab the “Is Trigger” box is NOT checked so it doesn’t seem like thats how they solved it.  I’m starting to think they didn’t solve it but if so I don’t know what I did differently.

Trigger Collider not set in the video
Trigger Collider not set in the video

Anyway the way I decided to fix it is to constrain the x and y values to 0.0f in the update routine of the mover like so

Constrain Asteroid and Bolt x and y values
Constrain Asteroid and Bolt x and y values

This worked and I can shoot the asteroids and all seems to be well now.

Back to Waves of Hazards

It talks about how to suspend a routine without suspending the entire game. The solution is to make that part into a C# coroutine and there are just a few specific pieces of syntax required to do this (a good example is the WaitForSeconds code example).  The “StartCoroutine” and the return value of IEnumerator are really the only parts that matter.  The StartCoroutine makes sense to me but I don’t know what an IEnumerator is or why its required and I don’t think that is explained well enough but regardless of all that otherwise it is just a normal routine but now has the ability to pause.

 

Audio

Youtube video for this section of the tutorial

Well I had a problem right off the bat here: Audio wouldn’t play!  Even just from the preview window.  90s of googling and I found the answer on a 2012 forum thread suggesting that on the Mac if this happens its usually because Unity3D has been open for a long time (true in my case: several days) and restarting Unity should re-enable sound.  It totally worked.

There is a good explanation here  of what 3D sound does and how it relates to an audiolistener.

The tutorial suggested that you could drag and drop a sound file into a prefab in the inspector and it would create an audio source automatically and populate it with that audio file. I tried for 5 minutes and did not find any way to make this work (dragging onto icons, browsers, inspectors, different parts of inspectors, etc.), so I just ended up doing it without the automatic drag and drop audio source that they spoke of in the video.  Manually adding an audio source component and dragging the audio file into the first field (called ‘audio clip’) in that audio source component worked like a charm and I’ve got exploding asteroid sounds now!

The drag and drop did work when dragging onto the hierarchy and I was able to attach it to the player object this way.

Counting Points

Youtube video for this section of the tutorial

In this section we are shown how to display a score and keep track of points as you accumulate them.  The first thing they show is how to Create a GUI Text component but the way to do that in Unity5 17.1 is pretty different than the way they did it back in 2013 so there is a large annotation that pretty much says to do everything different.

How to make a GUI Text Component in Unity3D 5 2017.1
How to make a GUI Text Component in Unity3D 5 2017.1

An important note when making GUI text in Unity 3D 5 2017.1 has to do with the ALT key. (UPDATE: I realized a bit later that while this is technically correct and I’m glad I figured it out, this doesn’t apply directly to this tutorial since I had done something wrong.  See the bottom of this section for details.)

Unity3D 5 2017.1 GUI Text
Unity3D 5 2017.1 GUI Text

If you click on the box in the top left of the Rect Transform component of the GUI text it seems like you can place the text wherever you want just by clicking.  You have to hold down the ALT key to while you select to do that.

Alt Matters.

This video talks about GUI Text and its properties and limitations and how since its GUI we won’t see it in the Scene view.

Theres a bit of a naming problem when adding the score in since the parameter name is “newScoreValue” but we are just adding it to the current score value.  It should probably be named something like “scoreToAdd”, but I understand not always getting things right because as we all know naming things is hard.  To be fair to this tutorial I’ve been impressed with their naming throughout and have had only this single exception which is a pretty good track record imho.

Naming is hard
Naming is hard

In this video they do a good job of explaining objects and instances using a “valet parking” metaphor, which works quite well in this context.  They do this while they are showing us how to do script to script messaging by identifying and then calling the games specific instance of GameController from within another script.  Of all the code in this tutorial the code that finds the gameController instance makes me the least confident.  Not because it wasn’t written well, but because there are so many places it could go just slightly wrong: finding the object by tag (what if there are two), getting the script out of the object, etc.

I encountered a problem near the end of the video: It said to drag the ScoreText object to the Score Text slot in the GameController inspector but that didn’t work.  I suspect it has something to do with the type I selected in the code and am about to go check the Upgrade to Unity 5 Manual for clues.

Attempt to drag and drop failed
Attempt to drag and drop failed

Oh! When I re-read the instructions in the youtube annotation (the one that I screenshotted and pasted at the top of this section) I realized that I hadn’t done exactly what those instructions said to do.  I did Create->UI->Text from the Hierarchy however it says to create an empty game object and add a GUI Text component.  I’ll go do that (I bet it will work) … yup! It worked!

Success!  Wow that ended up being a tough section for me.

Success - It was really fun to see the score updating for the first time
Success – It was really fun to see the score updating for the first time

Ending the Game

Youtube video for this section of the tutorial

This video explains more about how the GUIText objects are positioned on the screen.  Remember that 0,0 is the bottom left of the play window for these objects (see previous video).  This video makes a public method that ends the game, and sets up the ability to restart by polling for the r key to be pressed in the update method.

This video speaks of using Application.LoadLevel() however the documentation shows that to be a deprecated method and suggests using SceneManager.LoadLevel() instead.  Theres no Youtube Annotation for this so its good to know about it.  It didn’t work immediately so I looked into the documentation and found out that it requires you to specify SceneManagement in the using list at the top of the file.

using UnityEngine.SceneManagement
using UnityEngine.SceneManagement

Deploying to the web

Youtube video for this section of the tutorial

The hard part here has nothing to do with Unity.  Its getting it uploaded to your web server! This section is straightforward.

My finished version is here in case you want to play it:

http://sw.johnmcgarey.com/Space_Shooter/

Thanks for walking through this adventure with me!  The tutorial was more rotted than I imagined but also had a higher quality core than I first thought.  Thanks to Unity for the engine and for the tutorial. What questions do you have for me?