如何基于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
相关产品推荐
相关产品推荐

