161 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using UnityEngine;
 | |
| using UnityEditor;
 | |
| using System.IO;
 | |
| using UnityEditor.SceneManagement;
 | |
| using UnityEngine.SceneManagement;
 | |
| using static UnityEditor.Rendering.AnimationClipUpgrader;
 | |
| 
 | |
| internal static class URP2DConverterUtility
 | |
| {
 | |
|     public static bool IsPSB(string path)
 | |
|     {
 | |
|         if (string.IsNullOrEmpty(path))
 | |
|             throw new ArgumentNullException(nameof(path));
 | |
| 
 | |
|         if (path.StartsWith("Packages"))
 | |
|             return false;
 | |
| 
 | |
|         return path.EndsWith(".psb") || path.EndsWith(".psd");
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public static bool IsMaterialPath(string path, string id)
 | |
|     {
 | |
|         if (string.IsNullOrEmpty(path))
 | |
|             throw new ArgumentNullException(nameof(path));
 | |
| 
 | |
|         if (path.StartsWith("Packages"))
 | |
|             return false;
 | |
| 
 | |
|         if (path.EndsWith(".mat"))
 | |
|             return URP2DConverterUtility.DoesFileContainString(path, new string[] { id });
 | |
| 
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public static bool IsPrefabOrScenePath(string path, string[] ids)
 | |
|     {
 | |
|         if (string.IsNullOrEmpty(path))
 | |
|             throw new ArgumentNullException(nameof(path));
 | |
| 
 | |
|         if (path.StartsWith("Packages"))
 | |
|             return false;
 | |
| 
 | |
|         if (path.EndsWith(".prefab", StringComparison.OrdinalIgnoreCase) || path.EndsWith(".unity", StringComparison.OrdinalIgnoreCase))
 | |
|             return URP2DConverterUtility.DoesFileContainString(path, ids);
 | |
| 
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public static bool IsPrefabOrScenePath(string path, string id)
 | |
|     {
 | |
|         return IsPrefabOrScenePath(path, new string[] { id });
 | |
|     }
 | |
| 
 | |
|     public static bool DoesFileContainString(string path, string[] strs)
 | |
|     {
 | |
|         if (strs != null && strs.Length > 0)
 | |
|         {
 | |
|             using (StreamReader file = File.OpenText(path))
 | |
|             {
 | |
|                 string line;
 | |
|                 while ((line = file.ReadLine()) != null)
 | |
|                 {
 | |
|                     for (int i = 0; i < strs.Length; i++)
 | |
|                     {
 | |
|                         if (line.Contains(strs[i]))
 | |
|                             return true;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public static string UpgradePSB(string path)
 | |
|     {
 | |
|         AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate);
 | |
|         return string.Empty;
 | |
|     }
 | |
| 
 | |
|     public static string UpgradePrefab(string path, Action<GameObject> objectUpgrader)
 | |
|     {
 | |
|         UnityEngine.Object[] objects = AssetDatabase.LoadAllAssetsAtPath(path);
 | |
| 
 | |
|         int firstIndex = 0;
 | |
|         for (int i = 0; i < objects.Length; i++)
 | |
|         {
 | |
|             if (objects[i] as GameObject)
 | |
|             {
 | |
|                 firstIndex = i;
 | |
|                 break;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // There should be no need to check this as we have already determined that there is something that needs upgrading
 | |
|         if (!PrefabUtility.IsPartOfImmutablePrefab(objects[firstIndex]))
 | |
|         {
 | |
|             for (int objIndex = 0; objIndex < objects.Length; objIndex++)
 | |
|             {
 | |
|                 GameObject go = objects[objIndex] as GameObject;
 | |
|                 if (go != null)
 | |
|                 {
 | |
|                     objectUpgrader(go);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             GameObject asset = objects[firstIndex] as GameObject;
 | |
|             PrefabUtility.SavePrefabAsset(asset.transform.root.gameObject);
 | |
| 
 | |
|             return string.Empty;
 | |
|         }
 | |
| 
 | |
|         return "Unable to modify an immutable prefab";
 | |
|     }
 | |
| 
 | |
|     public static void UpgradeScene(string path, Action<GameObject> objectUpgrader)
 | |
|     {
 | |
|         Scene scene = new Scene();
 | |
|         bool openedByUser = false;
 | |
|         for (int i = 0; i < SceneManager.sceneCount && !openedByUser; i++)
 | |
|         {
 | |
|             scene = SceneManager.GetSceneAt(i);
 | |
|             if (path == scene.path)
 | |
|                 openedByUser = true;
 | |
|         }
 | |
| 
 | |
|         if (!openedByUser)
 | |
|             scene = EditorSceneManager.OpenScene(path, OpenSceneMode.Additive);
 | |
| 
 | |
|         GameObject[] gameObjects = scene.GetRootGameObjects();
 | |
|         foreach (GameObject go in gameObjects)
 | |
|             objectUpgrader(go);
 | |
| 
 | |
|         EditorSceneManager.SaveScene(scene);
 | |
|         if (!openedByUser)
 | |
|             EditorSceneManager.CloseScene(scene, true);
 | |
|     }
 | |
| 
 | |
|     public static void UpgradeMaterial(string path, Shader oldShader, Shader newShader)
 | |
|     {
 | |
|         Material material = AssetDatabase.LoadAssetAtPath<Material>(path);
 | |
|         if (material.shader == oldShader)
 | |
|             material.shader = newShader;
 | |
| 
 | |
|         GUID guid = AssetDatabase.GUIDFromAssetPath(path);
 | |
|         AssetDatabase.SaveAssetIfDirty(guid);
 | |
|     }
 | |
| 
 | |
|     public static string GetObjectIDString(UnityEngine.Object obj)
 | |
|     {
 | |
|         string guid;
 | |
|         long localId;
 | |
|         if (AssetDatabase.TryGetGUIDAndLocalFileIdentifier(obj.GetInstanceID(), out guid, out localId))
 | |
|             return "fileID: " + localId + ", guid: " + guid;
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| }
 |