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值更改完成执行通过标签检索整个场景,通过标签吧符合的加入到数组中
代码如下:


```csharp
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是会跳过上述代码,进入巡逻状态

posted @ 2019-09-26 09:05  优梦创客  阅读(1278)  评论(0编辑  收藏  举报