In the next 2 videos I’ll cover how to lock Ms. Pac-Man perfectly inside of the maze as she moves around. We will do this not through colliders, but instead by using pivot points, which will make the movement very clean and also resource light. We’ll cover how to Setup Pivot Points, Putting GameObjects in an Array, Selecting GameObjects in Code, Cycling through GameObjects in Empties, Moving Ms. Pac-Man, Animating Ms. Pac-Man and much more.
The images are here and the code follows the video below.
If you like videos like this, consider donating $1 on Patreon, or simply turn off AdBlocker.
[googleplusone]
Gameboard.cs
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;
}
}
}
TurningPoint.cs
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;
}
}
}
MsPacman.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Used to find out if Pac-Man hits a wall
using System;
public class MsPacman : MonoBehaviour {
public float speed = 0.4f;
// Used to move Ms. Pacman
private Rigidbody2D rb;
// 5. Sprite used when Pac-Man is paused
public Sprite pausedSprite;
// 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;
}
void FixedUpdate(){
float horzMove = Input.GetAxisRaw ("Horizontal");
float vertMove = Input.GetAxisRaw ("Vertical");
// Move Left
if (Input.GetKeyDown ("a")) {
// Changes the direction to left
rb.velocity = new Vector2 (horzMove, 0) * 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")) {
// Changes the direction to right
rb.velocity = new Vector2 (horzMove, 0) * 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")){
// Move up
rb.velocity = new Vector2 (0, vertMove) * 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")){
// Move Down
rb.velocity = new Vector2 (0, vertMove) * speed;
// Sets facing direction to default
transform.localScale = new Vector2 (1, 1);
// Rotate facing down
transform.localRotation = Quaternion.Euler (0, 0, 90);
}
}
}