版权申明:

  • 本文原创首发于以下网站:
  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. [LeetCode] 29. Divide Two Integers 两数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  2. RDS for MySQL权限问题(错误代码:1227,1725)

    https://help.aliyun.com/knowledge_detail/41701.html 错误信息   [Err] 1227 - Access denied; you need (at ...

  3. .NET Core:路由

    (1)模板路由 在Startup的Configure方法中配置: app.UseMvc(routes =>{ routes.MapRoute( name: "areas", ...

  4. QuantLib 金融计算——收益率曲线之构建曲线(3)

    目录 QuantLib 金融计算--收益率曲线之构建曲线(3) 概述 估算期限结构的步骤 读取样本券数据 一些基本配置 配置 *Helper 对象 配置期限结构 估算期限结构 汇总结果 当前实现存在的 ...

  5. Vue双向绑定原理(我尽量写的。简洁)

    先问自己两个问题: 1.app.message修改数据的时候,Vue内部是如何监听message数据发生改变的 使用Object.defineProperty ->监听对象属性的改变 2.当数据 ...

  6. 固定定位导致$(window).scrollTop();获取滚动后到顶部距离总是为0

    如下移动端索引列表页面(点击某元素后弹出的页面)    我想用 $(window).scrollTop(); 获取页面滚动后距离顶部的距离,但获取到的值总是0 期间查了很久,但都无疾而终,后来看到一篇 ...

  7. springboot 获取到的inputStream为空的问题

    springboot在接收http请求的时候读取的request的inputStream,造成我们想自己读取inputStream的时候发现inputStream已经无法读取了. 为了读取inputS ...

  8. git自动提交脚本

    每次在linux都要重新一遍一遍敲着这些重复的代码,我想着能够优化一下,做个一键脚本,减少重复劳动. #!/bin/bash git status read -r -p "是否继续提交? [ ...

  9. Sitecore 营销分类

    分类法是一种分层结构,可用于识别和组织信息.在Sitecore体验平台中,您可以使用分类法对营销活动进行分类,例如广告,目标和活动.您可以在市场营销控制面板中将分类标签应用于这些项目. 营销分类的四种 ...

  10. sql server获取格式化的当前日期

    在SQL Server中获取格式化成yyyy-MM-dd的当前日期: ), ); -- 2019-06-17 首先我们知道getdate()函数是用来获取当前日期的,它返回的类型是datetime类型 ...