You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于noobtuts Unity 2D吃豆人教程实现Pacman随机自主移动

实现Pacman自主随机移动的代码修改方案

修改核心逻辑为替换原有用户输入判断部分,改为随机方向校验逻辑,具体实现如下:


最终修改后代码

Vector2 dest = Vector2.zero;
public bool disabled = false;
public float speed;
// 预定义四个可选移动方向
private Vector2[] directions = new Vector2[] { Vector2.up, Vector2.right, Vector2.down, Vector2.left };

void Start()
{
    dest = transform.position;
    disabled = false;
}

void FixedUpdate()
{
    // 原有向目标点移动的逻辑保留
    Vector2 p = Vector2.MoveTowards(transform.position, dest, speed);
    GetComponent<Rigidbody2D>().MovePosition(p);

    // 到达目标点且移动未禁用时,随机选合法方向移动
    if ((Vector2)transform.position == dest && !disabled)
    {
        // 打乱方向数组的顺序,实现随机选方向效果
        ShuffleArray(directions);
        // 遍历所有方向,找到第一个可通行的方向就移动
        foreach (var dir in directions)
        {
            if (valid(dir))
            {
                dest = (Vector2)transform.position + dir;
                break;
            }
        }
    }

    // 原有动画参数赋值逻辑保留
    Vector2 dirAnim = dest - (Vector2)transform.position;
    GetComponent<Animator>().SetFloat("DirX", dirAnim.x);
    GetComponent<Animator>().SetFloat("DirY", dirAnim.y);
}

bool valid(Vector2 dir)
{
    // 原有方向合法性校验逻辑保留
    Vector2 pos = transform.position;
    RaycastHit2D hit = Physics2D.Linecast(pos + dir, pos);
    return (hit.collider == GetComponent<Collider2D>());
}

// 数组随机打乱的辅助方法
private void ShuffleArray<T>(T[] array)
{
    for (int i = array.Length - 1; i > 0; i--)
    {
        int randomIndex = UnityEngine.Random.Range(0, i + 1);
        (array[i], array[randomIndex]) = (array[randomIndex], array[i]);
    }
}

可选优化点

  • 若要避免Pacman频繁回头,可额外记录上一次移动的方向,遍历随机方向时跳过反方向即可
  • 若需要给不同方向设置不同选中概率,可调整随机逻辑,给优先级高的方向更高的命中权重

内容的提问来源于stack exchange,提问作者Naomikho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 07:45:03