C#
Unity
Unity拡張

【UnityEditor拡張】LightingウィンドウのAuto Generateをスクリプトでoffにする


はじめに

Lightingウィンドウを開いて手動でGIや影の焼き込みの自動生成をOffにするのが面倒だったので実装しました。

これから紹介するスクリプトは二つあり、一つ目はシーンを新しく追加した時とシーンを開いた時にスクリプトで自動生成の機能をオフにするスクリプトです。

二つ目はすでにプロジェクトにあるシーン全部の自動生成の機能をオフにするスクリプトです。


プログラムその1


EditScene.cs

using System.Collections;

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.SceneManagement;
using UnityEditor.SceneManagement;
//シーンを新しく追加した時とシーンを開いた時にスクリプトで自動生成の機能をオフにするスクリプト
public static class EditScene {
//このスクリプトがコンパイルされたときに呼ばれる関数
[InitializeOnLoadMethod]
private static void OnLoadMethod()
{
//EditorSceneのコールバックに関数を追加
EditorSceneManager.newSceneCreated += OnCreate;
EditorSceneManager.sceneOpening += OnOpening;
EditorSceneManager.sceneOpened += OnOpened;
}
//シーンが新しく作られたときに実行される関数
private static void OnCreate(Scene scene, NewSceneSetup setup, NewSceneMode mode)
{
Lightmapping.bakedGI = false;
Lightmapping.realtimeGI = false;
Lightmapping.giWorkflowMode = Lightmapping.GIWorkflowMode.OnDemand;
}
//シーンを開く直前に実行される関数
private static void OnOpening(string path, OpenSceneMode mode)
{
Lightmapping.bakedGI = false;
Lightmapping.realtimeGI = false;
Lightmapping.giWorkflowMode = Lightmapping.GIWorkflowMode.OnDemand;
}
//シーンを開いた直後に実行される関数
private static void OnOpened(Scene scene, OpenSceneMode mode)
{
Lightmapping.bakedGI = false;
Lightmapping.realtimeGI = false;
Lightmapping.giWorkflowMode = Lightmapping.GIWorkflowMode.OnDemand;
}
}

LightmappingクラスをいじることでLightingウィンドウにも反映されます。

Lightmapping.GIWorkflowMode.OnDemandはAuto Generateのチェックを外し、Generate Lightingボタンが押されたときのみ生成するというモードです。

「bakedGI」「realtimeGI」「giWorkflowMode」は以下の画像の通りの場所の変数です。

キャプチ_ャ.PNG

このスクリプトをプロジェクト内においておけば、自動生成の項目はオフになっています。(多分

次は、すでにプロジェクトにあるシーン全部の自動生成の機能をオフにするスクリプトです。

シーンがたくさんあって一つ一つ開いていくのが面倒な時に役立ちます。


プログラムその2


EditScene.cs

using System.Collections;

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Configuration;
using System.IO;
using System.Text;

//すでにプロジェクトにあるシーン全部の自動生成の機能をオフにするスクリプト
public class GISettingOff{

//デフォルトでオンになっているGI自動生成の文字列
private static string before_bakedLightmaps = "m_EnableBakedLightmaps: 1";
private static string before_realtimeLightmaps = "m_EnableRealtimeLightmaps: 1";
private static string before_GIWorkflowMode = "m_GIWorkflowMode: 0";
//オフにした時のGI自動生成の文字列
private static string after_bakedLightmaps = "m_EnableBakedLightmaps: 0";
private static string after_realtimeLightmaps = "m_EnableRealtimeLightmaps: 0";
private static string after_GIWorkflowMode = "m_GIWorkflowMode: 1";

[MenuItem("Tools/All Scene GI Auto Generate OFF")]
static void Execute()
{
//C:~~\Assetsまでのパスを取得
string currecntDirectory = Application.dataPath;
//書き込みに失敗したシーンの数
int errorNum = 0;
//書き込みに失敗したシーンの名前
string cantOffSceneName = "";
//Assetsフォルダ内のシーンファイル全部取得
string[] sceneFiles = System.IO.Directory.GetFiles(@currecntDirectory, "*.unity",SearchOption.AllDirectories);

for(int i = 0; i < sceneFiles.Length; ++i)
{
//プログレスバー用の進捗率
float progress = (float)i / (float)sceneFiles.Length;

StringBuilder stringBuilder = new StringBuilder();
string[] stringArray = File.ReadAllLines(sceneFiles[i]);
for(int j = 0; j < stringArray.GetLength(0); ++j)
{
//GI自動生成の行があったらオフの文字列に置き換える
if (stringArray[j].Contains(before_bakedLightmaps) == true)
stringBuilder.AppendLine(stringArray[j].Replace(before_bakedLightmaps, after_bakedLightmaps));
else if (stringArray[j].Contains(before_realtimeLightmaps) == true)
stringBuilder.AppendLine(stringArray[j].Replace(before_realtimeLightmaps, after_realtimeLightmaps));
else if (stringArray[j].Contains(before_GIWorkflowMode) == true)
stringBuilder.AppendLine(stringArray[j].Replace(before_GIWorkflowMode, after_GIWorkflowMode));
else
stringBuilder.AppendLine(stringArray[j]);
}

try
{
//シーンファイルを更新
File.WriteAllText(sceneFiles[i], stringBuilder.ToString());
}
catch
{
//更新できなかったら申し訳程度にプログレスバーに表示
cantOffSceneName = sceneFiles[i];
errorNum++;
}
//プログレスバーを表示
string message = i.ToString() + " / " + sceneFiles.Length.ToString() + " 失敗したシーン名: " + cantOffSceneName + "(" + errorNum.ToString() + ")";
EditorUtility.DisplayProgressBar("Auto Generate Off", message, progress);
}
//プログレスバーを閉じる
EditorUtility.ClearProgressBar();
//書き換えたシーンを再読み込み
AssetDatabase.Refresh();
}
}


このスクリプトはシーンファイルをテキストとして開いてGI自動生成のパラメータを置き換えているスクリプトです。

全部のシーンを問答無用でGI自動生成をオフにしているので注意です。

※たまに置き換えがミスってしまうことがあります。(なんでだろう:thinking:

使い方はこんな感じです。

メニューバーの「Tools/All Scene GI Auto Generate OFF」をクリックすると実行されます。

aaa.gif.gif

以上でスクリプトの紹介を終わります。


おわりに

スクリプトその1は実際に業務で使っていて、スクリプトその2はお蔵入りになったやつです。

この記事が誰かの助けになればいいなと思いました。