版权申明:

  • 本文原创首发于以下网站:
  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. 【转】jsp 页面 按回车键 触发事件

    转载: https://blog.csdn.net/ludongshun2016/article/details/59536779. 第一种: <script type="text/J ...

  2. 8.5 NOIP模拟测试13 矩阵游戏+跳房子+优美序列

    T1矩阵游戏 数学题.首先这一列这一行先乘还是后乘对最后答案没有影响.a[i][j]表示矩阵中原始的值,h[i]表示i行的累乘,l[i]表示i列的累乘.易得ans=Σa[i][j]*h[i]*l[i] ...

  3. [LeetCode] 239. Sliding Window Maximum 滑动窗口最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  4. Spring Boot 知识笔记(定时任务与异步)

    一.定时任务 1.启动类里面增加注入 @SpringBootApplication //@SpringBootApplication = @Configuration+@EnableAutoConfi ...

  5. CodeChef MAXDTREE(DP套DP)

    题意 ​ 链接:https://www.codechef.com/problems/MAXDTREE ​ 给定一个 \(n\) 个节点的树,其中 \(1\) 为根节点,每个点有点权,我们定义" ...

  6. iOS依赖库管理工具之CocoaPods

    CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具.利用 CocoaPods,可以定义自己的依赖关系库 (称作 pods),并且随着时间的变化,在整个开发环境中对第 ...

  7. Knative Serving 进阶: Knative Serving SDK 开发实践

    作者 | 阿里云智能事业群技术专家 牛秋霖(冬岛) 导读:通过前面的一系列文章你已经知道如何基于 kubectl 来操作 Knative 的各种资源.但是如果想要在项目中集成 Knative 仅仅使用 ...

  8. Shell脚本——添加和删除用户

    写一个脚本admin_user.sh,其用法格式为: admin_user.sh --add USERLIST --del USERLIST -v|--verbose -h|--help 其中, -h ...

  9. Ajax 跨域请求,Chrome 无法显示 Set-Cookie

    在使用 Ajax 进行跨域请求时,前后端均已设置 withCredentials = true,但 Chrome 前端响应无法显示 Set-Cookie. 一开始以为 Cookie 并没有设置成功,但 ...

  10. 使用索引别名和Rollover滚动创建索引

    使用索引别名和Rollover滚动创建索引 在ElasticSearch6.3.2 集群做节点冷(warm) 热(hot) 分离中,实现了ElasticSearch集群节点的冷热分离,新创建的索引只允 ...