08 2024 档案
摘要:在前一节实现了自定义CMC中的基础框架,由于下蹲本来就是设定好的一个MoveMode,所以我们不需要在UpdateMove中实现控制逻辑,只需要开放一个接口给外部调用就可以了 下蹲 UFUNCTION(BlueprintCallable) void CrouchPressed(); void UXC
阅读全文
摘要:之前在学习网络通信时,经常需要对客户端上的行为进行预测,来降低延迟带来的比较差的体验。而UE4为角色移动提供了CharacterMovementComponent这个组件,其在移动时可以发现已经实现了客户端预测。 现在可以通过对CharacterMovementComponent进行扩展,实现我们自
阅读全文
摘要:递归+回溯 返回条件 当前遍历完了整个原始数组,并且存留栈为空 if (index == input.size() && s.empty()) { for (int i = 0; i < output.size(); i++) { cout << output[i] << " "; } cout <
阅读全文
摘要:堆 堆本质上是一个完全二叉树,一般分为大根堆和小根堆。 大根堆:父节点的值大于或等于子节点的值 小根堆:父节点的值小于或等于子节点的值 堆的操作 插入 将值插入到堆空余位置,保持完全二叉树,然后开始比较插入值和当前父节点的大小,根据大根堆和小根堆进行节点之间的交换 删除 一般是删除头节点,一般是通过
阅读全文
摘要:目的 对于非常高延迟的用户,这个功能不希望开放,因为可能降低其他用户的体验。 利用对Ping的判断,更改武器中控制SSR的布尔值,注意服务器和客户端需要同步,所以可以对该布尔值变为可复制的,利用属性赋值,当服务器上的值发生了改变就可以传递到客户端 //只需要对当前武器的Owner客户端产生改变就可以
阅读全文
摘要:不同 因为Projectile是一个抛物线,所以不能再使用射线检测,而是通过检测projectile对象碰撞来造成伤害 所以对于抛物线轨迹,为了能够在服务器上模拟,需要传递起点和初始速度 所以还有一点不同就是这个Projectile对象的复制问题在开启SSR之后 Add 对于开放了Projectil
阅读全文
摘要:区别 虽然也是HitScane,但其可以对多个角色或者多个部位造成伤害 更改 首先是之前在FFramePackage结构体中,需要增添一个成员变量,用来表示该结构体中的BoxCollision属于哪个敌人。 而之前使用的ConfirmHit返回的校验击中头部和身体的结构体,需要为ShotGun创建类
阅读全文
摘要:滞后补偿 解决客户端由于网络问题,而导致游戏显示或者响应问题,比如当在一个网络延迟下,如果所有状态判断以及实现都是放在服务器上执行,那么当客户端按下移动键,然后需要将该事件传递到服务器上,此时经过一个时间,然后服务器处理结果,再返回给客户端总过经过一个RTT,所以如果RTT过大,将导致按键后,需要很
阅读全文
摘要:应用场景 当游戏运行过程中,当一个MainActor某个行为的发生会对其他多个object产生影响时可以采用观察者模式,这样可以避免MainActor与其他object发生强耦合关系。如果不采用观察者模式,可能的做法是将object加入到MainActor的行为方法中,如果有多个object那么该方
阅读全文
摘要:不使用对象池 如果不使用对象池,那么假设一个Boss技能发射10个投射物,那么就会导致每次技能的释放需要创建10个投射物,然后遇到条件进行销毁 对象池模式 维护一个存储投射物的容器,然后在发射时从容器中取出,当"销毁时"放回容器中。 实现方式 以发射投射物为例, 首先对于投射物创建一个父类,该父类表
阅读全文
摘要:说明 该层序遍历数组中空节点会使用-1代替,即该层序遍历数组可以理解为一个完全二叉树 代码 利用队列实现左右子节点的存储,每次通过获取队列头部元素即为当前头节点,然后在数组中i和i+1对应该头结点下的左右子节点,如果不为-1,那么说明可以入队。 struct TreeNode { int val;
阅读全文
摘要:主要实现 主要是两点 一个是Dash的实现效果,一种是直接Dash到目的地,第二种则是在Dash过程中实现动画的播放显示 第二点则是障碍物的检测,对Dash的一个阻挡效果的实现 Dash实现效果 为了实现Dash过程中的动画显示,可以利用时间轴组件实现Location的移动,从而避免直接对角色的Lo
阅读全文