经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
PacMan 03——追踪玩家
来源:cnblogs  作者:优梦创客  时间:2019/9/26 10:31:13  对本文有异议

版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号:umaketop
  • 您可以自由转载,但必须加入完整的版权声明

追踪玩家

利用A*算法吧豆子作为可行走路径,所以要找到全场存在的豆子

把豆子放入:List组进传入A*算法

寻找豆子

这是一个寻找方法

  1. int a=0;
  2. ob = new List();
  3. PacdotController[] gameObjects;
  4. gameObjects=GameObject.FindObjectsOfType();
  5. for (int i=0;i<gameObjects.Length;i++)
  6. {
  7. a++;
  8. ob.Add(gameObjects[i]);
  9. Debug.Log("加入数组完成"+a);
  10. }

搜寻多个物体
但是上面的方法不靠谱,需要定义一下执行顺序
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值更改完成执行通过标签检索整个场景,通过标签吧符合的加入到数组中
代码如下:

  1. public void FindBens()
  2. {
  3. if (map.instance.isbeigover==true&amp;&amp;map.instance.bensbehaveto==true)
  4. {
  5. GameObject[] gameObjects;
  6. gameObjects = GameObject.FindGameObjectsWithTag("pac");
  7. for (int i = 0; i &lt; gameObjects.Length; i++)
  8. {
  9. if (gameObjects[i].gameObject.tag==&quot;pac&quot;)
  10. {
  11. Vector2 d = (Vector2)gameObjects[i].GetComponent().position + new Vector2(12.5f, 14f);
  12. ob.Add(d);
  13. Debug.Log(&quot;加入数组完成&quot;);
  14. }
  15. }
  16. map.instance.bensbehaveto = false;
  17. FindMoster = new AStar2(ob,false, 29, 26);
  18. }
  19. }

4.但又出现了一个问题,在A算法中会出现数组溢出,,要对导入的坐标进行转换,是坐标对应
5.将这个坐标数组传入list
6.通过A
调用
///声明障碍图:在A*算法中包含储存障碍的内存,把搜寻到的路点加进去,设为能走的路点

判断是否有玩家

利用碰撞器获得玩家坐标

代码如下

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class VisibleRange : MonoBehaviour {
  5. private void OnTriggerStay2D(Collider2D collision)
  6. {
  7. if (collision.gameObject.tag=="Player")
  8. {
  9. Debug.Log("找到玩家");
  10. Debug.Log( this.transform.parent.GetComponent().CanSeePlayer);
  11. this.transform.parent.GetComponent().CanSeePlayer = true;
  12. this.transform.parent.GetComponent().findPlayerPositionStart =(Vector2) collision.gameObject.transform.position;
  13. }
  14. }
  15. private void OnTriggerExit2D(Collider2D collision)
  16. {
  17. this.transform.parent.GetComponent().CanSeePlayer = false;
  18. }
  19. }

A算法生成追踪玩家最短路径
生成寻路利用list每帧计算移动
应为和A
算法坐标问题,需要换算
if 中的Bool值表示的是是否找到玩家,出发转态是否完成

  1. if (c.CanSeePlayer==true&amp;&amp;c.isGoStart==true)
  2. {
  3. List paths;
  4. c.findPlayerPositionStart += new Vector2(12.5f,14f);
  5. Vector2 Ss = dir;
  6. Ss += new Vector2(12.5f,14f);
  7. paths=c.FindMoster.Find(Ss,c.findPlayerPositionStart);//调用A*的find方法,能算出最短距离
  8. for (int i=0;i&lt;paths.Count;i++)
  9. {
  10. paths[i] -= new Vector2(12.5f,14f);
  11. }
  12. c.machine.Init(c,new WayPointSetect(paths));//运行A*计算出的坐标,利用路点状态
  13. return ;
  14. }

状态的切换

当 bool值CanSeePlayer等于false是会跳过上述代码,进入巡逻状态

原文链接:http://www.cnblogs.com/raymondking123/p/11588799.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号