博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java ai寻路_游戏AI-A*寻路(2)
阅读量:6513 次
发布时间:2019-06-24

本文共 1751 字,大约阅读时间需要 5 分钟。

战术寻路——避开火力范围

战术寻路我们使用PointGraph来进行控制,这种寻路很适合战术寻路

我们修改A*PathfindingProject的部分源码来实现战术寻路

在Path中我们修改GetTraversalCost函数来实现路径代价的重新计算

源码

internal uint GetTraversalCost (GraphNode node) {

#if ASTAR_NO_TRAVERSAL_COST

return 0;

#else

// Use traversal provider if set, otherwise fall back on default behaviour

if (traversalProvider != null)

return traversalProvider.GetTraversalCost(this, node);

unchecked { return GetTagPenalty((int)node.Tag) + node.Penalty; }

#endif

}

修改后

在Path class中添加了4个变量

在GetTraversalCost函数中来判断每一个节点到玩家之间有没有障碍物,以此来进行额外代价的判定。

//添加代码部分

//玩家对象

protected GameObject player;

//玩家火力范围

protected float fireRange;

//火力范围的平方

protected float sqrFireRange;

//危险路点的额外代价

protected int penaltyAmount;

internal uint GetTraversalCost (GraphNode node) {

#if ASTAR_NO_TRAVERSAL_COST

return 0;

#else

// Use traversal provider if set, otherwise fall back on default behaviour

if (traversalProvider != null)

return traversalProvider.GetTraversalCost(this, node);

//修改部分

node.Penalty = 0;

//当前处理节点的位置

Vector3 nodePos = (Vector3)node.position;

Vector3 rayStart = nodePos;

rayStart.y = 1.0f;

//玩家位置

Vector3 playerPos = player.transform.position;

Vector3 distance = playerPos - nodePos;

distance.y = 0;

//节点在火力范围内

if(distance.sqrMagnitude < sqrFireRange)

{

//判断是否有遮挡

RaycastHit hit;

if(Physics.Raycast(nodePos,distance,out hit))

{

//没有遮挡 路径惩罚值加上一个额外代价

if(hit.collider.tag == "Player")

{

node.Penalty += (uint)penaltyAmount;

Debug.Log(node.Penalty);

}

}

}

unchecked { return GetTagPenalty((int)node.Tag) + node.Penalty; }

#endif

}

修改ABPath中的UpdateStarEnd函数

源码

protected void UpdateStartEnd (Vector3 start, Vector3 end) {

originalStartPoint = start;

originalEndPoint = end;

startPoint = start;

endPoint = end;

startIntPoint = (Int3)start;

hTarget = (Int3)end;

}

修改后

转载地址:http://gtifo.baihongyu.com/

你可能感兴趣的文章
SPOJ 10628 COT - Count on a tree(在树上建立主席树)(LCA)
查看>>
SpringInAction--Bean参数的自动注入
查看>>
取某个数字的各个位数字
查看>>
素数筛
查看>>
centos /linux 修改目录或文件权限
查看>>
leetcode--
查看>>
访问者模式
查看>>
异步函数
查看>>
Openstack的vnc界面定制
查看>>
软考 2018年下半年卷 错题知识点记录
查看>>
仿网易邮箱5.0版UI
查看>>
winsow xp不能安装软件, 提示"中断" 是因为设置了 软件限制策略
查看>>
as3调用外部应用程序 as调用外部exe文件as3调用bat文件 未测试
查看>>
jQuery清空标签内容--防止内存泄露
查看>>
关于 HandlerMethodArgumentResolver 类 以及 WebArgumentResolver 类 自定义解析参数
查看>>
30个php操作redis常用方法代码例子
查看>>
阿里PB级Kubernetes日志平台建设实践
查看>>
监听者模式实践-java事件和事件监听器
查看>>
比RBAC更好的权限认证方式(Auth类认证)
查看>>
httpd之编译安装详解
查看>>