Bowling With Unity
Bowling With Unity
In this section of our Bowling with Game Engines series, we will be implementing our bowling game in
Unity. The idea is straight forward, implement the same simple 3D game across a number of game
engines. The Unity game engine is a logical place to start, as it is perhaps the most popular game engine
in use today. We will go step by step through the process of creating our game, both in text as well as a
video version available here. [Link] I am not a regular Unity user, so please do keep in mind, a lot of
what I am about to show may not be best practice! All of the assets used in this tutorial are available for
Patreons as part of the bowling game kit, along with project files and this document in PDF form. Don’t
worry, these aren’t needed to follow along.
Let’s jump in. Fire up Unity and create a new project. In this example I am using Unity 5.6.1, however
any recent version should work.
First, let’s start by dragging all of our required assets into Unity. Simply select all of the game assets you
will be using (FBX models, textures, audio files) and drag and drop them from Explorer or Finder into the
assets folder. If you are using the Patreon assets, simply copy the contents of Raw Assets in the Unity
project folder.
Unity does an extremely good job of importing assets and you should require no additional steps. We
now have all of the assets we are going to need to create our game, let’s get started.
Creating the Title Screen
First, we are going to start by creating a simple title screen with some awful looping background music.
We will be using our default scene for the splash screen and later we will create another scene for our
actual gameplay. We start off by saving our untitled scene. Simply select File->Save Scene As…
I saved it as TitleScreen. You should now have a new item in your assets list:
We now have a few setup tasks to take. We are going to be showing our title image and this requires us
to alter the Main Camera entity. In Hierarchy panel select Main Camera, then in Inspector we change
Clear Flags to Don’t Clear.
This causes our camera to no longer have perspective ( things aren’t drawn smaller the farther away
they get from the camera ). Generally an Orthographic camera is what you use when working in 2D in a
3D world. Setting Clear Flags to don’t clear simply causes the default skybox to not be drawn, we could
have optionally defined a background clear colour if we preferred.
Now in Hierarchy panel, click the Create button, select UI->Canvas. Next, with the newly created Canvas
selected, click Create again and this time select UI->Panel. At this point we should have this hierarchy.
Next we have to make a slight modification to our imported Titlescreen image. Select the Tilescreen.png
image file in the assets view, then in Inspector change Texture Type to Sprite (2D and UI). Then scroll
down in the Inspector and click the Apply button.
Next select Panel in the Hierarchy view, and drag our newly created Sprite over to the Source Image
section in the Image (Script) section.
If you press Play now, you should see your Title screen in the viewport.
Now let’s add a looping music file to our title screen. In the Hierarchy view, select the Canvas entity.
Then in inspector scroll down and click Add Component, then Audio->Audio Source.
In the newly created Audio Source in Inspector, drag our imported audio file over to the audio clip
section. Down below, make sure Play on Awake is set and then tick the box next to Loop.
Ok, we now have a title screen and a sound track playing! Good work so far… now let’s add a simple
script that changes scenes on click. Let’s create our script. Right click in the Assets area, select Create->
C# Script.
Name it PanelScript.cs.
Double click the newly created script file and it will open in your editor of choice. Now enter the
following code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
Here we are simply checking every single pass through the game loop if the Left (0th) mouse button (or
touch) is clicked, and if it is, we load the scene named “GameScene”.
Hmm… guess we should make a scene called GameScene now shouldn’t we? Once again right click the
Assets panel, then select Create->Scene.
Now double click our newly created GameScene to open it up. If prompted to save, do so. Now it’s time
to create our game!
Now it’s time to get to work on creating the game itself. Start off by dragging BowlingLane into the
scene.
Now move the lane so it’s at position (0,0,0) in the Inspector under the Transform component.
One thing I noticed is the Normal map is way too strong. Select the Bowling Lane material (either in the
Materials panel, or drill down to it). Dial back the Normal Map strength from 1.0 to 0.2.
We are almost done with our bowling lane. The final thing we need to do is add a Collision Shape to it,
so the rest of the stuff in our game world will interact with it properly. With the BowlingLane selected,
click Add Component->Physics->Box Collider
The nice thing with Unity is, it will automatically shrink wrap the collider geometry to match your mesh,
so you should have to do no additional work!
So, that’s it for the lane, now time to create the Bowling pins. Simply drag the Bowling Pin into the
scene:
Hmmmm… pretty dark. What’s going on here? Well, right now we are getting our lighting from the
Directional Light in our scene.
We don’t want to mess around with advanced lighting, so instead right click and get rid of it. Now lets
set up Ambient lighting instead. Select Window->Lighting->Settings
Change Environment Lighting->Light Source to Color, then select the Ambient Color as white:
Now it’s time to add some physics to our pin. Once again we have to make a collision object
component, but we also need to create a RigidBody component. Add a Box collider just like before.
Then add another Component and select Physics->Rigidbody
The default settings are about right, so there is nothing else we need to do here.
The final thing we need to do with our pin is apply a tag to it so we can locate it using code later. With
the Pin selected, in the Inspector at the top drop down the Tag drop down and select Add Tag…
Click the + Icon, then in the resulting text box enter “Pin” then Save.
Now select the Pin again, and in the Tags list, select Pin which should now be an option.
Now we simply need to create 4 ( or 9… depending your bowling preferences ) clones of our pin. Select
the BowlingPin in the scene graph, right click and select Duplicate. This will create a copy with all of the
settings and components defined.
After duplicating, position the pin and repeat the process until you have enough pins.
Next, we need to create a bowling ball. Instead of importing a 3D mesh, we are going to create one.
Select Game Object->3D Object->Sphere.
Once created, rename it to BowlingBall.
While we are here, create a new Tag called Ball and assign it to our object.
Let’s create a material for our Bowling ball. Right click assets panel, select Create->Material. Rename
the newly created material BowlingBall. Pick the color of your bowling ball with the box to the right of
Albedo. For shine add a small amount of Metallic as well.
Now simply drag the newly created material over to our Bowling Ball in the scene.
We also need to attach physics to our bowling ball. This time it’s using a Sphere Collider. This is also a
rigid body, but this time we increase the mass to 3.
We are going to be putting all of the logic in our bowling ball. One thing we are going to need to do is
play audio when our ball hit’s a pin. We will add this logic later, but the audio source needs to be
somewhere, so why not the bowling ball. We actually covered this process earlier when we added audio
to our title screen. Simply add an Audio Source component to the ball then attach the Hit.wav file, like
so:
Now its time to add some scripting to our game to control input and to deal with physics collisions when
they happen. Right click the Assets panel and create a new script like we did earlier. Rename it
BowlingBall.cs and drag it onto our BowlingBall object. Now double click our script and enter the
following code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
ballPosition =
GameObject.FindGameObjectWithTag("Ball").transform.position;
}
We publicly expose the Force value, which is the amount of energy to apply along the Z axis when we
throw the ball. Since it is public, it’s settable in the editor as a property in the script component.
And done!