avatar

Hika

A blog focus on GameDev

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于
首页 掩体系统(下)
文章

掩体系统(下)

发表于 2022/12/22
作者 lynx 5 分钟阅读

上一章介绍了掩体系统在离线/运行时的场景掩体点生成算法流程。本章主要介绍掩体在运行时的交互逻辑流程。

运行时交互

由于不同体型,不同角色速度角度或者别的参数的情况下掩体生成阶段无法抉择,运行时的判断是必须的

image-20231027113859779 掩体过矮、过窄、坡度过陡、转角角度过大都被认为不能进入的掩体

掩体点过滤和择优

我们上一章节介绍了根据场景Navmesh生成的掩体点。掩体点粗略代表了此位置是可以进入的掩体位置。但是这个位置掩体点是否是可以真正交互的,也需要做掩体点的过滤和择优。

过滤公式如下:

image-20231027114934699

将掩体点选择到可用池中,其中Range为传入范围参数,Block为掩体法线击中点,CharPt为角色位置,CoverPt为掩体点位置,Input为输入方向,Camera为摄像机方向,Normal为掩体点法线。

而择优则是采用打分机制,公式如下:

image-20231027114903962

高度检测

对于不同高度的掩体,其交互效果的逻辑也不一样,高度检测也是必须实现的逻辑。对掩体高度检测能过滤掉不合法掩体的同时,还能实现高低掩体的切换功能。

高度检测算法流程:通过BoxTrace水平检测,从下往上迭代数次,获取最后一次的击中Trace,并获取击中的点,与角色立足点的Z轴相减,则可以获得掩体高度。

有时候击中点高度不是那么准确,可以优化为:从最后的一次非击中Trace的起始点和终点所为线段,与上次击中Trace的点(可能高度不对)与掩体法线所谓平面相交,求得焦点并修正Z为起始点Z,向下Trace得到的击中点必然为Z轴准确点

image-20231027115334812 使用BoxTrace实现检测掩体高度(左)以及对应的DebugDraw(右)

转角检测

转角检测用于判断角色能否连续移动到转角掩体。

算法流程是:从角色Y朝向(左右方向)两个对象方向移动一定距离(EdgeMaxDistance),旋转90°朝X方向(正对方向)发出射线,此时如果击中则可计算转角角度(EdgeAngle),否则继续从端点发出射线,击中下一个障碍,如果击中,法线与当前射线向量则为夹脚,否则视为无转角(90度)。

值得注意的是,初始射线检测的长度必须小于设定掩体边缘参数,否则检测结果是无效的。

image-20231027115741565 转角检测算法

掩体角色的交互状态机

为让整个交互过程清晰,状态机处理流程是一个好办法。状态流程具体还分为左右肩进入,高低掩体进入和切换,掩体起步、移动、转身、探身等。

image-20231027120416830 掩体进出和高低掩体切换状态机

image-20231027120443738 掩体进出细节分支与掩体瞄准切换

image-20231027120449275 掩体起步、移动、转身、折返

总结

实际上掩体系统逻辑的复杂度还远不如上述,其包含掩体探身(探身射击)、掩体盲射,快速掩体进入(掩体滑铲进、掩体翻滚进入,掩体跳跃进入)等。各个逻辑模块也不算复杂,不过实际做法也大同小异。掩体系统的核心和本质是角色跟场景的交互,或者说是检测算法与碰撞的反馈。Gameplay系统其中一个重要本质是让玩家做到尽可能少且直觉的操作或输入,然后系统能经过复杂但合理的处理后输出有趣且多种多样反馈,掩体系统理论上应该做到如此。

游戏, Gameplay
本文由作者按照 CC BY 4.0 进行授权
分享

热门标签

游戏 动画 渲染 物理 网络
推荐博客
  •  iquilezles
  •  timlly cnblog
  •  catlikecoding
  •  therealmjp
  •  realtime-rendering-blog

相关文章

2022/12/19

掩体系统(上)

掩体系统在gameplay中是个复杂度较高的系统,其独立性较高的同时,也跟其他3C系统关联很大,并且不同游戏中做法也不一样。本文目的在于实现高弹性动作射击游戏的掩体系统。 掩体地形数据 掩体地形数据有些游戏是通过策划配置,编辑那些掩体哪个面,或者配置掩体位置的曲线表示哪里能进那些不能。这种做法虽然比较可控,但是制作非常繁琐。在大世界游戏中会有大量PCG内容,虽然部分掩体物体都是通过模...

2021/04/01

真机适配问题记录(三)

有些问题过去久远了,相关的bug单都找不到了,但是实在让人印象深刻,还是要记录一下滴~~ 在iOS中,雾在场景会闪烁 表现:在教堂场景中,打开雾效会闪烁。场景贴图跟雾有种Z-Fighting一样的表现。 原因:iOS中,PBR_Scene_DetailNormal.shader(实际代码在Scene_PBR.hlsl)的雾效的一段计算(ComputeFogFactor函数),在fr...

2022/01/18

连续碰撞检测

高速运动的物体需要连续碰撞检测解决离散帧在碰撞检测失败的问题,如子弹。连续碰撞检测(Continuous Collision Detection)简称CCD。 CCD有几种解决方案: 1、Sub-Stepping 子步,又称Supersampling超采样,是UE4的物理引擎PhysxCCD的一种实现方法(不确定是否是默认的实现方法,见https://docs.nvidia.com/g...

掩体系统(上)

UE实现圆锥体ConeTrace

© 2023 lynx. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

热门标签

游戏 动画 渲染 物理 网络

发现新版本的内容。