开发记录
光照修复、击杀信息校验
本次处理了 `/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保持Movable和Real 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=false、mobility=Static、reflectionSourceType=CapturedScene。 - 已移除
Config/DefaultEngine.ini中临时添加的[ConsoleVariables] r.ReflectionCapture.Runtime=1。
仍需手动验证
- 重启 Unreal Editor,使运行时 Capture CVar 的移除生效。
- 确认
r.ReflectionCapture.Runtime返回0。 - 打开
csgo,执行Build > Build Reflection Captures。 - 保存地图。
- 分别用 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.EventGraph 在 BeginPlay 后经过 Delay 0.5 创建 ChatBoard 和 CommonUI,仅判断 Is Dedicated Server。每个客户端上复制过来的 PlayerState 都可能执行这段逻辑;如果延迟执行恢复时世界正在卸载,就会触发 Ensure。
计划中的蓝图修复
- 断开
ShooterPlayerState.BeginPlay -> Delay 0.5 -> Create Widget的 UI 创建链。 - 在
ShooterPlayerState中添加不复制的InitializeLocalUI和CleanupLocalUI事件。 - 仅由本地
BP_MyPlayerController在Begin Playing State及Is Local Controller成立时创建 UI。 - 创建前确认
CommonUI尚未有效,避免重复创建。 - 在 PlayerController 的
EndPlay中执行Remove From Parent并清空CommonUI、chatUI引用。
击杀信息 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 仍需要点击 Compile 和 Save;完成后需重新测试“击杀后立即退出房间”。