版权申明:

  • 本文原创首发于以下网站:
  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是会跳过上述代码,进入巡逻状态

PacMan 03——追踪玩家的更多相关文章

  1. 使用HTML5开发Kinect体感游戏

    一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...

  2. 全景VR视频游戏外包公司:技术分享使用U3D+CB制作VR游戏

    随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左 ...

  3. 用canvas制作酷炫射击游戏--part3

    今天介绍下 游戏中的sprite模块,也就是构建玩家及怪物的模块.有了这个模块,就可以在咱们的游戏里加入人物了. 想必用过css的朋友都知道sprite,一种将需要加载的图片拼接在一张图里以减少请求的 ...

  4. 【CEDEC 2015】【夏日课堂】制作事宜技术篇,新手职员挑战VR Demo开发的真相

    日文原文地址 http://www.4gamer.net/games/277/G027751/20150829002/ PS:CEDEC 2015的PPT有些要到10月才有下载,目前的都是记者照片修图 ...

  5. Unity 二战中加飞机

    一个简短的引论: 谢意: 本申请中使用<Unity3D\2D移动游戏开发>提供资源.著作权属于作者.感谢作者.基于原始时本申请的二次开发. 要素: 1.增加2s cd的机身旋转,旋转时保持 ...

  6. Swift 学习笔记 (二)

    原创:转载请注明出处 41.闭包表达式语法(Closure Expression Syntax) 闭包表达式语法有如下一般形式: { (parameters) -> returnType in ...

  7. 简单使用Unity导航系统(小白之路)

    1.介绍 NavMesh:是一种根据场景中几何图像创建出来的3D网格.它会使导航和寻路变得很容易. 简单来说,NavMesh是一种我们在游戏世界中,可以让游戏角色在其表面行走并且导航的平面. 2.注意 ...

  8. swift 学习- 17 -- 析构器

    // 析构器 只适用与 类类型, 当一个类的实例被释放之前, 析构器会被立即调用, 析构器用关键字 deinit 来标示, 类似于构造器要用 init 来标示 // 析构过程原理 // Swift 会 ...

  9. [UE4]增加机器人

    一.新增蓝图继承自Shooter名为AIShooter.玩家角色也是继承自Shooter. 二.使用AIMoveTo追踪玩家.玩家控制的角色调用这个方法没反应. 三.关卡中添加组件NavMeshBou ...

随机推荐

  1. Flask-Login中装饰器@login_manager.user_loader的作用及原理

    Flask-Login通过装饰器@login_required来检查访问视图函数的用户是否已登录,没有登录时会跳转到login_manager.login_view = 'auth.login'所注册 ...

  2. C++中整型变量的存储大小和范围

    一.代码查看 #include <iostream> #include <climits> using namespace std; int main(void) { cout ...

  3. Linux性能优化实战学习笔记:第七讲

    一.进程的状态 1.命令查看 top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28961 root 20 0 43816 3148 ...

  4. 2018-2019-2 20162329 《网络对抗技术》Exp8: Web基础

    目录 Exp8: Web基础 一. 基础问题回答 1. 什么是表单 2. 浏览器可以解析运行什么语言. 3. WebServer支持哪些动态语言 二. 实验过程 1. Web前端HTML 2..Web ...

  5. snowflake ID生成器

    背景 Snowflake 是 Twitter 内部的一个 ID 生算法, 可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码. 其组成为: 第一个 bit 为未使用的符号位. 第二部 ...

  6. select2的简单使用

    静态下拉列表 修改 type_template.html  引入JS <!-- slect2插件--> <link rel="stylesheet" href=& ...

  7. ElasticSearch如何更新集群的状态

    ElasticSearch如何更新集群的状态 最近发生了很多事情,甚至对自己的技术能力和学习方式产生了怀疑,所以有一段时间没更新文章了,估计以后更新的频率会越来越少,希望有更多的沉淀而不是简单地分享. ...

  8. 【计算机组成原理】中央处理器CPU

    一.CPU的功能和基本结构 1.功能 当用计算机解决某个问题是,我们首先必须为他编写程序,程序是一个指令序列,这个序列明确告诉计算机应该执行什么操作,在什么地方找到用来操作的数据,一旦把程序装入内存器 ...

  9. Docker核心组件的关系

  10. 关于toLocaleString(), toString(), valueOf()方法的使用

    所有对象都是具有toLocalString(), toString(), valueOf()三种方法的,此篇博客主要是讲述其在Array引用类型上的使用. 基本使用 调用valueOf()返回的是数组 ...