I am creating a pacman game using noobtuts' tutorial. https://noobtuts.com/unity/2d-pacman-game However I want to make pacman to be able move on its own. My idea is to make it choose a random direction to move, and it will head into that direction if it is a valid move. How should I do it? Appreciate any answers!
This is noobtuts' code that moves pacman with user input.
Vector2 dest = Vector2.zero;
void Start()
{
dest = transform.position;
disabled = false;
}
void FixedUpdate()
{
// Move closer to Destination
Vector2 p = Vector2.MoveTowards(transform.position, dest, speed);
GetComponent<Rigidbody2D>().MovePosition(p);
// Check for Input if not moving
if ((Vector2)transform.position == dest && !disabled)
{
if (DirectionEmulator.direction == "up" && valid(Vector2.up))
dest = (Vector2)transform.position + Vector2.up;
if (DirectionEmulator.direction == "right" && valid(Vector2.right))
dest = (Vector2)transform.position + Vector2.right;
if (DirectionEmulator.direction == "down" && valid(-Vector2.up))
dest = (Vector2)transform.position - Vector2.up;
if (DirectionEmulator.direction == "left" && valid(-Vector2.right))
dest = (Vector2)transform.position - Vector2.right;
}
// Animation Parameters
Vector2 dir = dest - (Vector2)transform.position;
GetComponent<Animator>().SetFloat("DirX", dir.x);
GetComponent<Animator>().SetFloat("DirY", dir.y);
}
bool valid(Vector2 dir)
{
// Cast Line from 'next to Pac-Man' to 'Pac-Man'
Vector2 pos = transform.position;
RaycastHit2D hit = Physics2D.Linecast(pos + dir, pos);
return (hit.collider == GetComponent<Collider2D>());
}
I managed to make it work as of now, but I believe much more can be improved. Please provide any input if you have any solutions!
private string move;
Vector2 dest = Vector2.zero;
void Start()
{
dest = transform.position;
disabled = false;
move = "right";
}
void FixedUpdate() //use this to decide movement
{
// Move closer to Destination
Vector2 p = Vector2.MoveTowards(transform.position, dest, speed);
GetComponent<Rigidbody2D>().MovePosition(p);
// determine next destination
if ((Vector2)transform.position == dest && !disabled)
{
//check valid direction
if (move == "up" && valid(Vector2.up))
{
dest = (Vector2)transform.position + Vector2.up;
}
if (move == "right" && valid(Vector2.right))
{
dest = (Vector2)transform.position + Vector2.right;
}
if (move == "down" && valid(-Vector2.up))
{
dest = (Vector2)transform.position - Vector2.up;
}
if (move == "left" && valid(-Vector2.right))
{
dest = (Vector2)transform.position - Vector2.right;
}
//if not valid, change direction
// choose random valid direction
System.Random rnd = new System.Random();
int rand = rnd.Next(1, 4);
if (rand == 1 && valid(Vector2.up))
{
move = "up";
}
else if (rand == 2 && valid(Vector2.right))
{
move = "right";
}
else if (rand == 3 && valid(-Vector2.up))
{
move = "down";
}
else if (rand == 4 && valid(-Vector2.right))
{
move = "left";
}
}
// Animation Parameters
Vector2 dir = dest - (Vector2)transform.position;
GetComponent<Animator>().SetFloat("DirX", dir.x);
GetComponent<Animator>().SetFloat("DirY", dir.y);
}
bool valid(Vector2 dir)
{
// Cast Line from 'next to Pac-Man' to 'Pac-Man'
Vector2 pos = transform.position;
RaycastHit2D hit = Physics2D.Linecast(pos + dir, pos);
return (hit.collider == GetComponent<Collider2D>());
}