In this tutorial we continue making Ms. Pac-Man. This time we will Find out How to use Multiple Audio Sources, Set up Sound Effects, Allow Ms. Pac-Man to Eat Dots, Set up the Interface, Update Scores when She Eats Dot and a whole lot more.
All of the images used are here. The code follows the video below. You can also Download all of my Unity game files so far for Pong, Space Invaders, Tetris and Mario.
If you value videos like this consider donating a $1, or simply turn off AdBlocker. Either helps a great deal.
[googleplusone]
Code from the Video
SoundManager.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
using System.Collections; using System.Collections.Generic; using UnityEngine; // 1. Create Empty in the Hierarchy, name it SoundManager // Add Component -> Audio -> Audio Source // Drag sounds into Sounds Folder // Create SoundManager.cs // Drag sounds from folder to SoundManager Inspector // Drag EatingDots to AudioClip in Inspector public class SoundManager : MonoBehaviour { // Holds the single instance of the SoundManager that // you can access from any script public static SoundManager Instance = null; // Sound clips for Pac-Man public AudioClip eatingDots; public AudioClip eatingGhost; public AudioClip ghostMove; public AudioClip pacmanDies; public AudioClip powerupEating; // Refers to the audio source used for Pac-Man // eating dots private AudioSource pacmanAudioSource; // Plays Ghost moving loop sound private AudioSource ghostAudioSource; // Used for playing one shot audio clips private AudioSource oneShotAudioSource; // Use this for initialization void Start() { // This is a singleton that makes sure you only // ever have one Sound Manager // If there is any other Sound Manager created destroy it if (Instance == null) { Instance = this; } else if (Instance != this) { Destroy (gameObject); } // Use multiple AudioSources AudioSource[] audioSources = GetComponents<AudioSource> (); // Used for Pac-Man eating dots pacmanAudioSource = audioSources[0]; // Used to play Ghost moving sound ghostAudioSource = audioSources[1]; // Used for one shots oneShotAudioSource = audioSources[2]; // Start Pac-Man eating sound PlayClipOnLoop (pacmanAudioSource, eatingDots); } // Other GameObjects can call this to play sounds public void PlayOneShot(AudioClip clip) { oneShotAudioSource.PlayOneShot(clip); } // Used to start playing the Pac-Man eating public void PlayClipOnLoop(AudioSource aS, AudioClip clip){ // Make sure we have an AudioSource and Clip if (aS != null && clip != null) { // Set the sound to loop aS.loop = true; // Set the volume of the sound aS.volume = 0.2f; // Set the clip to play aS.clip = clip; // Play the sound aS.Play(); } } // Pauses Pac-Man eating sounds public void PausePacman(){ if (pacmanAudioSource != null && pacmanAudioSource.isPlaying) { pacmanAudioSource.Stop (); } } // Restarts ac-Man eating sound public void UnPausePacman(){ if (pacmanAudioSource != null && !pacmanAudioSource.isPlaying) pacmanAudioSource.Play (); } // Pauses Pac-Man eating sounds public void PauseGhost(){ if (ghostAudioSource != null && ghostAudioSource.isPlaying) { ghostAudioSource.Stop (); } } // Restarts ac-Man eating sound public void UnPauseGhost(){ if (ghostAudioSource != null && !ghostAudioSource.isPlaying) ghostAudioSource.Play (); } } |
MsPacman.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 |
using System.Collections; using System.Collections.Generic; using UnityEngine; // Used to find out if Pac-Man hits a wall using System; // Used to manipulate the UI using UnityEngine.UI; public class MsPacman : MonoBehaviour { public float speed = 0.4f; // Used to move Ms. Pacman private Rigidbody2D rb; // Sprite used when Pac-Man is paused public Sprite pausedSprite; // 2. Get reference to the SoundManager for functions SoundManager soundManager; // 2. Audio clips public AudioClip eatingGhost; public AudioClip pacmanDies; public AudioClip powerupEating; // 3. Setup Canvas // Create UI -> Text -> Name it Score // Canvas -> PosX 12.5, PosY 14.5, Width 40, Height 36 // Render Mode World Space // Score -> PosX .56, PosY 16, Width 400, Height 30, // Scale .07, Bold, White, 22, Align Center // 4. Add Circle Colliders to all Dots with .25 Radius // Check Is Trigger // Makes sure components have been created when the // game starts void Awake(){ // Get Pac-man Rigidbody rb = GetComponent<Rigidbody2D> (); } void Start(){ rb.velocity = new Vector2 (-1, 0) * speed; // 2. Get SoundManager reference soundManager = GameObject.Find ("SoundManager").GetComponent<SoundManager> (); } // Add the ability to go in reverse without a pivot point void FixedUpdate(){ float horzMove = Input.GetAxisRaw ("Horizontal"); float vertMove = Input.GetAxisRaw ("Vertical"); Vector2 moveVect; // Used to get direction Pac-Man is moving on // the X & Y access var localVelocity = transform.InverseTransformDirection(rb.velocity); // Move Left if (Input.GetKeyDown ("a")) { // Allows me to reverse direction without the need // to hit a point if (localVelocity.x > 0) { // Direction I want to move moveVect = new Vector2 (horzMove, 0); // Position Pac-Man at middle of the lane transform.position = new Vector2 ((int)transform.position.x + .5f, (int)transform.position.y + .5f); // Changes the direction to left rb.velocity = moveVect * speed; // Faces Pacman left transform.localScale = new Vector2 (1, 1); // Sets rotation to default transform.localRotation = Quaternion.Euler (0, 0, 0); } else { // Direction I want to move moveVect = new Vector2 (horzMove, 0); if (canIMoveInDirection (moveVect)) { // Position Pac-Man at middle of the lane transform.position = new Vector2 ((int)transform.position.x + .5f, (int)transform.position.y + .5f); // Changes the direction to left rb.velocity = moveVect * speed; // Faces Pacman left transform.localScale = new Vector2 (1, 1); // Sets rotation to default transform.localRotation = Quaternion.Euler (0, 0, 0); } } } else if (Input.GetKeyDown ("d")) { if (localVelocity.x < 0) { // Direction I want to move moveVect = new Vector2 (horzMove, 0); // Position Pac-Man at middle of the lane transform.position = new Vector2 ((int)transform.position.x + .5f, (int)transform.position.y + .5f); // Changes the direction to left rb.velocity = moveVect * speed; // Faces Pacman left transform.localScale = new Vector2 (-1, 1); // Sets rotation to default transform.localRotation = Quaternion.Euler (0, 0, 0); } else { // Direction I want to move moveVect = new Vector2 (horzMove, 0); if (canIMoveInDirection (moveVect)) { // Position Pac-Man at middle of the lane transform.position = new Vector2 ((int)transform.position.x + .5f, (int)transform.position.y + .5f); // Changes the direction to right rb.velocity = moveVect * speed; // Faces Pacman right transform.localScale = new Vector2 (-1, 1); // Sets rotation to default transform.localRotation = Quaternion.Euler (0, 0, 0); } } } else if (Input.GetKeyDown ("w")){ if (localVelocity.y > 0) { // Direction I want to move moveVect = new Vector2 (0, vertMove); // Position Pac-Man at middle of the lane transform.position = new Vector2 ((int)transform.position.x + .5f, (int)transform.position.y + .5f); // Changes the direction to left rb.velocity = moveVect * speed; // Faces Pacman left transform.localScale = new Vector2 (1, 1); // Sets rotation to default transform.localRotation = Quaternion.Euler (0, 0, 270); } else { // Direction I want to move moveVect = new Vector2 (0, vertMove); if (canIMoveInDirection (moveVect)) { // Position Pac-Man at middle of the lane transform.position = new Vector2 ((int)transform.position.x + .5f, (int)transform.position.y + .5f); // Move up rb.velocity = moveVect * speed; // Sets facing direction to default transform.localScale = new Vector2 (1, 1); // Rotate facing up transform.localRotation = Quaternion.Euler (0, 0, 270); } } } else if (Input.GetKeyDown ("s")){ if (localVelocity.y < 0) { // Direction I want to move moveVect = new Vector2 (0, vertMove); // Position Pac-Man at middle of the lane transform.position = new Vector2 ((int)transform.position.x + .5f, (int)transform.position.y + .5f); // Changes the direction to left rb.velocity = moveVect * speed; // Faces Pacman left transform.localScale = new Vector2 (1, 1); // Sets rotation to default transform.localRotation = Quaternion.Euler (0, 0, 90); } else { // Direction I want to move moveVect = new Vector2 (0, vertMove); if (canIMoveInDirection (moveVect)) { // Position Pac-Man at middle of the lane transform.position = new Vector2 ((int)transform.position.x + .5f, (int)transform.position.y + .5f); // Move Down rb.velocity = moveVect * speed; // Sets facing direction to default transform.localScale = new Vector2 (1, 1); // Rotate facing down transform.localRotation = Quaternion.Euler (0, 0, 90); } } } // Will pause and unpause Pac-Man animation // depending on if Pac-Man is at a wall or not UpdateEatingAnimation(); } // Find out if Pac-man is on a TurningPoint bool canIMoveInDirection(Vector2 dir){ // Pac-Man position Vector2 pos = transform.position; // Used to find if there a Point in the array or null Transform point = GameObject.Find ("GBGrid").GetComponent<Gameboard> ().gBPoints [(int)pos.x, (int)pos.y]; // Did I find a Point here? if (point != null) { // Get Points associated GameObject GameObject pointGO = point.gameObject; // Get vectToNextPoint array attached to the Point Vector2[] vectToNextPoint = pointGO.GetComponent<TurningPoint> ().vectToNextPoint; // Cycle through the attached vectToNextPoint array foreach (Vector2 vect in vectToNextPoint) { if (vect == dir) { return true; } } } return false; } // Check if Pac-Man hit a wall // Check Is trigger for Pac-Man Circle Collider // Change all Dots to Dot Tag and Pills to Pill Tag // Add Is Trigger to Points with Circle Collider Radius .1 // Add Tag Point to all Points void OnTriggerEnter2D(Collider2D col){ bool hitAWall = false; // If Pac-Man hit a Point if (col.gameObject.tag == "Point") { // Get vectToNextPoint array attached to the Point Vector2[] vectToNextPoint = col.GetComponent<TurningPoint> ().vectToNextPoint; // Cycle through the attached vectToNextPoint array // to see if there is a Vector2 == Pac-Mans velocity // or the direction Pac-Man wants to travel if (Array.Exists (vectToNextPoint, element => element == rb.velocity.normalized)) { hitAWall = false; } else { hitAWall = true; } // Needed to make Pac-Man stop on the Point when it // hits a wall transform.position = new Vector2 ((int)col.transform.position.x + .5f, (int)col.transform.position.y + .5f); // Stops Pac-Man when it hits a wall if (hitAWall) rb.velocity = Vector2.zero; } // 4. If Pac-Man hit a Dot if (col.gameObject.tag == "Dot") { ADotWasEaten (col); } } // When Pac-Man hits a wall the animation will stop void UpdateEatingAnimation(){ if (rb.velocity == Vector2.zero) { GetComponent<Animator> ().enabled = false; GetComponent<SpriteRenderer> ().sprite = pausedSprite; // 2. Pause Pac-Man eating sound soundManager.PausePacman(); } else { GetComponent<Animator> ().enabled = true; // 2. Unpause Pac-Man eating sound soundManager.UnPausePacman(); } } // 4. Increase the score and delete a dot that Pac-Man eats void ADotWasEaten(Collider2D col){ // Increase the score on the screen IncreaseTextUIScore (); // Destroy the Dot Pac-Man collided with Destroy (col.gameObject); } // 4. Increases the score the the text UI name passed void IncreaseTextUIScore(){ // Find the Score UI component Text textUIComp = GameObject.Find("Score").GetComponent<Text>(); // Get the string stored in it and convert to an int int score = int.Parse(textUIComp.text); // Increment the score score += 10; // Convert the score to a string and update the UI textUIComp.text = score.ToString(); } } |
TurningPoint.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TurningPoint : MonoBehaviour { public TurningPoint[] nextPoints; public Vector2[] vectToNextPoint; // Use this for initialization void Start () { // Initialize the array that will hold the vector to // each nearby TurningPoint vectToNextPoint = new Vector2[nextPoints.Length]; for (int i = 0; i < nextPoints.Length; i++) { // Get each point so we can find its position // in relation to the current TurningPoint TurningPoint nextPoint = nextPoints [i]; // Get the Vector to the next TurningPoint // Returns (1, 0) for right, (0, -1) for down, etc. Vector2 pointVect = nextPoint.transform.localPosition - transform.localPosition; // Store vector to Vector2 array // Without normalized the values wouldn't be 0, 1, or -1 vectToNextPoint[i] = pointVect.normalized; } } } |
Gameboard.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Gameboard : MonoBehaviour { // Create array that holds all TurningPoints public Transform[,] gBPoints = new Transform[27,30]; // References the empty that contains all the points private GameObject turningPoints; // Use this for initialization void Start () { // Get the Empty named TurningPoints turningPoints = GameObject.Find("TurningPoints"); // Cycle through each point in that empty foreach (Transform point in turningPoints.transform) { // Get vector position of point Vector2 pos = point.position; // Put point in the array gBPoints[(int)pos.x, (int)pos.y] = point; } } } |
Leave a Reply