Search code examples
c#unity-game-enginepacman

Make pacman move randomly


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


Solution

  • 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>());
        }