跳转到内容

对照小练 D · 把合作防守改成 PvP 一对多

约 4 分钟 难度:5

这一章解决:把合作防守项目改成 PvP 一对多时,先改 ADR 和字段表,再决定代码改动。

先看一下

合作防守是所有玩家一起打敌人。PvP 一对多换成两个阵营:1 名防守者守住目标,多名攻击者尝试在时间内摧毁目标。玩法看起来变化很大,但底层仍然是 PlayerObject 发请求,GameState 裁决阶段、目标和胜负。

这一章会拿到什么

  • 一份 PvP 一对多的改造目标
  • 一张字段替换表
  • 一个胜负裁决片段
  • 一份对照测试矩阵

依赖前面

  • 第 46 章项目改造对照表
  • 第 27 章不对称队伍
  • 第 28 章旁观和补位策略
  • 第 43 章体感优化边界

把合作防守改成「1 名防守者 vs 多名攻击者」。

攻击方目标:在倒计时结束前摧毁核心。防守方目标:守到时间结束。攻击方可以多人,防守方第一版固定 1 人。

这次小练只改结构,不给完整代码。目标是看出哪些字段保留,哪些字段替换。


合作防守PvP 一对多
teamId = 0 合作队TEAM_ATTACKER / TEAM_DEFENDER
EnemyObjectDefenseCore / 可选防守道具
enemyAliveCountcoreHp / coreDestroyed
RESULT_ALL_TARGETS_CLEAREDRESULT_ATTACKERS_WIN
RESULT_TIME_UPRESULT_DEFENDER_WIN
personalScore伤害贡献 / 防守贡献
teamScore[]攻击进度 / 防守奖励

PlayerObject 保留 teamIdroleIdcurrentHPpersonalScore、请求字段。GameState 保留 phasematchIdstateVersionphaseStartServerTimeresultReason。删除或废弃 enemyAliveCount,换成核心目标状态。


胜负不再靠分数大小,而靠目标状态和时间。

private void TickPvpMatch()
{
if (coreHp <= 0)
{
EndPvpMatch(RESULT_ATTACKERS_WIN);
return;
}
double elapsed = Networking.CalculateServerDeltaTime(
Networking.GetServerTimeInSeconds(), phaseStartServerTime);
if (elapsed >= matchDuration)
{
EndPvpMatch(RESULT_DEFENDER_WIN);
return;
}
}

攻击者的命中请求仍然走 PlayerObject。GameState Owner 或核心对象 Owner 裁决伤害是否合法,再写 coreHp。防守者不能直接把 coreHp 回满,必须通过请求触发修复、护盾或阶段技能。


PvP 一对多比合作防守更需要旁观规则。

场景推荐处理
INGAME 中迟入默认旁观,下一局再分队
防守者离开P1 严重:暂停、选新防守者,或防守方判负
攻击者离开从攻击方名单移除,比赛继续
RESULT 中加入直接看结算,下一局参与

第一版推荐:防守者离开时安全结束本局,resultReason=RESULT_DEFENDER_LEFT。更复杂的补位会牵涉公平性和角色权限,留给后续迭代。


PvP 里本地预演要更保守。合作 PvE 可以先播预估伤害;PvP 一对多里,攻击者看到「已经打掉核心」但 Owner 拒绝,会产生很强的冲突。

建议规则:按钮、音效、攻击动画可以本地先播;核心受伤数字、核心 HP 条、胜负提示等确认后再播。远端特效可以采样,但核心 HP 必须等同步字段。


挑一条试。

  • 把防守者离开处理改成「自动从旁观者中选新防守者」。需要哪些字段?怎样避免旧防守者的权限残留?
  • 把攻击目标从一个核心改成三个据点。coreHp 会变成什么结构?胜负裁决怎么改?
场景预期实际
1. 开局分队1 名防守者,多名攻击者,旁观者不参与
2. 攻击者打核心请求经 Owner 裁决,coreHp 下降,攻击者贡献增加
3. 核心归零RESULT_ATTACKERS_WIN,结算冻结
4. 时间到RESULT_DEFENDER_WIN,结算冻结
5. 防守者离开按设计安全结束或进入补位流程,不让比赛卡死
6. INGAME 迟入默认旁观,不影响当前胜负
7. 连续重开 3 局matchId 隔离旧局请求,队伍和权限不串局
  • 能说明合作防守和 PvP 一对多共享哪些底层字段
  • 能把 enemyAliveCount 替换成核心目标状态
  • 能写出攻击方和防守方不同的胜利条件
  • 能说明防守者离开为什么是高优先级问题
  • 能指出 PvP 体感预演比 PvE 更保守的原因