开发记录

光照修复、击杀信息校验

本次处理了 `/Game/Maps/csgo` 中两类相互独立的问题:1. 后加入客户端画面偏暗、偏黄,金属武器近乎全黑。2. PIE 或世界销毁阶段,UI 和击杀信息蓝图访问已销毁或不存在的对象。

光照与反射

排查结论

  • PPV_CSGO_FixedExposure 是全局固定曝光,不包含黄色调色覆盖。
  • 客户端日志使用 GI、反射和后处理质量等级 3,不是简单的低画质问题。
  • SkyLight_1 原本使用 Captured Scene,强度较低,且 Lower Hemisphere Is Black=true
  • csgo 原本没有 Reflection Capture Actor。
  • BP_Sky_Sphere 使用 /Engine/EngineSky/M_Sky_Panning_Clouds2,其 bIsSky=false,会触发实时 SkyLight 缺少有效天空输入的提示。

最终地图配置

  • /Game/Maps/csgo 新增 SkyAtmosphere_0
  • 已确认 DirectionalLight_1.LightComponent0.bAtmosphereSunLight=true
  • SkyLight_1 保持 MovableReal Time Capture=true
  • SkyLight_1.intensity=0.6
  • SkyLight_1.bLowerHemisphereIsBlack=false
  • 新增三个 SphereReflectionCapture
    • RC_CSGO_Center:中区,影响半径 1400
    • RC_CSGO_BlueSpawn:蓝方出生区,影响半径 1100
    • RC_CSGO_RedSpawn:红方出生区,影响半径 1100
  • 反射捕获最初改为运行时捕获,但该方案未解决独立客户端表现问题,也不适合当前需要静态构建的工作流。
  • 三个 Capture 的最终配置:bRuntimeCapture=falsemobility=StaticreflectionSourceType=CapturedScene
  • 已移除 Config/DefaultEngine.ini 中临时添加的 [ConsoleVariables] r.ReflectionCapture.Runtime=1

仍需手动验证

  1. 重启 Unreal Editor,使运行时 Capture CVar 的移除生效。
  2. 确认 r.ReflectionCapture.Runtime 返回 0
  3. 打开 csgo,执行 Build > Build Reflection Captures
  4. 保存地图。
  5. 分别用 Listen Server 和 Dedicated Server 测试至少两个客户端,检查后加入客户端色调、金属武器反射,以及反射捕获需要重建的提示是否消失。

CommonUI 世界销毁期 Ensure

报错

csgo 世界正在销毁时仍创建了 CommonUI_C

Ensure condition failed: !World->bIsTearingDown
Widget Class CommonUI_C - Attempting to be created while tearing down the world 'csgo'

根因

/Game/All/ShooterPlayerState.EventGraphBeginPlay 后经过 Delay 0.5 创建 ChatBoardCommonUI,仅判断 Is Dedicated Server。每个客户端上复制过来的 PlayerState 都可能执行这段逻辑;如果延迟执行恢复时世界正在卸载,就会触发 Ensure。

计划中的蓝图修复

  • 断开 ShooterPlayerState.BeginPlay -> Delay 0.5 -> Create Widget 的 UI 创建链。
  • ShooterPlayerState 中添加不复制的 InitializeLocalUICleanupLocalUI 事件。
  • 仅由本地 BP_MyPlayerControllerBegin Playing StateIs Local Controller 成立时创建 UI。
  • 创建前确认 CommonUI 尚未有效,避免重复创建。
  • 在 PlayerController 的 EndPlay 中执行 Remove From Parent 并清空 CommonUIchatUI 引用。

击杀信息 Accessed None

报错

击杀后立即退出房间时,/Game/All/Shooter.EventGraph 在调用 addkillinfo 时将 CallFunc_Array_Get_Item_1 读为 None

根因

all-Die 路径调用 Get All Widgets Of Class(CommonUI) 后无条件访问 FoundWidgets[0]。退出房间时 UI 可能已经移除,数组为空。

当前图表检查结果

当前 Shooter 图表已经在 addkillinfo 前包含以下安全链:

Enemy Is Valid
-> Get All Widgets Of Class(CommonUI)
-> Is Valid Index(FoundWidgets, 0)
-> FoundWidgets[0] Is Valid
-> Killinfo Is Valid
-> addkillinfo

所有无效分支均有意不连接。已检查新增节点,没有蓝图错误标记。检查时 Shooter 仍需要点击 CompileSave;完成后需重新测试“击杀后立即退出房间”。