A星寻路和nevmesh寻路的一些技巧



A星寻路和nevmesh寻路是网游里最常用的两种寻路方式了,实现代码可以百度,今天跟大家分享下,在不同情况下,A星寻路和nevmesh寻路的一些技巧。



一:客户端nevmesh 和 服务端A*算法的转换

比如做一个网游时,客户端使用nevmesh寻路,而服务端因为某些原因习惯使用A*算法,可以使用如下方式转换:

[AppleScript]  纯文本查看  复制代码
?
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public void Sync ( )
     {
 
         / / 判断是否处于寻路 / /
         if ( LocusPoints.Count < 2 )
         {
             return ;
         }
             
         / / 获取下一个路径点 / /
         Vector 3 nextPosition = LocusPoints[ 0 ];
         Vector 3 nextPosition 2 = LocusPoints[ 1 ];
 
         / / 如果两者大于一个格子,则插点 / /
         if ( Vector 3. Distance ( nextPosition , nextPosition 2 ) > 0.5 f )
         {
             / / * 方向 / /
             Vector 3 directionVector 3 = nextPosition 2 - nextPosition;
 
             / / 预测下一个路径点 / /
             Vector 3 targetVector 3 = directionVector 3. normalized * 0.5 f + nextPosition;
 
             if ( targetVector 3. x = = 0 & & targetVector 3. z = = 0 )
LocusPoints.Insert ( 1 , targetVector 3 ) ;
         }
      
 
         / / TODo:和服务端同步一次位置 / /
 
 
         / / 记录上一个出发点,用于平滑路径
         NewLocusPointRotation = SelectedLightProjector.transform.rotation;
         NewLocusPointPosition = SelectedLightProjector.transform. position ;
 
         NewLocusPointStartTime = Time.fixedTime;
 
mFollowWayPointsState.begin = true ;
 
     }



上面这段代码,实际上就是每隔一定距离,就对Nevmesh的路径点进行插点,然后转换为A星的格子位置。
这样服务端的小伙伴就可以验证客户端的寻路的真伪了。

二: A*算法的障碍碰撞
       一般的A*算法代码是把所有障碍当做一个格子。但某些时候有的物体大,有的物体小,碰撞范围大小不一,那么需要动态传递参数

[AppleScript]  纯文本查看  复制代码
?
 
01
02
03
04
05
06
07
08
09
10
11
12
13
public bool CanReach ( int x , int y )
{
 
     / / / 加入自身碰撞器后,需要判断该点周围 全无阻挡 / / /
     for ( int i = - selfBlock; i < = selfBlock; i + + )
     {
         for ( int j = - selfBlock; j < = selfBlock; j + + )
         {
             if ( MazeArray[x + i , y + j] < = 0 )
                 return false ;
         }
     }
     return true ;
}



三:客户端nevmesh 和 A*算法的混用
因为项目的某些需求,使用单一的寻路方式,性能或者效果可能不好,那么可以混用几种寻路方式。
     提供两种思路:
     1.使用nevmesh检测静态障碍,在这段代码内部,再使用A*专门检测动态障碍,调整nevmesh的路径。
     2. 因为一些特殊需求,比如寻找NPC,使用nevmesh检测长范围的寻路,在路径的最后一段,使用A*检测小范围的障碍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值