PacMan 03——追踪玩家
Posted raymondking123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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值更改完成执行通过标签检索整个场景,通过标签吧符合的加入到数组中
代码如下:
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——追踪玩家的主要内容,如果未能解决你的问题,请参考以下文章
C系列Unity3D | 花一天时间做个经典小游戏Pacman
修复 pacman 中的“未找到目标”(可能是 pacman.conf 的镜像列表