You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量修改多场景游戏项目中的灯光设置?

嘿,这种重复改场景灯光的痛苦我太懂了——手动挨个调整不仅浪费时间,还容易漏改!下面给你几个不同游戏引擎通用的解决方案,你可以根据自己用的工具来选:

批量修改所有场景灯光的实用方法

一、编写编辑器脚本自动化处理(最通用高效)

几乎所有主流游戏引擎都支持用脚本编写编辑器工具,批量遍历并修改场景里的灯光参数。这里给两个常见引擎的示例:

Unity 编辑器脚本示例

把下面的脚本放在项目的Editor文件夹下(没有的话新建一个),然后在Unity顶部菜单栏的Tools里就能找到批量更新的入口:

using UnityEditor;
using UnityEngine;
using System.IO;
using UnityEditor.SceneManagement;

public class BatchLightUpdater : EditorWindow
{
    [MenuItem("Tools/Batch Update All Lights")]
    public static void OpenToolWindow()
    {
        GetWindow<BatchLightUpdater>("批量灯光更新");
    }

    private float targetIntensity = 1.2f;
    private Color targetColor = new Color(0.95f, 0.9f, 0.85f);
    private bool updateShadows = true;
    private LightShadows targetShadowType = LightShadows.Soft;

    private void OnGUI()
    {
        GUILayout.Label("设置目标灯光参数", EditorStyles.boldLabel);
        targetIntensity = EditorGUILayout.FloatField("灯光强度", targetIntensity);
        targetColor = EditorGUILayout.ColorField("灯光颜色", targetColor);
        updateShadows = EditorGUILayout.Toggle("更新阴影设置", updateShadows);
        if (updateShadows)
        {
            targetShadowType = (LightShadows)EditorGUILayout.EnumPopup("阴影类型", targetShadowType);
        }

        if (GUILayout.Button("开始批量更新所有场景", GUILayout.Height(30)))
        {
            // 遍历项目中所有.unity场景文件
            string[] allScenePaths = Directory.GetFiles(Application.dataPath, "*.unity", SearchOption.AllDirectories);
            
            foreach (string fullPath in allScenePaths)
            {
                // 转换为Unity资源路径格式
                string assetPath = "Assets" + fullPath.Substring(Application.dataPath.Length);
                // 以附加模式打开场景
                Scene targetScene = EditorSceneManager.OpenScene(assetPath, OpenSceneMode.Additive);
                
                // 查找场景中所有灯光组件
                Light[] allLights = FindObjectsOfType<Light>(true);
                foreach (Light light in allLights)
                {
                    light.intensity = targetIntensity;
                    light.color = targetColor;
                    if (updateShadows)
                    {
                        light.shadows = targetShadowType;
                    }
                    // 标记对象为已修改,确保保存生效
                    EditorUtility.SetDirty(light.gameObject);
                }
                
                // 保存并关闭场景
                EditorSceneManager.SaveScene(targetScene);
                EditorSceneManager.CloseScene(targetScene, true);
                Debug.Log($"已完成场景更新:{assetPath}");
            }
            
            Debug.Log("所有场景灯光参数更新完成!");
        }
    }
}

Unreal Engine Python脚本示例

把下面的脚本放到Unreal的Content/Scripts目录下,然后在编辑器的Window > Developer Tools > Python Scripts里运行:

import unreal

def batch_modify_lights():
    # 定义要修改的参数
    target_intensity = 1800.0
    target_color = unreal.LinearColor(0.92f, 0.88f, 0.82f, 1.0f)
    target_cast_shadows = True

    # 获取项目中所有关卡文件
    level_paths = unreal.EditorLoadingAndSavingUtils.get_all_levels()
    
    for level_path in level_paths:
        # 加载关卡
        level = unreal.EditorLevelLibrary.load_level(level_path)
        if not level:
            unreal.log_warning(f"无法加载关卡:{level_path}")
            continue
        
        # 查找所有类型的灯光Actor(可以按需过滤,比如只改DirectionalLight)
        light_classes = [unreal.DirectionalLight, unreal.PointLight, unreal.SpotLight]
        for light_class in light_classes:
            light_actors = unreal.EditorLevelLibrary.get_all_level_actors_of_class(light_class)
            for actor in light_actors:
                light_comp = actor.get_component_by_class(unreal.LightComponent)
                if light_comp:
                    light_comp.set_editor_property("intensity", target_intensity)
                    light_comp.set_editor_property("light_color", target_color)
                    light_comp.set_editor_property("cast_shadows", target_cast_shadows)
                    # 标记Actor为已修改
                    unreal.EditorLevelLibrary.mark_level_actor_as_modified(actor)
        
        # 保存关卡
        unreal.EditorLoadingAndSavingUtils.save_level(level_path)
        unreal.log(f"已更新关卡:{level_path}")

batch_modify_lights()

二、用预设(Prefab)统一管理灯光

如果你的灯光是基于预设创建的,那修改起来更省心:

  • 直接修改灯光预设的参数,所有引用该预设的灯光实例会自动同步更新(只要没断开预设连接)。
  • 如果之前的灯光不是用预设做的,可以先把一个调好参数的灯光存为预设,然后用编辑器的批量替换Actor功能,把所有场景里的灯光替换成这个预设的实例——Unity和Unreal都支持这个功能。

三、场景模板化(预防未来重复工作)

如果后续还要新建场景,建议把灯光设置做成场景模板或母场景:

  • Unity可以用Scene Template功能,新建场景时基于模板创建,后续修改模板场景的灯光,所有派生场景都会同步。
  • Unreal可以使用关卡继承,把灯光放在父关卡里,子关卡继承父关卡的内容,改父关卡的灯光就能同步所有子关卡。

内容的提问来源于stack exchange,提问作者secondbreakfast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:46:12