← 返回项目技术总览

正午(太阳直射处)的松树看起来是一张纸片、没有体积、树底下的斑驳阴影完全没有,地面光秃秃一片亮。树荫处反而正常——这是方向光 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.DynamicGlobalIlluminationMethod1 (Lumen)Lumen GI 开 ✅
r.Lumen.DiffuseIndirect.Allow1Lumen 间接光允许 ✅
r.ContactShadows1接触阴影开 ✅
r.Nanite1Nanite 开 ✅
r.Shadow.Virtual.Enable1虚拟阴影贴图 VSM 开 ✅

第 3 轮:直达灯光组件属性 → 锁根因

Sun/Moon 由关卡 SunMoonDaySequenceActor_0 管理,组件路径:
/Game/_LevelSeting/MMOGameMap_01.MMOGameMap_01:PersistentLevel.SunMoonDaySequenceActor_0.Sun

ObjectTools.get_properties 读 Sun/Moon 关键属性:

属性Sun 值Moon 值判定
castShadowstruetrue总开关开 ✅
castStaticShadowstruetrue静态阴影开 ✅
castDynamicShadowsfalsefalse⚠️ 根因!
intensity1890060正常
castRaytracedShadowUseProjectSetting—跟随项目设置

二、为什么 castDynamicShadows=false 导致纸片化

  1. 松树是 动态植被 Foliage 实例,不是 Static 静态网格;太阳是 Movable 方向光(DaySequence 要跟随时间转动)。
  2. Movable 方向光的动态阴影 完全靠 castDynamicShadows。它=false → 动态植被不投任何影子。
  3. 只有 Static 静态地面能收静态阴影 → 地面有的亮、树影全无,视觉上一片平。
  4. 恰好 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 模板)上同样设置才是永久修复。