考点: ELifetimeCondition 枚举、COND_Custom、Push Model、带宽优化
参考答案:
- 常用条件:
| 条件 |
含义 |
COND_None |
无条件(默认) |
COND_InitialOnly |
仅在首次复制(如角色名) |
COND_OwnerOnly |
只发给 Owner |
COND_SkipOwner |
不给 Owner |
COND_SimulatedOnly |
只给 SimulatedProxy |
COND_AutonomousOnly |
只给 AutonomousProxy |
COND_SimulatedOrPhysics |
Simulated 或有物理模拟 |
COND_InitialOrOwner |
首次 + Owner |
COND_Custom |
自定义(配合 PreReplication) |
COND_ReplayOrOwner / COND_ReplayOnly / COND_SkipReplay |
回放相关 |
COND_Dynamic / COND_Never |
运行时动态 / 永不复制 |
- 使用示例:
DOREPLIFETIME(AMyCharacter, Health);
DOREPLIFETIME_CONDITION(AMyCharacter, Ammo, COND_OwnerOnly);
DOREPLIFETIME_CONDITION(AMyCharacter, TeamID, COND_InitialOnly);
DOREPLIFETIME_CONDITION(AMyCharacter, bIsCrouching, COND_SkipOwner);
COND_Custom 高级用法(运行时按连接定制):
DOREPLIFETIME_CONDITION(AMyCharacter, StealthVisibility, COND_Custom);
void AMyCharacter::PreReplication(IRepChangedPropertyTracker& Tracker)
{
Super::PreReplication(Tracker);
DOREPLIFETIME_ACTIVE_OVERRIDE(AMyCharacter, StealthVisibility, bIsStealthed);
}
- 与 Push Model 结合(UE5 参数化接口):
FDoRepLifetimeParams RepParams;
RepParams.bIsPushBased = true;
RepParams.Condition = COND_OwnerOnly;
DOREPLIFETIME_WITH_PARAMS_FAST(AMyCharacter, Health, RepParams);
MARK_PROPERTY_DIRTY_FROM_NAME(AMyCharacter, Health, this);
- 易错点:全部用
COND_None 浪费带宽;"复制给谁"(条件复制)与"距离裁剪/是否相关"(Relevancy)是两个不同的优化维度。
面试点评: 能枚举常用条件的实际场景并提到 Push Model / DOREPLIFETIME_WITH_PARAMS,说明有 UE5 实战经验。