SeniorДебаггингИногдаЕщё не отвечали
Значение, выставленное на GameMode, не доходит до клиентов — как проследить поток авторитета?
Сервер выставляет CurrentRound на GameMode, а клиенты читают его, чтобы обновить HUD, но каждый клиент читает 0. Пометка свойства Replicated и регистрация в GetLifetimeReplicatedProps ничего не изменили.
UCLASS()
class AArenaGameMode : public AGameModeBase
{
GENERATED_BODY()
public:
UPROPERTY(Replicated)
int32 CurrentRound = 0;
void StartNextRound() { ++CurrentRound; } // вызывается на сервере
};
// На клиенте, чтобы обновить HUD:
int32 UArenaHUD::ReadRound()
{
AArenaGameMode* GM = GetWorld()->GetAuthGameMode<AArenaGameMode>();
return GM ? GM->CurrentRound : 0; // на клиенте всегда 0
}
Найдите и исправьте ошибку.
AGameModeBase существует только на сервере, поэтому любое выставленное на нём свойство по замыслу невидимо клиентам — оно никогда не реплицируется. Решение — перенести общие данные в AGameStateBase, который реплицируется всем, пометив свойство Replicated с записью в GetLifetimeReplicatedProps. Трассируйте так: убедитесь, что значение пишется на стороне с авторитетом и что клиенты читают его через GetGameState(), а не GetGameMode().
- ✗Класть видимое клиенту состояние на GameMode вместо реплицируемого GameState
- ✗Считать, что GameMode реплицирует копию клиентам, если его свойство помечено
Replicated - ✗Забывать зарегистрировать свойство GameState в
GetLifetimeReplicatedProps
- →Как отправить разовое событие с GameMode всем клиентам без постоянного свойства?
- →Почему
GetGameMode()возвращает null на клиенте и что вызывать вместо него?