WayPoint寻路
寻路在游戏开发中的重要性,不用多说了。从大型ARPG游戏到小规模体验游戏,都会不同程度的用到寻路功能。
塔防类游戏,战棋类游戏经常用到waypoint(路径)寻路。
下面我们来介绍一下waypoint寻路。
1.Path(路径)的设计。
图中每一个蓝色的Cube表示一个路径点(WayPoint),由7个waypoint构成path;
Path.cs代码如下:
- using UnityEngine;
- using System.Collections;
- public class Path : MonoBehaviour {
- public WayPoint[] wayPoints;
- public ArrayList points; //存储wayPoints的transform.position属性
- // Use this for initialization
- void Awake()
- {
- //print("path");
- points = new ArrayList();
- for (int i = ; i < wayPoints.Length; i++)
- {
- points.Add(wayPoints[i].transform.position);
- }
- }
- //判断是否有下一个路径点
- public bool HasNextPoint()
- {
- //points实例化过,并且存在N个路径点
- if (points!=null && points.Count>)
- {
- return true;
- }
- return false;
- }
- public Vector3 GetNextPoint()
- {
- if (points!=null && points.Count>)
- {
- Vector3 p=(Vector3)points[];
- points.RemoveAt();
- return p;
- }
- return Vector3.zero;
- }
- }
为需要移动的物体或者人物创建WayPointAI
WayPointAI代码如下
- using UnityEngine;
- using System.Collections;
- public class WayPointAI : MonoBehaviour
- {
- public Path path;
- private Vector3 pos;
- private float rotateSpeed = 10f;
- private float moveSpeed = 5f;
- // Use this for initialization
- void Start()
- {
- if (path!=null && path.HasNextPoint())
- {
- pos = path.GetNextPoint();
- }
- }
- // Update is called once per frame
- void Update()
- {
- bool reached = MoveToTarget(pos);
- if (reached==true && path!=null && path.HasNextPoint())
- {
- pos = path.GetNextPoint();
- }
- }
- bool MoveToTarget(Vector3 point)
- {
- //只在XZ平面上移动,消除鼠标点击对Y轴的偏移,保持transform.y
- Vector3 pointR = new Vector3(point.x, transform.position.y, point.z);
- //Quaternion插值 物体朝向目标点平缓转向
- Quaternion wantedRot = Quaternion.LookRotation(pointR - transform.position);
- transform.rotation = Quaternion.Lerp(transform.rotation, wantedRot, rotateSpeed * Time.deltaTime);
- //使用插值当物体到达目标点以后,会有抖动现象,在point处消除抖动
- float distance = Vector3.Distance(pointR, transform.position);
- if (distance < 0.05f)
- {
- return true; //到达point
- }
- //向目标点移动
- Vector3 direction = (pointR - transform.position).normalized;
- transform.Translate(direction * moveSpeed * Time.deltaTime, Space.World);
- return false;
- }
- }
WayPoint寻路的更多相关文章
- A*算法、导航网格、路径点寻路对比(A-Star VS NavMesh VS WayPoint)
在Unity3d中,我们一般常用的寻路算法: 1.A*算法插件 与贪婪算法不一样,贪婪算法适合动态规划,寻找局部最优解,不保证最优解.A*是静态网格中求解最短路最有效的方法.也是耗时的算法,不 ...
- A*寻路算法探究
A*寻路算法探究 A*算法常用在游戏的寻路,是一种静态网路中求解最短路径的搜索方法,也是解决很多搜索问题的算法.相对于Dijkstra,BFS这些算法在复杂的搜索更有效率.本文在U3D中进行代码的测试 ...
- Unity3D寻路导航烘焙
在初次进行3D(三维)游戏体验中,避免不了对游戏有生疏的情况,因此在游戏中一般会插入新手指导.自动寻路.导航地图等AI人工智能技术到游戏中,方便玩家更快体验,为了玩家的体验更好,Unity3D寻路导航 ...
- 一步一步开发Game服务器(五)地图寻路
目前大多数使用的寻路算法有哪些? 目前市面上大部分游戏的寻路算法是A*,或者B*. A*通常所说的是最优算法也就是寻找最短路径.B*碰撞式算法也就是,也就是不断的去碰撞能走就走,不管是不是绕路.当然以 ...
- A星寻路算法介绍
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...
- 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了
地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图
- A*寻路算法
对于初学者而言,A*寻路已经是个比较复杂的算法了,为了便于理解,本文降低了A*算法的难度,规定只能横竖(四方向)寻路,而无法直接走对角线,使得整个算法更好理解. 简而言之,A*寻路就是计算从起点经过该 ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 聊天管道和寻路器)
又快到双十一,又是不少同仁们出血的日子,首先希望大家玩的开心.我曾经想要仔细的剖析场景的的每个组件,就像这里的聊天管道与寻路器,但是仔细阅读别人代码的时候才发现元件虽小但是实现并不简单,因为有些东西还 ...
- A star 寻路
大白话说一下几个点: 通俗的来说,其实就是以一个规则来 从A点走到B点. 怎么来判断我们走的格子是一个合适的格子? 就是靠一个规则来计算,这个规则就是估价函数. 估价函数: 常用:曼哈顿算法 F = ...
随机推荐
- Dom实例:数据自增、搜索框及跑马灯
数据自增 功能:当点击add按扭后,div标签中的数据自动+1,实现网页的动态化 <!DOCTYPE html> <html lang="en"> < ...
- WebLogic11g-半小时让你的domain集群化
WebLogic11g-半小时让你的domain集群化 WebLogic11g-负载分发 weblogic proxy.war配置 web.xml <!DOCTYPE web-app PUBLI ...
- Android Studio 单元测试
测试的种类 按岗位划分 黑盒测试:测试逻辑业务 白盒测试:测试逻辑方法 按测试粒度分 方法测试:function test 单元测试:unit test 集成测试:integration test 系 ...
- Ruby Numeric
Numeric |-- Float |-- Integer |-- Fixnum |-- Bignum Numeric的基本结构 整数的差异,一般的数字Fixnum就能够处理,即使超过了Fixnum的 ...
- 【jmeter】逻辑控制器
JMeter中的Logic Controller用于为Test Plan中的节点添加逻辑控制器. JMeter中的Logic Controller分为两类:一类用来控制Test Plan执行过程中节点 ...
- HackerRank "Favorite sequence"
Typical topological sorting problem .. why is it 'difficult'? #include <iostream> #include < ...
- golang的连接池例子
github.com/jolestar/go-commons-pool 测试代码 package main import ( "github.com/jolestar/go-commons- ...
- c++的历史-异常
1.异常出现的目的 在c++语言的设计和演化中,Bjarne Stroustrup说过异常的设计假定如下情况: 基本上是为了处理错误 与函数定义相比,异常处理是很少的 与函数调用相比,异常出现的频率较 ...
- 【Linux】之系统工具top
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...
- eclipse导入html、js、xml报错的问题
今天重新安装eclipse,在导入部分html.js.xml文件,报错,解决办法如下: eclipse->window->preferences->Team,点击validation ...