做球衣外贸用什么网站,网站结构是什么 怎么做,有创意的产品设计作品介绍,常熟沿江开发区人才网更新日期#xff1a;2024年7月4日。 项目源码#xff1a;第五章发布#xff08;正式开始游戏逻辑的章节#xff09; 索引 简介一、寻路系统二、寻路规则#xff08;角色移动#xff09;三、寻路规则#xff08;角色攻击#xff09;四、角色移动寻路1.自定义寻路规则2.寻… 更新日期2024年7月4日。 项目源码第五章发布正式开始游戏逻辑的章节 索引 简介一、寻路系统二、寻路规则角色移动三、寻路规则角色攻击四、角色移动寻路1.自定义寻路规则2.寻角色的所有可行走地块3.寻角色到达指定地块的路径 五、角色攻击寻路1.自定义寻路规则2.寻找角色的攻击范围内的地块 六、角色登场寻路七、整合 简介
寻路系统是整个游戏最核心的功能之一角色的移动和战斗都是基于寻路系统来进行的毕竟我们的游戏有三分之一的战棋血统。
一、寻路系统
由于HTFrameworkAI模块正好支持如下我们游戏需要的寻路核心功能
1.两点间寻路2.寻可行走节点。
所以首先就是引入该模块更多信息请参阅【Unity】 HTFramework框架二十七A*寻路。
二、寻路规则角色移动
对于我们角色的移动和攻击而言移动速度和攻击距离便是其寻路计算时的最大依据。
比如移动速度10则角色初始移动能力10每移动一格地块移动能力-1当移动能力减至0时角色无法再继续移动。
同时不同类型的地块对移动能力还会产生额外的削减
1.地面-02.山体-13.森林-14.湖泊-15.雪地-26.障碍不可通行7.敌方占领地块不可通行。
这也是角色行走到山体上会被减速的功能点的实现方式。
不过一些特殊加成型要诀能够抵消地块的额外削减但是在我们的进程中特殊加成型要诀尚在构思阶段所以具体的实现我们后续一步步来。
三、寻路规则角色攻击
角色攻击是同理的不过角色攻击寻路规则跟地块类型的关系有所不同
1.地面可以跨越攻击2.山体可以跨越攻击3.森林可以跨越攻击4.湖泊可以跨越攻击5.雪地可以跨越攻击6.障碍不可跨越攻击7.敌方占领地块可以跨越攻击。
由于角色攻击寻路几乎只针对远程攻击近程攻击只能攻击身边的4格用不着寻路所以这里的可以跨越攻击及不可跨越攻击也即是指攻击时是否能够跨越该地块攻击敌人。
同理一些特殊加成型要诀能够改变如上的规则。
四、角色移动寻路
1.自定义寻路规则
要做到如上这么多自由的想法自定义寻路规则是必须的所幸HTFrameworkAI的A*寻路支持自定义寻路规则那么我们便立即开始吧继承至AStarRule即可 /// summary/// 寻路规则角色移动/// /summarypublic class MoveRule : AStarRule{/// summary/// 当前的关卡/// /summarypublic Level CurrentLevel;/// summary/// 当前寻路的角色/// /summarypublic Role CurrentRole;/// summary/// 目标地块/// /summarypublic Block TargetBlock;//寻路前对所有A*节点应用自定义规则public override void Apply(AStarNode node){//通过节点索引找到其对应的地块Block block CurrentLevel.Blocks[node.XIndex, node.YIndex];//如果地块上存在敌人阵营不同if (block.StayRole ! null block.StayRole.Camp ! CurrentRole.Camp){//则该地块不可行走node.IsCanWalk false;return;}switch (block.Type){case BlockType.Ground:// OCost 为该节点的额外估价寻路计算时将造成【移动能力】的额外削减// 此处 0则表明无额外削减node.OCost 0;node.IsCanWalk true;break;case BlockType.Moutain://山体将造成【移动能力】额外 -1node.OCost 1;node.IsCanWalk false;break;case BlockType.Forest:node.OCost 1;node.IsCanWalk true;break;case BlockType.Water:node.OCost 1;node.IsCanWalk false;break;case BlockType.Snow:node.OCost 2;node.IsCanWalk true;break;case BlockType.Obstacle://障碍将造成该地块不可行走node.IsCanWalk false;break;}}}如上的代码应该很好理解了足以可见自定义寻路规则是何其的简单。
2.寻角色的所有可行走地块
角色移动前能够根据角色自身移动速度周围地块属性等寻找出所有可以移动的地块以供玩家选择 private static MoveRule _moveRule;private static ListBlock _resultBlocks new ListBlock();/// summary/// 寻路规则移动/// /summaryprivate static MoveRule CurrentMoveRule{get{if (_moveRule null){_moveRule new MoveRule();}return _moveRule;}}/// summary/// 寻找角色的可行走地块/// /summary/// param namelevel关卡/param/// param namerole角色/parampublic static ListBlock FindWalkableBlocks(Level level, Role role){if (level null || role null || role.Speed 0){_resultBlocks.Clear();return _resultBlocks;}CurrentMoveRule.CurrentLevel level;CurrentMoveRule.CurrentRole role;//WalkableNodefinding 为 A* 寻路方法具体参阅 HTFrameworkAI//参数1role.StayBlock.Pos 寻路起点//参数2role.Speed 移动速度//参数3传入自定义寻路规则ListAStarNode nodes level.Map.WalkableNodefinding(role.StayBlock.Pos, role.Speed, CurrentMoveRule);//寻路结果为A*节点集合通过节点索引获取对应的地块即可_resultBlocks.Clear();for (int i 0; i nodes.Count; i){_resultBlocks.Add(level.Blocks[nodes[i].XIndex, nodes[i].YIndex]);}return _resultBlocks;}寻找到所有可行走地块后接下来只需要高亮这些地块即可同时让玩家可以点击选择高亮方式就取决于自己了当然这块逻辑也有涉及不过在最后的实现UI界面时讲解 比如这里的角色络英俊移动速度为7周围高亮的都是可行走的地块其他在移动范围内的便是不可行走的地块。
3.寻角色到达指定地块的路径
上一步已经寻找到了所有可移动地块如果玩家点击了其中的一个则表明期望角色移动到该地块所以需要寻角色到达该地块的路径 /// summary/// 寻找角色到达指定地块的路径/// /summary/// param namelevel关卡/param/// param namerole角色/param/// param nameblock目标地块/parampublic static ListBlock FindPathBlocks(Level level, Role role, Block block){if (level null || role null || block null){_resultBlocks.Clear();return _resultBlocks;}CurrentMoveRule.CurrentLevel level;CurrentMoveRule.CurrentRole role;//Pathfinding 为 A* 寻路方法具体参阅 HTFrameworkAI//参数1role.StayBlock.Pos 寻路起点//参数2block.Pos 寻路终点//参数3传入自定义寻路规则ListAStarNode nodes level.Map.Pathfinding(role.StayBlock.Pos, block.Pos, CurrentMoveRule);_resultBlocks.Clear();for (int i 0; i nodes.Count; i){_resultBlocks.Add(level.Blocks[nodes[i].XIndex, nodes[i].YIndex]);}return _resultBlocks;}当然这里的角色移动动画涉及到战斗系统中的内容了在我们的进程中它还不存在我们先忽略。
五、角色攻击寻路
1.自定义寻路规则
同样的角色攻击寻路也必须单独自定义一个寻路规则 /// summary/// 寻路规则角色攻击/// /summarypublic class AttackRule : AStarRule{/// summary/// 当前的关卡/// /summarypublic Level CurrentLevel;/// summary/// 当前寻路的角色/// /summarypublic Role CurrentRole;public override void Apply(AStarNode node){Block block CurrentLevel.Blocks[node.XIndex, node.YIndex];switch (block.Type){case BlockType.Obstacle://遵循我们一开始制定的规则只有【障碍】是不可跨越攻击的其他的都可//且攻击寻路时任何类型的地块均不会产生额外的削减OCost 0node.OCost 0;node.IsCanWalk false;break;default:node.OCost 0;node.IsCanWalk true;break;}}}2.寻找角色的攻击范围内的地块
角色攻击前能够根据所选要诀的攻击距离周围地块属性等寻找出所有在攻击范围内的地块 private static AttackRule _attackRule;/// summary/// 寻路规则攻击/// /summaryprivate static AttackRule CurrentAttackRule{get{if (_attackRule null){_attackRule new AttackRule();}return _attackRule;}}/// summary/// 寻找角色的攻击范围内的地块/// /summary/// param namelevel关卡/param/// param namerole角色/param/// param nameability使用的要诀/parampublic static ListBlock FindAttackableBlocks(Level level, Role role, Ability ability){if (level null || role null || ability null){_resultBlocks.Clear();return _resultBlocks;}CurrentAttackRule.CurrentLevel level;CurrentAttackRule.CurrentRole role;//参数1role.StayBlock.Pos 寻路起点//参数2ability.AttackDistance 攻击距离//参数3传入自定义寻路规则ListAStarNode nodes level.Map.WalkableNodefinding(role.StayBlock.Pos, ability.AttackDistance, CurrentAttackRule);_resultBlocks.Clear();for (int i 0; i nodes.Count; i){_resultBlocks.Add(level.Blocks[nodes[i].XIndex, nodes[i].YIndex]);}return _resultBlocks;}当然如此寻找出来的是所有在攻击距离内的地块我们只需要判断上面是否站有敌人就能搜罗出周围所有能够被攻击的敌人以供玩家选择了。
六、角色登场寻路
此处有一个难点那就是我们设定为延后登场的角色如果他的登场地块在特殊情况下被占用了一个地块只能站一个角色那么就需要基于其登场地块寻找四周的最近的空地块以便于完成登场任务 /// summary/// 以当前地块为起点寻找周围最近的没有停留角色的地块/// /summary/// param namelevel关卡/param/// param nameblock当前地块/parampublic static Block FindNullBlock(Level level, Block block){if (level null || block null || block.StayRole null)return block;//开启列表存放所有【未知地块】需检测其是否【合格】合格没有停留角色的【地面】类型地块ListBlock openList new ListBlock();//关闭列表存放所有【已知地块】HashSetBlock closeList new HashSetBlock();//相邻列表HashSetBlock neighborList new HashSetBlock();//从当前地块开始openList.Add(block);//如果存在【未知地块】while (openList.Count 0){//获取该【未知地块】同时该地块转为【已知地块】Block b openList[0];openList.RemoveAt(0);closeList.Add(b);//发现合格地块直接返回if (b.Type BlockType.Ground b.StayRole null){return b;}else{//否则获取其周围九宫格范围内的地块neighborList.Clear();GetNeighborBlock(level, b, neighborList);//检测这些地块foreach (var item in neighborList){//如果该地块不是【已知地块】将其添加到【未知地块】if (!closeList.Contains(item) !openList.Contains(b)){openList.Add(item);}}}}//如果整个关卡都搜完了还是没有空地块那......return null;}/// summary/// 获取一个地块的相邻地块九宫格/// /summary/// param namelevel关卡/param/// param nameblock地块/param/// param nameblocks缓存列表/paramprivate static void GetNeighborBlock(Level level, Block block, HashSetBlock blocks){if (level null || block null || blocks null)return;for (int i -1; i 1; i){for (int j -1; j 1; j){if (i 0 j 0)continue;Vector2Int index block.Pos new Vector2Int(i, j);if (index.x 0 index.x level.MapSize.x index.y 0 index.y level.MapSize.y){blocks.Add(level.Blocks[index.x, index.y]);}}}}七、整合
如上我们的寻路系统功能也完成得七七八八了我决定将其整合到一个静态类中 /// summary/// RPG2D实用工具/// /summarypublic static class RPG2DUtility{/// summary/// 寻路系统/// /summarypublic static class FindSystem{//我们前面编写的各种方法........}}这样的话后续调用就十分简单明了 //求得所有能够移动的地块ListBlock blocks RPG2DUtility.FindSystem.FindWalkableBlocks(_level, player);
文章转载自: http://www.morning.mglqf.cn.gov.cn.mglqf.cn http://www.morning.yrhsg.cn.gov.cn.yrhsg.cn http://www.morning.kfwqd.cn.gov.cn.kfwqd.cn http://www.morning.jbkcs.cn.gov.cn.jbkcs.cn http://www.morning.czcbl.cn.gov.cn.czcbl.cn http://www.morning.bxbkq.cn.gov.cn.bxbkq.cn http://www.morning.fyglg.cn.gov.cn.fyglg.cn http://www.morning.ybhrb.cn.gov.cn.ybhrb.cn http://www.morning.zrpbf.cn.gov.cn.zrpbf.cn http://www.morning.xtdms.com.gov.cn.xtdms.com http://www.morning.lpppg.cn.gov.cn.lpppg.cn http://www.morning.rzmkl.cn.gov.cn.rzmkl.cn http://www.morning.rrwft.cn.gov.cn.rrwft.cn http://www.morning.ybgcn.cn.gov.cn.ybgcn.cn http://www.morning.xfcjs.cn.gov.cn.xfcjs.cn http://www.morning.zlgbx.cn.gov.cn.zlgbx.cn http://www.morning.dzgyr.cn.gov.cn.dzgyr.cn http://www.morning.ptlwt.cn.gov.cn.ptlwt.cn http://www.morning.tralution.cn.gov.cn.tralution.cn http://www.morning.rqxtb.cn.gov.cn.rqxtb.cn http://www.morning.fwmln.cn.gov.cn.fwmln.cn http://www.morning.msfqt.cn.gov.cn.msfqt.cn http://www.morning.yqrfn.cn.gov.cn.yqrfn.cn http://www.morning.mwmxs.cn.gov.cn.mwmxs.cn http://www.morning.qtrlh.cn.gov.cn.qtrlh.cn http://www.morning.psdsk.cn.gov.cn.psdsk.cn http://www.morning.zdmlt.cn.gov.cn.zdmlt.cn http://www.morning.jqswf.cn.gov.cn.jqswf.cn http://www.morning.ckxd.cn.gov.cn.ckxd.cn http://www.morning.tgbx.cn.gov.cn.tgbx.cn http://www.morning.cyjjp.cn.gov.cn.cyjjp.cn http://www.morning.qmbtn.cn.gov.cn.qmbtn.cn http://www.morning.nzklw.cn.gov.cn.nzklw.cn http://www.morning.slzkq.cn.gov.cn.slzkq.cn http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn http://www.morning.krwzy.cn.gov.cn.krwzy.cn http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn http://www.morning.lysrt.cn.gov.cn.lysrt.cn http://www.morning.gkxyy.cn.gov.cn.gkxyy.cn http://www.morning.jqsyp.cn.gov.cn.jqsyp.cn http://www.morning.gctgc.cn.gov.cn.gctgc.cn http://www.morning.grryh.cn.gov.cn.grryh.cn http://www.morning.tgwfn.cn.gov.cn.tgwfn.cn http://www.morning.ywpcs.cn.gov.cn.ywpcs.cn http://www.morning.fqssx.cn.gov.cn.fqssx.cn http://www.morning.wyfpc.cn.gov.cn.wyfpc.cn http://www.morning.dmzmy.cn.gov.cn.dmzmy.cn http://www.morning.bpncd.cn.gov.cn.bpncd.cn http://www.morning.xnnpy.cn.gov.cn.xnnpy.cn http://www.morning.pbmg.cn.gov.cn.pbmg.cn http://www.morning.ytrbq.cn.gov.cn.ytrbq.cn http://www.morning.dxzcr.cn.gov.cn.dxzcr.cn http://www.morning.tnrdz.cn.gov.cn.tnrdz.cn http://www.morning.ryspp.cn.gov.cn.ryspp.cn http://www.morning.nfmtl.cn.gov.cn.nfmtl.cn http://www.morning.rhchr.cn.gov.cn.rhchr.cn http://www.morning.gstg.cn.gov.cn.gstg.cn http://www.morning.bpmnx.cn.gov.cn.bpmnx.cn http://www.morning.wbxtx.cn.gov.cn.wbxtx.cn http://www.morning.khlxd.cn.gov.cn.khlxd.cn http://www.morning.mhybs.cn.gov.cn.mhybs.cn http://www.morning.hnkkf.cn.gov.cn.hnkkf.cn http://www.morning.wdykx.cn.gov.cn.wdykx.cn http://www.morning.hprmg.cn.gov.cn.hprmg.cn http://www.morning.rhsr.cn.gov.cn.rhsr.cn http://www.morning.rzbcz.cn.gov.cn.rzbcz.cn http://www.morning.nnhfz.cn.gov.cn.nnhfz.cn http://www.morning.youprogrammer.cn.gov.cn.youprogrammer.cn http://www.morning.mdxwz.cn.gov.cn.mdxwz.cn http://www.morning.mngyb.cn.gov.cn.mngyb.cn http://www.morning.ydrn.cn.gov.cn.ydrn.cn http://www.morning.kphyl.cn.gov.cn.kphyl.cn http://www.morning.pwmm.cn.gov.cn.pwmm.cn http://www.morning.cttgj.cn.gov.cn.cttgj.cn http://www.morning.beijingzy.com.cn.gov.cn.beijingzy.com.cn http://www.morning.qgfy.cn.gov.cn.qgfy.cn http://www.morning.btpzn.cn.gov.cn.btpzn.cn http://www.morning.rqlf.cn.gov.cn.rqlf.cn http://www.morning.ssmhn.cn.gov.cn.ssmhn.cn http://www.morning.rfhm.cn.gov.cn.rfhm.cn