PacMan 03——追踪玩家
版权申明:
- 本文原创首发于以下网站:
- 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
- 优梦创客的官方博客:https://91make.top
- 优梦创客的游戏讲堂:https://91make.ke.qq.com
- 『优梦创客』的微信公众号: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&&map.instance.bensbehaveto==true)
        {
            GameObject[] gameObjects;
            gameObjects = GameObject.FindGameObjectsWithTag("pac");
            for (int i = 0; i < gameObjects.Length; i++)
            {
                if (gameObjects[i].gameObject.tag=="pac")
                {
                    Vector2 d = (Vector2)gameObjects[i].GetComponent().position + new Vector2(12.5f, 14f);
                    ob.Add(d);
                    Debug.Log("加入数组完成");
                }
            }
            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&&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<paths.Count;i++)
                    {
                        paths[i] -= new Vector2(12.5f,14f);
                    }
                    c.machine.Init(c,new WayPointSetect(paths));//运行A*计算出的坐标,利用路点状态
                    return ;
                }
状态的切换
当 bool值CanSeePlayer等于false是会跳过上述代码,进入巡逻状态
PacMan 03——追踪玩家的更多相关文章
- 使用HTML5开发Kinect体感游戏
		一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ... 
- 全景VR视频游戏外包公司:技术分享使用U3D+CB制作VR游戏
		随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左 ... 
- 用canvas制作酷炫射击游戏--part3
		今天介绍下 游戏中的sprite模块,也就是构建玩家及怪物的模块.有了这个模块,就可以在咱们的游戏里加入人物了. 想必用过css的朋友都知道sprite,一种将需要加载的图片拼接在一张图里以减少请求的 ... 
- 【CEDEC 2015】【夏日课堂】制作事宜技术篇,新手职员挑战VR Demo开发的真相
		日文原文地址 http://www.4gamer.net/games/277/G027751/20150829002/ PS:CEDEC 2015的PPT有些要到10月才有下载,目前的都是记者照片修图 ... 
- Unity 二战中加飞机
		一个简短的引论: 谢意: 本申请中使用<Unity3D\2D移动游戏开发>提供资源.著作权属于作者.感谢作者.基于原始时本申请的二次开发. 要素: 1.增加2s cd的机身旋转,旋转时保持 ... 
- Swift 学习笔记 (二)
		原创:转载请注明出处 41.闭包表达式语法(Closure Expression Syntax) 闭包表达式语法有如下一般形式: { (parameters) -> returnType in ... 
- 简单使用Unity导航系统(小白之路)
		1.介绍 NavMesh:是一种根据场景中几何图像创建出来的3D网格.它会使导航和寻路变得很容易. 简单来说,NavMesh是一种我们在游戏世界中,可以让游戏角色在其表面行走并且导航的平面. 2.注意 ... 
- swift 学习- 17 -- 析构器
		// 析构器 只适用与 类类型, 当一个类的实例被释放之前, 析构器会被立即调用, 析构器用关键字 deinit 来标示, 类似于构造器要用 init 来标示 // 析构过程原理 // Swift 会 ... 
- [UE4]增加机器人
		一.新增蓝图继承自Shooter名为AIShooter.玩家角色也是继承自Shooter. 二.使用AIMoveTo追踪玩家.玩家控制的角色调用这个方法没反应. 三.关卡中添加组件NavMeshBou ... 
随机推荐
- 1.Vue前端核心分析
			1.Vue SoC:关注点分离原则 网络通信:axios 页面跳转:vue-router 页面管理:vuex Vue-UI:ICE.ElementUI 集大成者:MVVM+虚拟DOM 2.MVVM 异 ... 
- ASP.NET开发实战——(一)开篇-用VS创建一个ASP.NET Web程序
			本文是本系列文章第一篇,主要通过建立一个默认ASP.NET MVC项目来引出与ASP.NET MVC相关的功能,由于ASP.NET MVC一个简单的模板就具备了数据库操作.身份验证.输入数据校 ... 
- stm32环境搭建
			软件下载:https://pan.baidu.com/s/1rat9Vnm 第一部分:软件安装 1.点击安装mdk514.exe,一路next就可以了 2.使用管理员身份打开软件,点击File,进到l ... 
- 戴尔灵越14燃5488安装LTSC2019
			戴尔笔记本应该改成ahci模式之后再进行分区和重装系统操作,否则很难折腾的 戴尔灵越14燃5488不能安装LTSB2016,因为显卡驱动不支持,安装LTSC2019可以,亲测. 这款笔本似乎NVME ... 
- [LeetCode] 731. My Calendar II 我的日历之二
			Implement a MyCalendarTwo class to store your events. A new event can be added if adding the event w ... 
- 【贪心】umi的函数
			原题传送门 思路 这道题乍一看很难,然而实际在草纸上一模拟,结果就出来了. 分析:这道题实际上要么无解,要么有无数个解,因而题目只要求输出了一个解(明白这点题目就做出来一半了). 题中,规定所求z满足 ... 
- 2.Python学习之路
			这里主要更新Python每个部分知识点的详细的目录...(知识点目录) Python基础 一.计算机基础 二.Python基础 三.函数 四.常用模块 五.模块和包 六.面向对象 Python进阶 七 ... 
- Docker笔记:常用服务安装——Nginx、MySql、Redis(转载)
			转载地址:https://www.cnblogs.com/spec-dog/p/11320513.html 开发中经常需要安装一些常用的服务软件,如Nginx.MySql.Redis等,如果按照普通的 ... 
- Nginx配置max_fails fail_timeout
			目的: 通过配置max_fails.fail_timeout来达到当一台服务器访问出现非200时可以跳转到另一台服务器 操作: 配置nginx.conf文件 具体配置如下 upstream Site ... 
- CentOS7 Zookeeper 安装
			集群部署 192.168.38.6 zk01192.168.38.7 zk02192.168.38.8 zk03 安装zookeeper,必须安装jdk. 1.下载 $ cd /usr/loca ... 
