【问题标题】:Make pacman move randomly让吃豆人随机移动
【发布时间】:2021-10-13 16:25:14
【问题描述】:

我正在使用 noobtuts 的教程创建一个吃豆人游戏。 https://noobtuts.com/unity/2d-pacman-game 但是我想让 pacman 能够自行移动。我的想法是让它选择一个随机的方向移动,如果它是一个有效的移动,它就会朝那个方向移动。我该怎么做?感谢任何答案!

这是 noobtuts 的代码,它通过用户输入移动 pacman。

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

【问题讨论】:

  • 使用Random 类并将对用户输入的调用替换为对随机调用的调用。
  • 我尝试过这样做(从逻辑上讲它应该可以工作),但是 pacman 不会移动。是不是我对 Vector2 的工作原理有什么误解?
  • 您希望您的 Pacman 何时改变方向?如果你在每次更新时都这样做,它可能只会导致吃豆人每帧快速切换方向而无处可去。只在他到达十字路口时改变方向会更有意义。
  • @BenM 我没想到这会让吃豆人卡住...也许应该先选择一个随机的有效方向,然后当方向不再有效时,方向会改变?
  • @Naomikho - 这可能行得通,但它可能不像你想要的那样随机,因为他永远不会在 4 路交叉口(或他可以的 3 路交叉口)改变方向直接往前走)。但它可能很容易实现,所以在做任何更复杂的事情之前,确保你走在正确的轨道上是值得的。

标签: c# unity3d pacman


【解决方案1】:

到目前为止,我设法让它工作,但我相信还有很多可以改进的地方。如果您有任何解决方案,请提供任何意见!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2013-07-22
    • 2022-08-15
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多