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

  • 相关阅读:
    常量,基本运算符,if判断,while循环
    python解释器的垃圾回收机制,小整数池,变量的三个特性,is与==,与用户交互,数据类型的基本使用,基本运算符
    编程语言的分类,python解释器多版本共存.执行python的两种方式,变量,用户与程序交互
    编程简介
    bootstrap 无限极菜单
    JQuery lhgdialog使用
    mysql 不是主键不能删除的保护问题解决办法?
    遍历所有的选中的radio的个数和值
    MySQL 的 RowNum 实现
    Ibatis 测试出SQL
  • 原文地址:https://www.cnblogs.com/raymondking123/p/11588799.html
Copyright © 2020-2023  润新知