的笔记

随时随地编辑

游戏能力预测概述(机器翻译版)

游戏能力预测概述(机器翻译版)

高级别目标:

在GameplayAbility级别(实施能力)预测是透明的。说一个能力“Do X> Y-> Z”,我们会自动预测我们可以做的部分。
我们希望避免在能力本身中有诸如“如果权限:做X否则:X的预测版本”的逻辑。

在这一点上,并不是所有的案例都得到解决,但是我们有一个非常坚实的框架来处理客户端预测。

当我们说“客户端预测”时,我们真的意味着客户端预测游戏模拟状态。事情仍然可以“完全是客户端”,而不必在预测系统中工作。
例如,脚本完全是客户端,不会与此系统交互。但是,当他们施放法术时,预测法术力从100到90的客户是“客户端预测”。

我们目前预测的是什么?
活力激活

  • 触发事件
    -GameplayEffect应用程序:
    -Attribute修改(EXCEPTIONS:执行当前不预测,只有属性修饰符)
    -GameplayTag修改
  • 游戏提示事件(均来自预测游戏效果和自己)

-Montages

  • 运动(内置于UE4 UCharacterMovement)

有些事情我们无法预测(我们大多数可能,但目前还没有):
-GameplayEffect删除
-GameplayEffect定期效果(点滴)

我们试图解决的问题:
“我可以做吗?”基本预测协议。
2.“撤消”当预测失败时如何撤消副作用。
3.“重做”如何避免重播本地预测的副作用,但也可从服务器复制。
4.“完整性”如何确定我们/真的/预测所有的副作用。
5.“依赖关系”如何管理依赖预测和预测事件链。
6.“覆盖”如何预先覆盖状态,否则由服务器复制/拥有。


实施细节

PredictionKey

该系统中的一个基本概念是预测键(FPredictionKey)。它自己的预测键只是在客户端的中心位置生成的唯一ID。客户端将其预测密钥发送到服务器,
并与预测动作和副作用相关联。服务器可以对预测密钥进行接受/拒绝来响应,并且还将服务器端创建的副作用与该预测密钥相关联。

(重要)FPredictionKey始终复制客户端 - >服务器,但是当复制服务器 - >客户端时,它们首先将发送预测密钥的客户端复制到服务器。
这在FPredictionKey :: NetSerialize中发生。当从客户端发送的预测密钥通过复制的属性被复制时,所有其他客户端将接收到无效(0)预测密钥。

能力激活

能力激活是一流的预测行动。每当客户端预测性地激活能力时,他明确地要求服务器和服务器明确地做出响应。一旦有了能力
预测性地激活,客户端具有有效的“预测窗口”,其中预测性副作用可能发生,这些未明确地被“询问”。 (例如,我们没有明确提出“我可以减少法力,我可以吗
把这个能力放在冷却时间。这些行为被认为是逻辑原子的,激活一个能力)。

AbilitySystemComponent提供了一组用于在客户端和服务器之间进行通信能力激活的功能:TryActivateAbility - > ServerTryActivateAbility - > ClientActivateAbility(Failed / Succeed)。

1.客户端调用TryActivateAbility生成新的FPredictionKey并调用ServerTryActivateAbility。
2.客户端继续(在从服务器回来之前),并使用与能力的ActivationInfo关联的生成的PredictionKey调用ActivateAbility。
在ActivatAbility调用之前/之前发生的任何副作用/生成的FPredictionKey与它们相关联。
4.服务器决定ServerTryActivateAbility中是否发生了这种能力,调用ClientActivateAbility(Failed / Succeed),并将UAbilitySystemComponent :: ReplicatedPredictionKey设置为已发送的生成的密钥。
5.如果客户端接收到ClientAbilityFailed,则立即杀死该能力并回滚与预测密钥相关联的副作用。
5A。 “回滚”通过FPredictionKeyDelegates和FPredictionKey :: NewRejectedDelegate / NewCaughtUpDelegate / NewRejectOrCaughtUpDelegate完成。

在TryActivateAbility中注册回调:

//如果此PredictionKey被拒绝,我们将调用OnClientActivateAbilityFailed。
ThisPredictionKey.NewRejectedDelegate()。BindUObject(this,&UAbilitySystemComponent :: OnClientActivateAbilityFailed,Handle,ThisPredictionKey.Current);

在ClientActivateAbilityFailed_Implementation中调用回调函数:
FPredictionKeyDe

posted on 2017-05-10 11:31 的笔记 阅读(332) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理