正午(太阳直射处)的松树看起来是一张纸片、没有体积、树底下的斑驳阴影完全没有,地面光秃秃一片亮。树荫处反而正常——这是方向光 castDynamicShadows=false 的典型症状,Lumen 间接光救不回来。
— 现场现象描述
一、根因定位(排除法三轮)
第 1 轮:误判 Lumen 被关 → 排除
初看 Config/DefaultEngine.ini 里 r.DynamicGlobalIlluminationMethod=0、r.ReflectionMethod=0(= None)。改回 1(Lumen)后重启 PIE 毫无变化。
结论:Lumen 只管间接光柔和度,动态阴影的"有/无"不归它管,归方向光组件的 castDynamicShadows 开关。
第 2 轮:读运行时 CVar → 确认 GI 开了
用 Unreal Editor MCP 8017 的 EditorToolset.EditorAppToolset.SearchCVars 读运行时生效值:
| CVar | 实际值 | 结论 |
|---|---|---|
| r.DynamicGlobalIlluminationMethod | 1 (Lumen) | Lumen GI 开 ✅ |
| r.Lumen.DiffuseIndirect.Allow | 1 | Lumen 间接光允许 ✅ |
| r.ContactShadows | 1 | 接触阴影开 ✅ |
| r.Nanite | 1 | Nanite 开 ✅ |
| r.Shadow.Virtual.Enable | 1 | 虚拟阴影贴图 VSM 开 ✅ |
第 3 轮:直达灯光组件属性 → 锁根因
Sun/Moon 由关卡 SunMoonDaySequenceActor_0 管理,组件路径:
/Game/_LevelSeting/MMOGameMap_01.MMOGameMap_01:PersistentLevel.SunMoonDaySequenceActor_0.Sun
ObjectTools.get_properties 读 Sun/Moon 关键属性:
| 属性 | Sun 值 | Moon 值 | 判定 |
|---|---|---|---|
| castShadows | true | true | 总开关开 ✅ |
| castStaticShadows | true | true | 静态阴影开 ✅ |
| castDynamicShadows | false | false | ⚠️ 根因! |
| intensity | 18900 | 60 | 正常 |
| castRaytracedShadow | UseProjectSetting | — | 跟随项目设置 |
二、为什么 castDynamicShadows=false 导致纸片化
- 松树是 动态植被 Foliage 实例,不是 Static 静态网格;太阳是 Movable 方向光(DaySequence 要跟随时间转动)。
- Movable 方向光的动态阴影 完全靠 castDynamicShadows。它=false → 动态植被不投任何影子。
- 只有 Static 静态地面能收静态阴影 → 地面有的亮、树影全无,视觉上一片平。
- 恰好 VSM 开着,动态影更依赖 castDynamicShadows。
三、修复动作(一次 MCP set + 回读 + 保存)
# Unreal Editor MCP 8017 · Python 调用序列
# 1. set Sun.castDynamicShadows = true
ObjectTools.set_properties(
instance="/Game/_LevelSeting/MMOGameMap_01..."
":PersistentLevel.SunMoonDaySequenceActor_0.Sun",
values={"castDynamicShadows": True})
# 2. set Moon.castDynamicShadows = true(同理)
# 3. 回读验证(必须,set 可能静默失败)
ObjectTools.get_properties(
instance=Sun,
properties=["castDynamicShadows","castStaticShadows"])
# → castDynamicShadows=True ✅
# 4. 保存关卡
AssetTools.save_assets(asset_paths=["/Game/_LevelSeting/MMOGameMap_01"])
**未重启编辑器,直接进 PIE 正午 → 植被恢复正常**:树底有斑驳阴影、植被恢复体积感。
四、以后怎么快速定位同类问题(诊断路径)
# 全在 Unreal Editor MCP 8017 上
1. SceneTools.find_actors(name="SunMoonDaySequence") → 找 Actor refPath
2. ActorTools.get_components(actor) → 列出 Sun / Moon 组件路径
3. ObjectTools.get_properties(instance=Sun,
properties=["castShadows","castStaticShadows","castDynamicShadows","intensity"])
4. castDynamicShadows=false → set true → 回读 → save_assets 关卡
五、可能复发点
本次改的是 关卡实例属性。若日后重启编辑器/PIE 后动态阴影又消失 → Sun/Moon 组件是 DaySequence 插件类的默认子对象,模板值仍为 false,需在 插件类 CDO(组件的 _GEN_VARIABLE 模板)上同样设置才是永久修复。