寻路在游戏开发中的重要性,不用多说了。从大型ARPG游戏到小规模体验游戏,都会不同程度的用到寻路功能。

塔防类游戏,战棋类游戏经常用到waypoint(路径)寻路。

下面我们来介绍一下waypoint寻路。

1.Path(路径)的设计。

图中每一个蓝色的Cube表示一个路径点(WayPoint),由7个waypoint构成path;

       

Path.cs代码如下:

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class Path : MonoBehaviour {
  5. public WayPoint[] wayPoints;
  6. public ArrayList points; //存储wayPoints的transform.position属性
  7.  
  8. // Use this for initialization
  9. void Awake()
  10. {
  11. //print("path");
  12. points = new ArrayList();
  13. for (int i = ; i < wayPoints.Length; i++)
  14. {
  15. points.Add(wayPoints[i].transform.position);
  16. }
  17. }
  18.  
  19. //判断是否有下一个路径点
  20. public bool HasNextPoint()
  21. {
  22. //points实例化过,并且存在N个路径点
  23. if (points!=null && points.Count>)
  24. {
  25. return true;
  26. }
  27. return false;
  28. }
  29.  
  30. public Vector3 GetNextPoint()
  31. {
  32. if (points!=null && points.Count>)
  33. {
  34. Vector3 p=(Vector3)points[];
  35. points.RemoveAt();
  36. return p;
  37. }
  38. return Vector3.zero;
  39. }
  40. }

为需要移动的物体或者人物创建WayPointAI

WayPointAI代码如下

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class WayPointAI : MonoBehaviour
  5. {
  6. public Path path;
  7. private Vector3 pos;
  8. private float rotateSpeed = 10f;
  9. private float moveSpeed = 5f;
  10. // Use this for initialization
  11. void Start()
  12. {
  13. if (path!=null && path.HasNextPoint())
  14. {
  15. pos = path.GetNextPoint();
  16. }
  17. }
  18.  
  19. // Update is called once per frame
  20. void Update()
  21. {
  22. bool reached = MoveToTarget(pos);
  23. if (reached==true && path!=null && path.HasNextPoint())
  24. {
  25. pos = path.GetNextPoint();
  26. }
  27. }
  28. bool MoveToTarget(Vector3 point)
  29. {
  30. //只在XZ平面上移动,消除鼠标点击对Y轴的偏移,保持transform.y
  31. Vector3 pointR = new Vector3(point.x, transform.position.y, point.z);
  32. //Quaternion插值 物体朝向目标点平缓转向
  33. Quaternion wantedRot = Quaternion.LookRotation(pointR - transform.position);
  34. transform.rotation = Quaternion.Lerp(transform.rotation, wantedRot, rotateSpeed * Time.deltaTime);
  35. //使用插值当物体到达目标点以后,会有抖动现象,在point处消除抖动
  36. float distance = Vector3.Distance(pointR, transform.position);
  37. if (distance < 0.05f)
  38. {
  39. return true; //到达point
  40. }
  41. //向目标点移动
  42. Vector3 direction = (pointR - transform.position).normalized;
  43. transform.Translate(direction * moveSpeed * Time.deltaTime, Space.World);
  44. return false;
  45. }
  46.  
  47. }

WayPoint寻路的更多相关文章

  1. A*算法、导航网格、路径点寻路对比(A-Star VS NavMesh VS WayPoint)

    在Unity3d中,我们一般常用的寻路算法:   1.A*算法插件   与贪婪算法不一样,贪婪算法适合动态规划,寻找局部最优解,不保证最优解.A*是静态网格中求解最短路最有效的方法.也是耗时的算法,不 ...

  2. A*寻路算法探究

    A*寻路算法探究 A*算法常用在游戏的寻路,是一种静态网路中求解最短路径的搜索方法,也是解决很多搜索问题的算法.相对于Dijkstra,BFS这些算法在复杂的搜索更有效率.本文在U3D中进行代码的测试 ...

  3. Unity3D寻路导航烘焙

    在初次进行3D(三维)游戏体验中,避免不了对游戏有生疏的情况,因此在游戏中一般会插入新手指导.自动寻路.导航地图等AI人工智能技术到游戏中,方便玩家更快体验,为了玩家的体验更好,Unity3D寻路导航 ...

  4. 一步一步开发Game服务器(五)地图寻路

    目前大多数使用的寻路算法有哪些? 目前市面上大部分游戏的寻路算法是A*,或者B*. A*通常所说的是最优算法也就是寻找最短路径.B*碰撞式算法也就是,也就是不断的去碰撞能走就走,不管是不是绕路.当然以 ...

  5. A星寻路算法介绍

    你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...

  6. 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了

    地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图

  7. A*寻路算法

    对于初学者而言,A*寻路已经是个比较复杂的算法了,为了便于理解,本文降低了A*算法的难度,规定只能横竖(四方向)寻路,而无法直接走对角线,使得整个算法更好理解. 简而言之,A*寻路就是计算从起点经过该 ...

  8. MMORPG大型游戏设计与开发(服务器 游戏场景 聊天管道和寻路器)

    又快到双十一,又是不少同仁们出血的日子,首先希望大家玩的开心.我曾经想要仔细的剖析场景的的每个组件,就像这里的聊天管道与寻路器,但是仔细阅读别人代码的时候才发现元件虽小但是实现并不简单,因为有些东西还 ...

  9. A star 寻路

    大白话说一下几个点: 通俗的来说,其实就是以一个规则来 从A点走到B点. 怎么来判断我们走的格子是一个合适的格子? 就是靠一个规则来计算,这个规则就是估价函数. 估价函数: 常用:曼哈顿算法 F = ...

随机推荐

  1. Dom实例:数据自增、搜索框及跑马灯

    数据自增 功能:当点击add按扭后,div标签中的数据自动+1,实现网页的动态化 <!DOCTYPE html> <html lang="en"> < ...

  2. WebLogic11g-半小时让你的domain集群化

    WebLogic11g-半小时让你的domain集群化 WebLogic11g-负载分发 weblogic proxy.war配置 web.xml <!DOCTYPE web-app PUBLI ...

  3. Android Studio 单元测试

    测试的种类 按岗位划分 黑盒测试:测试逻辑业务 白盒测试:测试逻辑方法 按测试粒度分 方法测试:function test 单元测试:unit test 集成测试:integration test 系 ...

  4. Ruby Numeric

    Numeric |-- Float |-- Integer |-- Fixnum |-- Bignum Numeric的基本结构 整数的差异,一般的数字Fixnum就能够处理,即使超过了Fixnum的 ...

  5. 【jmeter】逻辑控制器

    JMeter中的Logic Controller用于为Test Plan中的节点添加逻辑控制器. JMeter中的Logic Controller分为两类:一类用来控制Test Plan执行过程中节点 ...

  6. HackerRank "Favorite sequence"

    Typical topological sorting problem .. why is it 'difficult'? #include <iostream> #include < ...

  7. golang的连接池例子

    github.com/jolestar/go-commons-pool 测试代码 package main import ( "github.com/jolestar/go-commons- ...

  8. c++的历史-异常

    1.异常出现的目的 在c++语言的设计和演化中,Bjarne Stroustrup说过异常的设计假定如下情况: 基本上是为了处理错误 与函数定义相比,异常处理是很少的 与函数调用相比,异常出现的频率较 ...

  9. 【Linux】之系统工具top

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...

  10. eclipse导入html、js、xml报错的问题

    今天重新安装eclipse,在导入部分html.js.xml文件,报错,解决办法如下: eclipse->window->preferences->Team,点击validation ...