How to Make Video Games 28

Legend of Zelda CloneAs we continue making Zelda, I’ll show you how to make the camera follow Link. We’ll create a script that animates Link smoothly. I’ll show you how to handle collisions between game assets and I’ll demonstrate the usefulness of tags. We’ll also make a Sound Manager we’ll use the play all our sounds and much more.

Like always all of the code follows the video below. Here is a link to the sprite files used.

If you like videos like this consider donating $1, or turn off AdBlocker. Either helps a lot.

[googleplusone]

Code from the Video

Link2.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// Used so I can use Floor
using System;

public class Link2 : MonoBehaviour {

	// Speed Link moves
	public float speed;

	// Used to move Link
	private Rigidbody2D rb;

	// Used to access the function IsValidSpace in Gameboard.cs
	// Gameboard gameBoard;

	// Get reference to the SoundManager for functions
	// SoundManager soundManager;

	// Used to change Link animations
	Animator animator;

	// Makes sure components have been created when the 
	// game starts
	void Awake(){
		// Get Links Rigidbody
		rb = GetComponent<Rigidbody2D> ();

		// Setup Gameboard so I can access functions
		// gameBoard = FindObjectOfType(typeof(Gameboard)) as Gameboard;

		// Get SoundManager reference
		// soundManager = GameObject.Find ("SoundManager").GetComponent<SoundManager> ();

		// Get Animator reference
		animator = GetComponent<Animator>();
	}

	// Used to flip the animations
	bool facingRight = false;
	bool facingLeft = false;

	void FixedUpdate(){

		// Get keyboard input
		float horzMove = Input.GetAxisRaw ("Horizontal");
		float vertMove = Input.GetAxisRaw ("Vertical");

		rb.velocity = new Vector2 (horzMove * speed, vertMove * speed);

		// NEW STUFF 1
		if (Input.GetKey ("w") || Input.GetKey ("w")) {
			if (Input.GetKey ("s")) {

				animator.Play ("WalkDown");

			}

			if (Input.GetKey ("w")) {

				animator.Play ("WalkUp");

			}
			
		// NEW STUFF 1
		} else {

			if (Input.GetKey ("d")) {

				animator.Play ("WalkRight");

				// Flips the animation to the right
				if (facingLeft) {
					facingRight = true;
					facingLeft = false;
					animator.transform.Rotate (0, 180, 0);
				} else if (!facingLeft) {
					facingRight = true;
				}

			}

			if (Input.GetKey ("a")) {

				animator.Play ("WalkRight");

				// Flips the animation to the left
				if (facingRight) {
					facingLeft = true;
					facingRight = false;
					animator.transform.Rotate (0, 180, 0);
				} else if (!facingRight) {
					facingLeft = true;
				}

			}
		}

		// Switches back to the Idle position if a key is released
		if (Input.GetKeyUp ("s")) {

			animator.Play ("Idle");

			// When stopped Link will move back into a valid position
			float centerX = (float)Math.Round(Convert.ToDouble(transform.position.x));
			float centerY = (float)Math.Round(Convert.ToDouble(transform.position.y));

			transform.position = new Vector2(centerX, centerY);

		}

	}

	// NEW 
	void Update(){

		if (Input.GetKey (KeyCode.Space)) {

			animator.SetTrigger ("AttackRight");

			Debug.Log ("HELLO");

		}


	}
	// END OF NEW

}

SoundManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SoundManager : MonoBehaviour {

	// 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

	// Holds the single instance of the SoundManager that 
	// you can access from any script
	public static SoundManager Instance = null;

	// Sound clips for Link


	// Refers to the audio source added to the SoundManager
	// to play sound effects
	private AudioSource soundEffectAudio;

	// 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);
		}

		AudioSource theSource = GetComponent<AudioSource> ();
		soundEffectAudio = theSource;
	}

	// Other GameObjects can call this to play sounds
	public void PlayOneShot(AudioClip clip) {
		soundEffectAudio.PlayOneShot(clip);
	}
}

CameraMove.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMove : MonoBehaviour {

	// Put Link here to track his movement
	public Transform cameraTarget;

	// How quickly the camera moves towards Link
	public float cameraSpeed;

	// Min and max X and Y movements
	public float minX;
	public float minY;
	public float maxX;
	public float maxY;

	// Update used when dealing with Rigid Bodies
	void FixedUpdate(){

		// Make sure the camera has a target
		if (cameraTarget != null) {

			// Lerp smoothes movement from the starting position
			// to the targets position 
			var newPos = Vector2.Lerp (transform.position,
				cameraTarget.position,
				Time.deltaTime * cameraSpeed);

			// Define the cameras new postion
			var vect3 = new Vector3 (newPos.x, newPos.y, -10f);

			// Clamp gets the cameras x position and clamps
			// it between the min and max value
			var clampX = Mathf.Clamp (vect3.x, minX, maxX);
			var clampY = Mathf.Clamp (vect3.y, minY, maxY);

			// Move the camera
			transform.position = new Vector3(clampX, clampY, -10f);
		}
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *