Unityアップデートにより発生する差分を先に全部出すスクリプト
Unityってバージョンをあげても、その時点ではできるだけ差分がでないようにしてくれます。
しかし、その後作業していると「ここの値を1ついじっただけなのに関係ない差分がいっぱい出た!」ってなりがちです。
そうならないように、差分を先に全部出してしまいたい人向けスクリプト。
UnityUpgradeTools.cs
using UnityEditor;
using UnityEditor.SceneManagement;
using System.Linq;
using System.IO;
public static class UnityUpgradeTools
{
[MenuItem("Tools/Unity Upgrade/Force Reserialize")]
public static void Run()
{
var ok = EditorUtility.DisplayDialog(
"Unity Upgrade Tools",
"Unityバージョンアップ差分を出すための重い処理です。\n\n実行しますか?",
"実行",
"キャンセル"
);
if (!ok) return;
ForceLoadAllProjectSettingsAssets();
ReserializeAssets();
SaveAllScenes();
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
UnityEngine.Debug.Log("Complete!");
}
private static void ReserializeAssets()
{
AssetDatabase.StartAssetEditing();
try
{
AssetDatabase.ForceReserializeAssets();
}
finally
{
AssetDatabase.StopAssetEditing();
}
}
private static void SaveAllScenes()
{
var scenes = AssetDatabase.FindAssets("t:Scene", new[] { "Assets" }).Select(AssetDatabase.GUIDToAssetPath);
foreach (var path in scenes)
{
var scene = EditorSceneManager.OpenScene(path);
EditorSceneManager.SaveScene(scene);
}
}
private static void ForceLoadAllProjectSettingsAssets()
{
const string root = "ProjectSettings";
var assetPaths = Directory.GetFiles(root, "*.asset", SearchOption.AllDirectories)
.Select(path => path.Replace('\\', '/'))
.OrderBy(p => p)
.ToArray();
foreach (var path in assetPaths)
{
try
{
var objects = AssetDatabase.LoadAllAssetsAtPath(path);
if (objects == null || objects.Length == 0)
{
UnityEngine.Debug.Log("No assets loaded: " + path);
return;
}
var touchedAny = false;
foreach (var obj in objects)
{
if (obj == null)
{
continue;
}
try
{
var so = new SerializedObject(obj);
// 値は変えずに、ロード+Applyだけ行う
so.Update();
so.ApplyModifiedPropertiesWithoutUndo();
EditorUtility.SetDirty(obj);
touchedAny = true;
}
catch (System.Exception ex)
{
UnityEngine.Debug.LogWarning($"Skip object in {path}: {obj.name} ({obj.GetType().Name}) - {ex.Message}");
}
}
if (touchedAny)
{
UnityEngine.Debug.Log($"Loaded {path}");
}
}
catch (System.Exception ex)
{
UnityEngine.Debug.LogWarning($"Failed to load {path} - {ex.Message}");
}
}
}
}