Unityメモ – スクリプトからシーンのライトマップ設定をする方法

Posted: 2018年10月25日 カテゴリー: プログラミングメモ, Unity, Unity メモ
タグ:, , , ,

ドーモ、お久しぶりですー。

皆さん複数人で制作している際に、UnityがデフォルトでライトマップのAuto GenerateをONにしている事を伝え忘れて沢山のシーンがライトマップ勝手に作る状態でpushされている経験ありませんか?そしてシーンを開いたらPCが唸り初めたりした事はありませんか??私は勿論ありますよコンチクショー!!

 

自業自得ではありますが、そんな状況に陥った時に手動でやらなくて良いようにスクリプトから自動で設定を変えられないか探してみた所、下記2つのページが見つかったので、メモしておきます:

 

エディター拡張入門:DLLをデコンパイル

https://anchan828.github.io/editor-manual/web/decompile_dll.html

 

Unity Forum – Access Lighting window properties in Script?

https://forum.unity.com/threads/access-lighting-window-properties-in-script.328342/

 

上の方は安定の安藤さんの記事ですねー。ここで欲しい内部API機能の探し方や、リフレクションを使ってのアクセスが紹介されています。2つ目の方はフォーラムの質問で色々のっています。2個目の方でスクリプトが紹介されていますので、それをメモ用に置いておきます。書いてくれたALIyerEdon氏に圧倒的感謝・・・! m_ _m

 

まずはシーンに纏めて処理を行うスクリプトを書きます

using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.SceneManagement;

public static class EditorSceneUtility
{
public static void ApplyToScenesByDirectoryList(string[] directoryList, Action methods)
{
ApplyToScenes(GetSceneFiles(directoryList), methods);
}

public static void ApplyToScenes(string[] pathList, Action methods)
{
var currentScene = EditorSceneManager.GetActiveScene();

foreach (var name in pathList)
{
var scene = EditorSceneManager.OpenScene(name);

methods(scene);

EditorSceneManager.SaveScene(scene);
}

EditorSceneManager.OpenScene(currentScene.path);
}

public static string[] GetSceneFiles(string[] directoryList)
{
return directoryList
.SelectMany(c => Directory.GetFiles(c, "*.unity", SearchOption.AllDirectories))
.Select(c => c.Replace("\\", "/"))
.ToArray();
}
}

次にメインのライトマップ設定を作ります。

using System;
using System.Reflection;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;

public class TurnOffLightmapInAllScenes
{
[MenuItem("Tools/Turnoff Lightmaps")]
static void TurnoffLightmap()
{
var dirList = new[]
{

// ディレクトリ。自分の物に変えたり、外に出したりしてください
"Assets/JK/Scenes",
};

// 適当にまとめてやる

EditorSceneUtility.ApplyToScenesByDirectoryList(dirList, (scene) =>
{
SetBakedGiEnabled(false);
SetFinalGatherEnabled(false);
SetRealtimeLightmaps(false);
SetAutoGenerate(false);
}
);
}

public static void SetAutoGenerate(bool isGenerate)
{
SetBool("m_GIWorkflowMode", !isGenerate);
}

public static void SetBounceIntensity(float val)
{
SetFloat("m_GISettings.m_IndirectOutputScale", val);
}

public static void SetIndirectSamples(int val)
{
SetInt("m_LightmapEditorSettings.m_PVRSampleCount", val);
}

public static void SetDirectSamples(int val)
{
SetInt("m_LightmapEditorSettings.m_PVRDirectSampleCount", val);
}

public static void SetIndirectResolution(float val)
{
SetFloat("m_LightmapEditorSettings.m_Resolution", val);
}

public static void SetAmbientOcclusion(bool val)
{
SetBool("m_LightmapEditorSettings.m_AO", val);
}

public static void SetAmbientOcclusionDirect(float val)
{
SetFloat("m_LightmapEditorSettings.m_CompAOExponentDirect", val);
}

public static void SetAmbientOcclusionIndirect(float val)
{
SetFloat("m_LightmapEditorSettings.m_CompAOExponent", val);
}

public static void SetAmbientOcclusionDistance(float val)
{
SetFloat("m_LightmapEditorSettings.m_AOMaxDistance", val);
}

public static void SetBakedGiEnabled(bool enabled)
{
SetBool("m_GISettings.m_EnableBakedLightmaps", enabled);
}

public static void SetFinalGatherEnabled(bool enabled)
{
SetBool("m_LightmapEditorSettings.m_FinalGather", enabled);
}

public static void SetFinalGatherRayCount(int val)
{
SetInt("m_LightmapEditorSettings.m_FinalGatherRayCount", val);
}

public static void SetRealtimeLightmaps(bool enabled)
{
SetBool("m_GISettings.m_EnableRealtimeLightmaps", enabled);
}

public static void SetFloat(string name, float val)
{
ChangeProperty(name, property => property.floatValue = val);
}

public static void SetInt(string name, int val)
{
ChangeProperty(name, property => property.intValue = val);
}

public static void SetBool(string name, bool val)
{
ChangeProperty(name, property => property.boolValue = val);
}

public static void ChangeProperty(string name, Action changer)
{
var lightmapSettings = getLighmapSettings();
var prop = lightmapSettings.FindProperty(name);
if (prop != null)
{
changer(prop);
lightmapSettings.ApplyModifiedProperties();
}
else Debug.LogError("lighmap property not found: " + name);
}

static SerializedObject getLighmapSettings()
{
var getLightmapSettingsMethod = typeof(LightmapEditorSettings).GetMethod("GetLightmapSettings", BindingFlags.Static | BindingFlags.NonPublic);
var lightmapSettings = getLightmapSettingsMethod.Invoke(null, null) as Object;
return new SerializedObject(lightmapSettings);
}
}

 

これでメニューにToolsが追加され、Turnoff Lightmapsがあるのでそれを選択するとスクリプト内にあるディレクトリにあるシーンファイルを1個づつ開いていき、設定を行っていきます。今回はライトマップ使わない想定で色々切っていますが、必要に応じて設定を行ってください。

 

Unityさんや・・・何時公式で設定変えられる用にしてくれるんや・・・?

 

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中