- 辅助瞄准(2022.4.13)
- 开枪后坐力(2022.5.27)
- 3D路径显示(2022.4.21)
- 开枪流程(2022.4.29)
- 伤害流程(2022.5.1)
- 角色状态机(2022.5.20)
- 角色进副本(2022.6.10)
- 武器系统
- 被动技能
辅助瞄准(2022.4.13)
选取目标后,遍历所有Socket,用SweepSingleByChannel
检查摄像机和目标之间是否有遮挡,再用ProjectWorldToScreen
投影在屏幕坐标上,作为辅助瞄准的目标点。
增加开枪时准心往附近npc移动的功能
开枪后坐力(2022.5.27)
开火状态通过开火按钮按下与放开进行设置,在开火状态中如果是连发武器则会根据其射速设置一个timer,连续调用开火的接口使其连续射击。值得注意的是武器上处理开火的Component有一个连发计数,在进入开火时计数,停止开火后经过短暂的延迟timer会将其清零,如果在延迟时间内再次开火则继续计数,所以开火时会将清除计数的timer取消。
后坐力有一个单独的RecoilComponent处理,同样在枪的Actor上,当前的连发计数是后坐力计算公式中的一个因子,计算完毕后会将水平、垂直方向的偏移值记录在一个成员变量中,由Tick来处理。表格中配置了后坐力生效时间,保证在停火后准心还会继续有一定程度的上扬,在根据公式得出当前后坐力偏移值后,会将其进行累计,Tick中会根据DeltaTime与生效时间的比值计算出当前需要Apply的百分比,进而得出需要偏移的值,如果百分比超出,则只取最后余下的部分。最终其实是直接将偏移值累加到了ControlRotation中,也就是度数。
后坐力恢复
持续开枪结束后,准心会回到最开始开火的地方(如果没有其他输入),这是通过在累加后坐力偏移值时,单独储存了累加的总额,然后在Tick中判断后坐力累计生效的百分比是否达到1,如果是则执行后坐力的反向操作直到总额减为0。由于玩家可能压枪,为了不让恢复的幅度超过起始点,只需要将玩家的输入量以相同维度(InputScale)告知后坐力偏移的累加值,让其减去这部分值即可。
3D路径显示(2022.4.21)
NavMesh得到路径 (寻路实现) 生成indicator,调整indicator方向 路径更新优化、维护 LineTrace得到正确Z坐标
验收的时候遇到进入切换后的关卡中NavMesh消失拿不到路径的问题,正常打开没问题,从别的关卡切进去就会消失,最后发现是单机进地图NavMesh消失。
开枪流程(2022.4.29)
- inputid通知控制人物状态的StateComponent,执行开枪GA(ActivateAbility)
- GA执行开枪逻辑并广播事件,同时角色Actor设定开枪延迟Timer
- Timer到时间角色Actor通知武器Actor开枪
- 武器Actor身上处理开火的组件FireComponent创建子弹Projectile,子弹身上的移动组件驱动其运动并检测碰撞
- 角色Actor判断是否继续开枪,如果不是则停止开枪,终止开枪GA(EndAbility)
开枪的GA是众多FSMGA中的一个
单发连发靠DT中的一个配置来区分
子弹创建的位置
伤害流程(2022.5.1)
- 生成的子弹实例Actor经过碰撞检测后,在PlayerController的待处理子弹队列中加入碰撞信息
- PlayerController每隔一段时间检测是否有需要处理的子弹信息,如果有则对目标Actor上一个伤害GE
- 伤害GE事先配置在角色Actor上,GE上配置的ExecutionCalculation会处理具体的伤害公式,其中可能用到从玩家或NPC身上capture到的属性,也会有一些通过
SetSetByCallerMagnitude
设置的用标签映射的值
角色状态机(2022.5.20)
角色的状态切换通过一个Component来管理,每个状态都是一个GA,先将所有的状态GA定义好,然后在Component中用枚举在TMap中一一映射,需要激活的时候直接用对应的枚举去找即可。
有两套标签,一套用来处理本地的状态变化,一套用来在服务器中向其他客户端同步
角色进副本(2022.6.10)
go通知
加载地图可以通过UGameplayStatics::OpenLevel
或者ClientTravel
,在当前World的Context中设置TravelURL,引擎在Tick时便会发现需要切换地图,调用UEngine::Brose
。
连上ds
初始化数据
武器系统
玩家身上有处理武器逻辑的HoldingItemComponent,
插件系统
武器上有ASC和属性集 策划配表生成公式,利用反射更改属性
被动技能
被动技能除了一直生效的buff之外,还有一些是由特定的条件自动触发,还可能在达到其他条件时取消以此往复,为此我们设计了一个可以配置条件的Trigger,当所有条件都达成时,便触发某些效果,比如给角色上GE。
Condition条件基类,提供初始化、重置、标记成功的接口,每个Condition可以配置一个PostCondition,它会在当前Condition达成时开启检测。条件达成时有两种行为(可配置),一种是普通的完成,另一种是“ResetTrigger”,后者的效果是当此条件达成时让Trigger回到最开始的状态,即重置,一般用于打断。
Trigger会在Tick中检查所有Condition,如果所有条件都满足,则执行被动技能效果,然后重置。 Trigger成功触发后也有几种行为可以配置:
- Once:只执行一次,之后再也不触发
- Loop:经过一段时间的cd后继续检查Condition
- OnceBeforeReset:执行一次之后等待,直到有Condition将其重置