PacMan 03——追踪玩家

Posted raymondking123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PacMan 03——追踪玩家相关的知识,希望对你有一定的参考价值。

版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号:umaketop
  • 您可以自由转载,但必须加入完整的版权声明

追踪玩家

利用A*算法吧豆子作为可行走路径,所以要找到全场存在的豆子

把豆子放入:List组进传入A*算法

寻找豆子

这是一个寻找方法

int a=0;
        ob = new List();
        PacdotController[] gameObjects;
        gameObjects=GameObject.FindObjectsOfType();
        for (int i=0;i<gameObjects.Length;i++)
        
            a++;
            ob.Add(gameObjects[i]);
            Debug.Log("加入数组完成"+a);
        

搜寻多个物体
但是上面的方法不靠谱,需要定义一下执行顺序
1.被隐藏的物体标签将会被更改
更改标签的代码如下:
csharp private void OnTriggerStay2D(Collider2D collision) if (collision.gameObject.tag == "map") map.instance.bensbehaveto = true; this.gameObject.tag = "ass"; gameObject.SetActive(false);
2.把标签没有更改的加入数组,作为可行走路径
3.由于是自动生成的豆子,所以需要自己定义的mapController进行协助
生成完豆子之后会更改mapcontroller脚本bool值
隐藏掉多余的豆子之后更改一个mapcontroller脚本的bool值
当所有bool值更改完成执行通过标签检索整个场景,通过标签吧符合的加入到数组中
代码如下:

public void FindBens()
    
        if (map.instance.isbeigover==true&amp;&amp;map.instance.bensbehaveto==true)
                 
            GameObject[] gameObjects;
            gameObjects = GameObject.FindGameObjectsWithTag("pac");
            for (int i = 0; i &lt; gameObjects.Length; i++)
            
                if (gameObjects[i].gameObject.tag==&quot;pac&quot;)
                
                    Vector2 d = (Vector2)gameObjects[i].GetComponent().position + new Vector2(12.5f, 14f);
                    ob.Add(d);
                    Debug.Log(&quot;加入数组完成&quot;);
                
            
            map.instance.bensbehaveto = false;
            FindMoster = new AStar2(ob,false, 29, 26);
           
    

4.但又出现了一个问题,在A算法中会出现数组溢出,,要对导入的坐标进行转换,是坐标对应
5.将这个坐标数组传入list
6.通过A
调用
///声明障碍图:在A*算法中包含储存障碍的内存,把搜寻到的路点加进去,设为能走的路点

判断是否有玩家

利用碰撞器获得玩家坐标

代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class VisibleRange : MonoBehaviour  
    private void OnTriggerStay2D(Collider2D collision)
    
        if (collision.gameObject.tag=="Player")
        
            Debug.Log("找到玩家");
            Debug.Log( this.transform.parent.GetComponent().CanSeePlayer);
            this.transform.parent.GetComponent().CanSeePlayer = true;
            this.transform.parent.GetComponent().findPlayerPositionStart =(Vector2) collision.gameObject.transform.position;

        
    

    private void OnTriggerExit2D(Collider2D collision)
    
        this.transform.parent.GetComponent().CanSeePlayer = false;
    



A算法生成追踪玩家最短路径
生成寻路利用list每帧计算移动
应为和A
算法坐标问题,需要换算
if 中的Bool值表示的是是否找到玩家,出发转态是否完成

if (c.CanSeePlayer==true&amp;&amp;c.isGoStart==true)
                
                    List paths;
                    c.findPlayerPositionStart += new Vector2(12.5f,14f);
                    Vector2 Ss = dir;
                    Ss += new Vector2(12.5f,14f);
                    paths=c.FindMoster.Find(Ss,c.findPlayerPositionStart);//调用A*的find方法,能算出最短距离
                    for (int i=0;i&lt;paths.Count;i++)
                    
                        paths[i] -= new Vector2(12.5f,14f);
                    
                    c.machine.Init(c,new WayPointSetect(paths));//运行A*计算出的坐标,利用路点状态
                    return ;
                

状态的切换

当 bool值CanSeePlayer等于false是会跳过上述代码,进入巡逻状态

以上是关于PacMan 03——追踪玩家的主要内容,如果未能解决你的问题,请参考以下文章

Pacman java 移动问题

C系列Unity3D | 花一天时间做个经典小游戏Pacman

archlinux pacman 常用选项

修复 pacman 中的“未找到目标”(可能是 pacman.conf 的镜像列表

yaourt: a pacman frontend(pacman前端,翻译)

pacman命令用法