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 ...
随机推荐
- 【转】jsp 页面 按回车键 触发事件
转载: https://blog.csdn.net/ludongshun2016/article/details/59536779. 第一种: <script type="text/J ...
- 8.5 NOIP模拟测试13 矩阵游戏+跳房子+优美序列
T1矩阵游戏 数学题.首先这一列这一行先乘还是后乘对最后答案没有影响.a[i][j]表示矩阵中原始的值,h[i]表示i行的累乘,l[i]表示i列的累乘.易得ans=Σa[i][j]*h[i]*l[i] ...
- [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 ...
- Spring Boot 知识笔记(定时任务与异步)
一.定时任务 1.启动类里面增加注入 @SpringBootApplication //@SpringBootApplication = @Configuration+@EnableAutoConfi ...
- CodeChef MAXDTREE(DP套DP)
题意 链接:https://www.codechef.com/problems/MAXDTREE 给定一个 \(n\) 个节点的树,其中 \(1\) 为根节点,每个点有点权,我们定义" ...
- iOS依赖库管理工具之CocoaPods
CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具.利用 CocoaPods,可以定义自己的依赖关系库 (称作 pods),并且随着时间的变化,在整个开发环境中对第 ...
- Knative Serving 进阶: Knative Serving SDK 开发实践
作者 | 阿里云智能事业群技术专家 牛秋霖(冬岛) 导读:通过前面的一系列文章你已经知道如何基于 kubectl 来操作 Knative 的各种资源.但是如果想要在项目中集成 Knative 仅仅使用 ...
- Shell脚本——添加和删除用户
写一个脚本admin_user.sh,其用法格式为: admin_user.sh --add USERLIST --del USERLIST -v|--verbose -h|--help 其中, -h ...
- Ajax 跨域请求,Chrome 无法显示 Set-Cookie
在使用 Ajax 进行跨域请求时,前后端均已设置 withCredentials = true,但 Chrome 前端响应无法显示 Set-Cookie. 一开始以为 Cookie 并没有设置成功,但 ...
- 使用索引别名和Rollover滚动创建索引
使用索引别名和Rollover滚动创建索引 在ElasticSearch6.3.2 集群做节点冷(warm) 热(hot) 分离中,实现了ElasticSearch集群节点的冷热分离,新创建的索引只允 ...